我是否需要在预准备语句中使用htmlentities()或htmlspecialchars()?

时间:2009-08-02 16:06:47

标签: php mysql

在文章http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html中,它说明了以下内容:

  

在您的应用程序中使用预准备语句有很多优点,包括 安全性 和性能原因。

     

预备语句可以通过将SQL逻辑与提供的数据分开来帮助提高安全性。逻辑和数据的这种分离有助于防止称为SQL注入攻击的非常常见的漏洞类型。

     

通常,当您处理即席查询时,在处理从用户收到的数据时需要非常小心。 这需要使用能够逃避所有必要的故障字符的函数,例如单引号,双引号和反斜杠字符。

     

处理预准备好的陈述时,这是不必要的 。数据的分离允许MySQL自动考虑这些字符,并且不需要使用任何特殊功能进行转义。

这是否意味着我不需要htmlentities()htmlspecialchars()? 但我想我需要将strip_tags()添加到用户输入数据中? 我是对的吗?

5 个答案:

答案 0 :(得分:14)

htmlentitieshtmlspecialchars用于生成发送到浏览器的 HTML输出

预备语句用于生成/发送数据库引擎的查询。

两者都允许逃避数据;但他们并没有因为同样的用途而逃避 所以,不,预备语句(对于SQL查询)不会阻止您正确使用htmlspecialchars / htmlentities (用于HTML生成) < / p>

关于strip_tags:它会从字符串中删除标记,其中htmlspecialchars会将其转换为HTML实体。
这两个功能不做同样的事情;你应该根据你的需要/你想要的来选择使用哪一个。

例如,使用这段代码:

$str = 'this is a <strong>test</strong>';
var_dump(strip_tags($str));
var_dump(htmlspecialchars($str));

你会得到这种输出:

string 'this is a test' (length=14)
string 'this is a &lt;strong&gt;test&lt;/strong&gt;' (length=43)

在第一种情况下,没有标签;在第二个,正确逃脱的。

并且,使用HTML输出:

$str = 'this is a <strong>test</strong>';
echo strip_tags($str);
echo '<br />';
echo htmlspecialchars($str);

你会得到:

this is a test
this is a <strong>test</strong>

你想要哪一个? 是重要的问题; - )

答案 1 :(得分:8)

htmlspecialchars()没有任何变化,因为那是针对HTML的,而不是SQL。您仍然需要正确地转义HTML,并且最好在实际生成HTML时执行此操作,而不是以某种方式将其绑定到数据库。

如果您使用预准备语句,那么您不再需要mysql_[real_]escape_string()(假设您坚持使用预先准备好的语句的占位符,并且抵制使用字符串操作绕过它的诱惑)。

如果你想摆脱htmlspecialchars(),那么有一些HTML模板引擎可以与SQL中的预处理语句类似地工作,并使你免于手动转义所有内容,例如PHPTAL

答案 2 :(得分:7)

在数据库中插入东西时,你不需要htmlentities()或htmlspecialchars(),没有什么不好的事情,如果你正在使用预准备语句,你将不会受到SQL注入攻击。 好消息是,您现在将原始用户输入存储在数据库中。

你需要在输出上转义并将其发送回客户端, - 当你从数据库中取出东西时,你将容易受到跨站点脚本攻击和其他坏事的攻击。你需要为你需要的输出格式转义它们,比如html,所以你仍然需要htmlentities等。

出于这个原因,你可以在将它们放入数据库时​​转义,而不是在输出它时 - 但是你将丢失用户的原始格式,并且你将转义数据以供html使用,这可能不会如果您使用不同输出格式的数据,您将获得回报。

答案 3 :(得分:0)

准备进行SQL注入 htmlspecialchar 用于XSS(重定向到另一个链接)

<?php

$str = "this is <script> document.location.href='https://www.google.com';</script>";
echo $str;

输出:这是...并重定向到google.com

使用 htmlspecialchars :     

$str = "this is <script> document.location.href='https://www.google.com';</script>";
echo htmlspecialchars($str);

<i>output1</i>: this is <script> document.location.href='https://www.google.com';</script> (in output browser)<br />
<i>output2</i>: this is &lt;script&gt; document.location.href='https://www.google.com';&lt;/script&gt; (in view source)<br />
  

如果用户输入注释“脚本”进入数据库,则浏览器显示   所有来自数据库的评论,自动“脚本”将执行和   重定向到google.com

所以,
1.将htmlspecial用于deactive bad script tag
2.使用准备安全数据库

htmlspecialchars
htmlspecialchars_decode
php validation

答案 4 :(得分:-2)

我仍然倾向于编码HTML。如果您正在构建某种形式的CMS或Web应用程序,则可以更轻松地将其存储为编码HTML,然后根据需要对其进行重新编码。

例如,当将信息带入由TinyMCE修改的TextArea时,他们建议HTML应该被编码 - 因为HTML规范不允许在文本区域内使用HTML。

我也希望strip_tags()来自任何您不想要HTML代码的地方。