2015-12-30 49 views
0

考虑以下代码:PHP - 当过滤用户输入

// 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); 

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

+0

您应该*总是*过滤用户输入。永远不要相信他们的输入。请使用PHP的[内置函数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用'password_hash()'[兼容包](https://github.com/ircmaxell/password_compat)。 –

+1

对于SQL查询,您应该了解[PDO](http://php.net/manual/en/pdo.prepared-statements)的[prepared](http://en.wikipedia.org/wiki/Prepared_statement)语句。 php)和[MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php),并考虑使用PDO,[这真的很简单](http://jayblanchard.net/demystifying_php_pdo的.html)。 –

+0

它不是正确的问题要求在stackoverflow,请删除它 –

回答

0

这种力量给你一个更好的理解输入验证:

输入验证两者最根本的防御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