2014-04-14 87 views
1

我在學習PHP,特別是如何保護php表單。檢查表單是否已提交的最佳方式(php)

我讀了題爲「Sanitize and Validate Data with PHP Filters」,其中,如果形式使用下面的代碼提交筆者檢查了一篇文章:

if (isset($_POST['Submit'])) { 
    // do something... 
} 

哪些工作,但我讀過的最好用的輸入過濾器(即filter_input)。

其次,使用filter_input也將從嘮叨我,而不是「訪問直接超全局變量$ _POST陣列」

因此,停止的NetBeans我寫了下面:

function is_form_submit() { 
    $request = filter_input(INPUT_SERVER, "REQUEST_METHOD"); 
    return $request === 'POST' ? true : false; 
} 

哪位能像這樣被使用:

if (is_form_submit()) { 
    // do something... 
} 

所以我的問題是:沒有我的代碼實現同樣的事情?如果不是,爲什麼不。請指教。

+1

'isset($ _ POST [ '提交'])的類型的影響'只有工作,如果你有一個名爲'輸入元素 「提交」 '而$ _SERVER ['REQUEST_METHOD'] ==='POST'是更通用的解決方案。要特別檢查表單提交,你可以檢查內容類型是'application/x-www-form-urlencoded'還是'multipart/form-data' –

+3

...'return $ request ==='POST' ? true:false;'==='return $ request ==='POST';' – dave

+0

你也可以簡單地檢查'if(!empty($ _ POST))',通常我用來檢查提交的值 –

回答

1

雖然您的代碼在大多數情況下會達到相同的結果,但它與isset調用不同。

你的代碼的作用是檢查REQUEST_METHOD是否爲POST。也就是說,它會檢查用戶是否發出POST請求來訪問當前頁面。

isset的功能是檢查名稱爲Submit的東西是否通過POST發送。當您的提交按鈕爲<input name="Submit" type="submit" value="Submit" />時,通常會發生這種情況,因爲單擊該按鈕(或在文本字段中按回車鍵並且它是第一個提交按鈕)將導致設置$_POST['Submit']

要查看不同的行爲,請將curl -X POST your-url.com/page.phpcurl -F Submit=submit your-url.com/page.php的結果進行比較。

+0

我在頁面上用表單運行了兩個命令。他們都加載了頁面。我應該看到什麼? – sleeper

+0

我將此標記爲答案,因爲這對我來說是最清楚的答案。然而,我仍然沒有通過運行你發佈的curl命令來得到我「應該」看到的東西。 – sleeper

+0

如果僅使用'isset'檢查,那麼第一個命令將不起作用,而第二個命令將會起作用。如果你使用'filter_input'檢查,那麼兩者都可以工作。 –

1

filter_input是未觸動的用戶輸入。

某些腳本直接添加/修改$ _POST和$ _GET。如果你的代碼是安全的,那麼很好,但是如果操作的鍵/值出現問題,可能會出現錯誤。

filter_input(INPUT_POST, 'requiredID') 

不會被編碼下面

$_POST['requiredID'] = brokenFunction($_POST['requiredID']);