确保get / post参数不会提供任何安全漏洞的最有效方法是什么。
我是javascript代码注入预防的家庭成员 和addslashes以防止sql注入。
所以..现在我在每个get / post参数上都使用它们。
我可以使用任何其他功能来更好地防止这些漏洞,还是有任何其他我担心与我的PHP代码相关的安全问题?
答案 0 :(得分:5)
htmlentities
(或htmlspecialchars
)和addslashes
(或mysql_real_escape_string
或其他适合数据库的转义函数; addslashes总是错误的)与GET无关/ POST参数。它们是传出转义函数,其输入可能来自参数,但可能同样来自其他地方,例如静态字符串或从数据库中提取的字符串。
现在我在每个get / post参数上都使用它们。
不,这不起作用。这是一个常见的错误,其中一个错误就是很多非常糟糕的PHP教程材料。试图将字符串转义的问题分解为一个小循环而不是遍布整个代码听起来不错,但字符串转义不像现实中的那样。每次将字符串放入另一个字符串中时,您需要应用正确的转义形式,并且只能使用正确的转义形式。你不能提前做到这一点。
请勿尝试“清理”或“过滤”所有传入参数,以对\
或<
等字符进行编码或删除。这将导致您的应用程序填满\\\\\\\\\\\\\\\\\\\\\\\\\\
和&amp;amp;amp;amp;amp;amp;
等垃圾。相反,您应该只对它们进行编码 - 以及其他任何不是来自GET / POST的变量 - 在最后一分钟将它们分配到不同的文本上下文时,例如HTML htmlspecialchars
或mysql_real_escape_string
对于MySQL字符串文字。但通常情况下,参数化查询会更好,这可以避免SQL转义问题。
这并不是说您不应该检查传入的数据是否符合您的应用程序的要求。如果你有一个字段,你希望得到一个整数,在使用之前一定要intval
。如果您有一个简单的单行文本字符串,但您不希望包含换行符,请务必过滤字符串中的\n
字符以及所有其他控制字符[\x00-\x1F\x7F]
。但这些是应用程序要求,而不是您必须在所有输入中运行的东西。
答案 1 :(得分:4)
GET和POST变量并不比任何其他变量更危险。您应该在使用点处理注入漏洞,而不是在输入点处理注入漏洞。请在此处查看我的回答:
答案 2 :(得分:1)
您可以将数据过滤用作数据防火墙。
答案 3 :(得分:1)
GET / POST是公共的,因此主要的安全问题是不传递敏感信息(即放弃目录结构或数据库模式的键和值)。还要记住,任何人都可以操作或创建自己的HTTP请求,因此请确保在将数据插入数据库之前验证数据。除此之外,他们不会对自己造成任何威胁,因为在你对它们采取行动之前它们没有任何影响。
答案 4 :(得分:1)
如果您正在寻找一种简单快速的解决方案,可以防止一般安全漏洞,我可以命名以下功能。 htmlentities(),strip_tags()和addSlashes()如果get_magic_quotes_gpc()返回FALSE
另一方面,如果您想加强安全性,请查看Kristoffer BOhmann提到的数据过滤
答案 5 :(得分:1)
已经有很多好的答案,根据你的经验,你应该:
magic_quotes_gpc
这只是防止最常见漏洞的最低限度。
答案 6 :(得分:1)
这是如何使用Addslashes或Mysql_real_escape_string()的示例:http://zacklive.com/addslashes-or-mysql-real-escape-string-stop-sql-injection/906/