2014-04-14 64 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']);