在文章http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html中,它说明了以下内容:
在您的应用程序中使用预准备语句有很多优点,包括 安全性 和性能原因。
预备语句可以通过将SQL逻辑与提供的数据分开来帮助提高安全性。逻辑和数据的这种分离有助于防止称为SQL注入攻击的非常常见的漏洞类型。
通常,当您处理即席查询时,在处理从用户收到的数据时需要非常小心。 这需要使用能够逃避所有必要的故障字符的函数,例如单引号,双引号和反斜杠字符。
处理预准备好的陈述时,这是不必要的 。数据的分离允许MySQL自动考虑这些字符,并且不需要使用任何特殊功能进行转义。
这是否意味着我不需要htmlentities()
或htmlspecialchars()
?
但我想我需要将strip_tags()
添加到用户输入数据中?
我是对的吗?
答案 0 :(得分:14)
htmlentities
和htmlspecialchars
用于生成发送到浏览器的 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 <strong>test</strong>' (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 <script> document.location.href='https://www.google.com';</script> (in view source)<br />
如果用户输入注释“脚本”进入数据库,则浏览器显示 所有来自数据库的评论,自动“脚本”将执行和 重定向到google.com
所以,
1.将htmlspecial用于deactive bad script tag
2.使用准备安全数据库
答案 4 :(得分:-2)
我仍然倾向于编码HTML。如果您正在构建某种形式的CMS或Web应用程序,则可以更轻松地将其存储为编码HTML,然后根据需要对其进行重新编码。
例如,当将信息带入由TinyMCE修改的TextArea时,他们建议HTML应该被编码 - 因为HTML规范不允许在文本区域内使用HTML。
我也希望strip_tags()
来自任何您不想要HTML代码的地方。