PHP - 何时过滤用户输入

时间:2015-12-30 15:04:59

标签: php user-input

考虑以下代码:

// store the $name into a database
$name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);

// already encrypted password (client-side) and will be salted or hashed again to store it into DB
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);

// just to check if the $lang is on the $language array i.e. in_array($lang, $language)
$lang = filter_input(INPUT_POST, 'language', FILTER_SANITIZE_STRING);

// just to echo something
$sth = filter_input(INPUT_POST, 'sth', FILTER_SANITIZE_STRING);

这里我试着描述一些情况。在每种情况下,我都过滤了用户输入(在某些情况下,没有必要)。我的问题是何时过滤用户输入,因为似乎并不总是需要过滤用户输入。

1 个答案:

答案 0 :(得分:1)

这可能会让您更好地理解输入验证:

输入验证既是Web应用程序所依赖的最基本的防御,也是最不可靠的防御。绝大多数Web应用程序漏洞都是由验证失败引起的,因此正确使用这部分防御是至关重要的。即使我们看起来已经把它弄下来了,我们也需要对以下几点考虑做好准备。

在实施自定义验证程序或采用第三方验证库时,您应牢记这些。对于第三方验证器,还要考虑这些通常是通用的,并且很可能省略Web应用程序所需的关键特定验证例程。与任何面向安全的库一样,请务必亲自查看首选库以查找缺陷和限制。同样值得注意的是,PHP并没有超越一些奇怪的不安全行为。请考虑PHP的过滤器函数中的以下示例:

filter_var('php://', FILTER_VALIDATE_URL);

上面的示例没有问题地通过过滤器。接受php:// URL的问题在于它可以传递给PHP函数,这些函数希望检索远程HTTP URL而不是从执行PHP返回数据(通过PHP包装器)。上面的缺陷是过滤器选项没有限制允许的URI方案的方法,用户希望这是http,https或mailto之一,而不是一些通用的PHP特定URI。这是我们应该不惜一切代价避免的通用验证方法。

详情请见http://phpsecurity.readthedocs.org/en/latest/Input-Validation.html