我们正在学校里开发一个小型网站,因此向我们介绍了PHP中的SQL注入及其预防方法。
但是,我看到大多数在线示例和教科书都在执行以下操作
$str = $_POST['user_input'];
$str = $mysqli->real_escape_string($str);
$str = htmlentities($str);
但是,我认为验证用户输入的最合乎逻辑的方法是:
$str = htmlentities($str);
$str = $mysqli->real_escape_string($str);
那有什么区别吗
?
涵盖更多转义功能也很好(也许应该避免一些危险的组合/顺序)。
我认为正确的方法是搜索转义函数,该函数输出“危险字符”(危险字符为HTML或SQL,如果存在的话,则为危险字符),然后仅提供生成这些危险字符的输入。
该顺序将导致不同的输出。
如下代码:
$string = 'Example " string';
echo htmlentities($mysqli->real_escape_string(($string))
. "\n"
. $mysqli->real_escape_string((htmlentities($string));
结果是:
Example \" string
Example " string
输出是不同的,因为如果在转换为HTML实体之前对字符串进行转义,则其引号需要转义,而如果以相反的顺序进行引用,则引号将替换为HTML实体,并且是MySQL的有效字符串值。
也就是说,这两个功能具有完全不同的目的。
htmlentities
用于将字符串转换为其HTML实体,以准备输出到Web浏览器。
real_escape_string
用于在MySQL查询中的引号之间转换字符串以供使用。
两者不能同时使用,您应该将文本存储在数据库中(在传递给数据库之前需要转义),并在显示文本时转换为HTML实体。
如果您坚持要在数据库中存储字符串的HTML实体版本,则正确的方法是先使用htmlentities
,然后转义。字符串转义应该是传递给数据库之前对字符串的最后操作。
以错误的方式进行操作可能会导致如上所示的反斜杠,尽管当传递给MySQL时,它们实际上将被忽略,因为\&
这不是有效的转义序列。您只有在输出传递到数据库的变量时才会注意到差异(这与以后从数据库检索变量然后输出)不同。
您可能还希望查看以下内容中的准备好的语句mysqli
:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句