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

shi*_*hin 8 php mysql

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

出于安全性和性能原因,在应用程序中使用预准备语句有许多优点.

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

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

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

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

Pas*_*TIN 15

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

准备语句用于生成/向数据库引擎发送查询.

两者都允许逃避数据; 但他们没有逃避相同的用法.
所以,没有,准备好的语句(对于SQL查询)不会阻止你正确使用htmlspecialchars/ htmlentities (用于HTML生成)

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

例如,使用这段代码:

$str = 'this is a <strong>test</strong>';
var_dump(strip_tags($str));
var_dump(htmlspecialchars($str));
Run Code Online (Sandbox Code Playgroud)

你会得到这种输出:

string 'this is a test' (length=14)
string 'this is a &lt;strong&gt;test&lt;/strong&gt;' (length=43)
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,没有标签; 在第二个,适当逃脱的.

并且,使用HTML输出:

$str = 'this is a <strong>test</strong>';
echo strip_tags($str);
echo '<br />';
echo htmlspecialchars($str);
Run Code Online (Sandbox Code Playgroud)

你会得到:

this is a test
this is a <strong>test</strong>
Run Code Online (Sandbox Code Playgroud)

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


Kor*_*nel 8

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

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

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


nos*_*nos 7

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

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

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