PHP-何时过滤用户输入


PHP - When to filter 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);

在这里,我试图描述一些情况。在每种情况下,我都会过滤用户输入(在某些情况下,这是不必要的)。我的问题是什么时候过滤用户输入,因为过滤用户输入似乎并不总是必要的。

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

输入验证既是web应用程序所依赖的最基本的防御手段,也是最不可靠的防御手段。绝大多数web应用程序漏洞都是由验证失败引起的,因此正确防御这一部分至关重要。即使在我们似乎已经把它放下的地方,我们也需要注意以下几点。

无论何时实现自定义验证器或采用第三方验证库,都应该记住这些。当涉及到第三方验证器时,还要考虑到这些验证器往往是通用的,很可能会省略web应用程序所需的关键特定验证例程。与任何面向安全的库一样,一定要亲自检查您喜欢的库是否存在缺陷和限制。同样值得记住的是,PHP并没有超越一些奇怪的、可以说是不安全的行为。考虑以下PHP过滤函数的示例:


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

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

更多详细信息,请访问:http://phpsecurity.readthedocs.org/en/latest/Input-Validation.html