Htmlentities vs addslashes vs mysqli_real_escape_string

时间:2010-02-06 18:43:13

标签: php security mysql-real-escape-string addslashes

我一直在阅读有关保护PHP应用程序的一些内容,在我看来mysqli_real_escape_string是在将数据插入MySQL表时使用的正确函数,因为addslashes会导致一些奇怪的事情发生发生在智能攻击者身上。正确?

然而,有一件事令我困惑。我似乎记得在将用户输入的数据回复给用户以保护其数据时,addslashes被告知htmlentities优于addslashes,但似乎{{1}}是具有此漏洞的数据。这是真的,还是我记错了?

7 个答案:

答案 0 :(得分:12)

它们是用于不同目的的不同工具。

mysqli_real_escape_string使数据安全插入MySQL(但参数化查询更好)。

Htmlentities使输出到HTML文档的数据安全

addslashes使数据在其他一些情况下是安全的,但对MySQL来说是不够的

答案 1 :(得分:5)

您的数据有不同的上下文。将数据插入数据库的上下文需要以与呈现html / xml甚至电子邮件消息的上下文不同的方式进行转义。

在所有新代码中都应该弃用转移到数据库中的数据,而不是使用预准备语句。任何告诉你的人都会给你一个很大的伤害。

转发到浏览器的数据需要以多种不同的方式进行转义,具体取决于目标。有时htmlspecialchars就足够了,有时你需要使用htmlentities。有时您需要数字实体。这是一个你应该做一些研究以了解所有细微差别的话题。

我所遵循的一般规则是验证(不过滤,拒绝,如果不正确)输入&转义输出(基于上下文)。

答案 2 :(得分:0)

如果你可以在服务器上使用PHP5,你也可以使用PDO libs来完成大部分的转义。

回声回来我个人更喜欢htmlspecialchars,但有人可能会纠正我

答案 3 :(得分:0)

是的,在所有用户输入上使用mysqli_real_escape_string或类似PDO的库。当回显时,我使用带有ENT_QUOTES的htmlentities作为第二个参数,因为它将所有适用的字符转义为它们的html实体,包括引号。

答案 4 :(得分:0)

注意:应避免在UTF-8编码文档中使用htmlentities()。见:

注意(引自phpwact.org):

  

使用现代网络浏览器和宽带   支持UTF-8,您不需要   所有这些都是因为这些因素   字符可以直接表示   在UTF-8中。更重要的是,在   一般来说,只有浏览器支持HTML   特殊字符 - 普通文本   例如,编辑不知道   HTML实体。取决于什么   你正在做,使用htmlentities可能   降低其他系统的能力   “消费”你的内容。

     

另外(未确认,但声音   合理 - 来自此处的评论),   字符实体(像»或 - )   在提供文档时不起作用   作为application / xml + xhtml(除非你   定义它们)。你仍然可以逃脱   但是使用数字形式。

答案 5 :(得分:0)

PHP 5.2及更高版本的另一个有趣解决方案是使用过滤扩展名:http://www.php.net/manual/en/book.filter.php

它允许您验证和清理用户输入。有许多可用的内置过滤器,它们可以与标志组合以调整其行为。 此外,hese过滤器还可用于验证/清理整数,浮点数,电子邮件,特定正则表达式。

我个人已经开始在我的项目中使用它们来验证表单并输出用户输入的数据,我很高兴我做到了。虽然,当我在MySQL数据库中插入值时,我使用准备好的查询来增加安全性。这些解决方案可以帮助避免大多数SQL注入和XSS类型的攻击。<​​/ p>

答案 6 :(得分:0)

你不能拥有一个“逃避”功能,并希望它能够一直工作。有不同的攻击需要特定的卫生程序。理解这个概念的唯一方法是编写一些易受攻击的代码然后利用它。编写漏洞利用代码对于理解任何安全系统至关重要。

例如,此查询易受Sql注入攻击:

$host=htmlspecialchars($_GET[host],ENT_QUOTES);
$name=htmlspecialchars($_GET[name],ENT_QUOTES);
mysql_query("select * from user where Host='$host' and Name='$name' ");

利用漏洞: http://localhost/sqli_test.php?host= \&安培;名称=%20sleep(20) - 201%

mysql的最佳转义函数是mysqli_real_escape_string(),但这可能会失败:

mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));

利用: http://localhost/sqli_test.php?id=1%20or%20sleep(20)

实际上,处理sql注入的最好方法是不调用转义函数,它使用ADODB的参数化quires进行sql注入。使用htmlspecialcahrs($ var,ENT_QUTOES)进行XSS。阅读OWASP top 10,因为Web应用程序安全性可能会出现问题。