确保get/post参数不会带来任何安全漏洞的最有效方法是什么?
我熟悉用于javascript代码注入预防的htmlentities和用于防止sql注入的地址斜杠。
所以..。现在,我在每个get/post参数上都使用了这两个参数。
有没有其他函数可以用来更好地防止这些漏洞,或者是否有任何其他安全问题,我应该担心与我的php代码有关?
发布于 2009-11-08 19:49:08
htmlentities (或htmlspecialchars)和addslashes (或mysql_real_escape_string或其他适合数据库的转义函数;加斜杠总是错误的)与GET/POST参数无关。它们是输出转义函数,其输入可能来自参数,但也可能同样来自其他地方,例如静态字符串或从数据库获取的字符串。
现在我在每个get/post参数上都使用了它们。
不,那不管用。这是一个常见的错误,而且有很多非常糟糕的PHP教程材料延续了这个错误。尝试将字符串转义问题拆分到一个小循环中,而不是分散到整个代码中,这听起来很好,但实际上字符串转义并不是这样工作的。每次将一个字符串放入另一个字符串中时,您需要应用正确的转义形式,并且只应用正确的转义形式。你不能提前做到这一点。
不要试图“清理”或“过滤”所有传入参数来编码或删除诸如\或<之类的字符。这将导致您的应用程序被像\\\\\\\\\\\\\\\\\\\\\\\\\\和&amp;amp;amp;amp;amp;amp;这样的垃圾填满。相反,在将它们转换为不同的文本上下文时,您应该只将它们与其他任何不是来自GET/POST - 的变量一起编码,如用于HTML的htmlspecialchars或用于MySQL字符串文字的mysql_real_escape_string。不过,使用参数化查询通常会更好,这样可以避免SQL转义问题。
这并不是说您不应该检查传入数据是否符合应用程序的要求。如果你有一个你想要得到一个整数的字段,在使用它之前一定要intval它。如果您得到的是不包含换行符的纯单行文本字符串,请确保过滤掉字符串中的\n字符以及所有其他控制字符[\x00-\x1F\x7F]。但这些都是应用程序的需求,并不是您必须在所有输入中运行的东西。
发布于 2009-11-08 19:44:12
GET和POST变量并不比任何其他变量更危险。您应该在使用点处理注入漏洞,而不是在输入点。请看我的回答:
发布于 2009-11-08 18:37:49
您可以将数据筛选用作数据防火墙。
http://www.php.net/filter
https://stackoverflow.com/questions/1695973
复制相似问题