在http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html文章中,它说明了以下内容:
出于安全性和性能原因,在应用程序中使用预准备语句有许多优点.
准备好的语句可以通过将SQL逻辑与提供的数据分开来帮助提高安全性.逻辑和数据的这种分离有助于防止称为SQL注入攻击的非常常见的漏洞类型.
通常,在处理即席查询时,在处理从用户收到的数据时需要非常小心.这需要使用能够逃避所有必要的故障字符的函数,例如单引号,双引号和反斜杠字符.
在处理预准备语句时,这是不必要的.数据的分离允许MySQL自动考虑这些字符,并且不需要使用任何特殊功能进行转义.
这是否意味着我不需要htmlentities()或htmlspecialchars()?但我想我需要添加strip_tags()到用户输入数据?我对吗?
Pas*_*TIN 15
htmlentities并htmlspecialchars用于生成发送到浏览器的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 <strong>test</strong>' (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)
你想要哪一个?这是重要的问题;-)
在数据库中插入东西时,你不需要htmlentities()或htmlspecialchars(),没有什么不好的事情,如果你正在使用预准备语句,你将不会受到SQL注入的攻击.好的是,您现在将原始用户输入存储在数据库中.
您需要在输出上转义并将其发送回客户端,当您从数据库中取出内容时,您将容易受到跨站点脚本攻击和其他不良事件的攻击.你需要为你需要的输出格式转义它们,比如html,所以你仍然需要htmlentities等.
出于这个原因,你可以在将它们放入数据库时转义,而不是在输出它时 - 但是你将丢失用户的原始格式,并且你将转义数据以供html使用,这可能无法获得回报您正在使用不同输出格式的数据.