今天过得很漫长,但我似乎无法在自己的脑海中选择哪个更好,或者是否应该同时使用两个。
基本上,我应该使用什么来清理用户输入的值。是 htmlentities 还是 preg_match 函数?
如果值进入 SQL 查询,我将使用 mysql_real_escape_string 函数,但只有在我将其更改为预处理语句后才能删除此函数。
还是使用 htmlentities 和 preg_match 两个函数都是一个好主意?
今天过得很漫长,但我似乎无法在自己的脑海中选择哪个更好,或者是否应该同时使用两个。
基本上,我应该使用什么来清理用户输入的值。是 htmlentities 还是 preg_match 函数?
如果值进入 SQL 查询,我将使用 mysql_real_escape_string 函数,但只有在我将其更改为预处理语句后才能删除此函数。
还是使用 htmlentities 和 preg_match 两个函数都是一个好主意?
为什么你不在你之前的问题中询问呢?
在进行任何转义之前,请使用preg_match来确保数据符合您所期望的白名单。然后再使用适用于数据库插入的转义。这被称为深度防御(即多层安全检查,以防攻击者能够突破第一层)。
比起太少,有太多验证检查和净化例程更好。通过添加冗余,系统的安全性不会增加或减少。它是一个布尔值而不是浮点数,要么就存在漏洞,要么不存在。当我审计代码时,如果我看到冗余的安全措施,我会把它视为一个红色警示,并且这激励我去深入挖掘。这位程序员有点过于多虑,或许他们并不理解漏洞的本质,尽管这并非总是如此。
还有另一个问题。htmlentities()并不能总是防止xss攻击,例如,如果输出在<script></script>
标签或者甚至一个href中呢?mysql_real_escape_string并不能总是防止SQL注入攻击,例如:'select * from user where id='.mysql_real_escape_string($_GET[id]);
。preg_match 可以 解决这个问题,但是intval()函数在这种情况下使用更好。
我是预处理语句的超级粉丝。我认为这是一种绝佳的方法,因为默认情况下它是安全的,但在使用预处理语句之前将变量传递给mysql_real_escape_string()只会破坏数据。我曾经看到一个新手通过删除所有验证程序来解决这个问题,从而引入了漏洞,因为存在冗余。因果关系。
Web应用程序防火墙(WAF)是如何提高安全性的绝佳示例。WAF高度依赖于正则表达式。它们试图从更大的角度来查看并防止恶意输入,或者至少记录它。它们绝不是万能的,不应该是您使用的唯一安全措施,但它们确实可以阻止一些攻击,并建议在生产机器上安装mod_security。