我正在学习PHP,特别是如何保护php表单。
我正在阅读一篇名为" Sanitize and Validate Data with PHP Filters"其中作者使用以下代码检查表单是否已提交:
if (isset($_POST['Submit'])) {
// do something...
}
哪种方法有效,但我已经知道最好使用输入过滤器(即filter_input)。
其次,使用filter_input也会阻止netbeans唠叨我没有"直接访问超全球$ _POST数组"
所以我写了以下内容:
function is_form_submit() {
$request = filter_input(INPUT_SERVER, "REQUEST_METHOD");
return $request === 'POST' ? true : false;
}
可以这样使用:
if ( is_form_submit() ) {
// do something...
}
所以我的问题是:我的代码没有达到同样的效果吗?如果没有,为什么不呢?请指教。
答案 0 :(得分: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.php
与curl -F Submit=submit your-url.com/page.php
的结果进行比较。
答案 1 :(得分:1)
filter_input是未触及的用户输入。
有些脚本直接添加/修改$ _POST和$ _GET。如果您的代码是故障安全的,那很好,但是如果操作的键/值出现问题,则可能存在错误。
filter_input( INPUT_POST, 'requiredID' )
不受下面编码类型的影响
$_POST['requiredID'] = brokenFunction( $_POST['requiredID'] );