PHP安全问题

5

今天过得很漫长,但我似乎无法在自己的脑海中选择哪个更好,或者是否应该同时使用两个。

基本上,我应该使用什么来清理用户输入的值。是 htmlentities 还是 preg_match 函数?

如果值进入 SQL 查询,我将使用 mysql_real_escape_string 函数,但只有在我将其更改为预处理语句后才能删除此函数。

还是使用 htmlentities 和 preg_match 两个函数都是一个好主意?


这取决于您打算如何处理这些数据。 - Gumbo
htmlentities() 用于清理 输出 值 ;-) - Álvaro González
4个回答

4

为什么你不在你之前的问题中询问呢?

在进行任何转义之前,请使用preg_match来确保数据符合您所期望的白名单。然后再使用适用于数据库插入的转义。这被称为深度防御(即多层安全检查,以防攻击者能够突破第一层)。


好吧,我只是出于好奇问了一个普通的问题。 - Oliver Bayes-Shelton
我刚刚更新了我的答案,使其更加清晰。您可以使用这两种方法来提供深度防御。增加更多的层可以使您的应用程序更难被利用。 - Mike
1
如果层是冗余的,那么它并不会使问题更加困难。它仍然是同样难度级别的问题。 - rook
你说得对,层次需要不同才能发挥作用。这里我们有数据库层和展示层。两者都有不同的优点和缺点。htmlentities 用于显示输出 - 最有可能是来自数据库的输出。白名单(preg_match)用于确保坏输入永远不会进入数据库。如果有人使用恶意输入破坏了您的数据库(或由于某种原因您的正则表达式存在漏洞),您仍将通过 htmlentities 获得一定程度的 XSS 保护,反之亦然。 - Mike

1

0

比起太少,有太多验证检查和净化例程更好。通过添加冗余,系统的安全性不会增加或减少。它是一个布尔值而不是浮点数,要么就存在漏洞,要么不存在。当我审计代码时,如果我看到冗余的安全措施,我会把它视为一个红色警示,并且这激励我去深入挖掘。这位程序员有点过于多虑,或许他们并不理解漏洞的本质,尽管这并非总是如此。

还有另一个问题。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。


0
基本上,我应该使用什么来清理用户输入的值呢?是 htmlentities 还是 preg_match 函数?
肯定不是 htmlentities,可能也不是 preg_match(出于安全考虑)。你需要将任何输出的表示方式更改为它要去的媒介(对于网页可以用 htmlentities,对于 URL 可以用 urlencode,对于 MySQL 数据库可以用 mysql_real_escape_string...)。
如果有人真的想在你的应用程序上注册为 dummy' UNION SELECT 'dummy' AS user,'dummy' AS password FROM DUAL,那就让他们去吧!
编写代码以防范攻击比事先检测不同类型的攻击要有效得多。
某些数据输入可能需要符合特定的格式才能发挥作用,而且在数据捕获和使用数据之间可能会有延迟,例如,如果要求用户输入电子邮件地址或日期,则可以使用 preg_match。但这与安全无关。
C.

preg_match与安全有着千丝万缕的联系!如果您允许不符合人名规范的字符进入姓名字段,那么您就为XSS、数据注入(SQL或LDAP!)等问题打开了一扇大门... - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接