繁体   English   中英

字符串的转义顺序是否有关系? (HTML和SQL注入)

[英]Does escape order of strings matters in some way? (HTML and SQL injection)

我们正在学校里开发一个小型网站,因此向我们介绍了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注入(顺序错误是否允许注入?)
  • 服务器的性能(例如,一个函数最昂贵,而另一个函数则增加了字符串长度,或者仅仅是因为最终的字符串长度不同并且我们想在数据库中保存字节)

涵盖更多转义功能也很好(也许有些危险的组合/顺序应该避免)。

我认为正确的方法是搜索转义函数,该函数输出“危险字符”(危险字符为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用于将字符串转换为准备输出到Web浏览器的HTML实体。

real_escape_string用于在MySQL查询中的引号之间转换字符串。

两者不能同时使用,您应该将文本存储在数据库中(在传递给文本之前需要转义),并在显示文本时转换为HTML实体。

如果您坚持要在数据库中存储字符串的HTML实体版本,则正确的方法是先使用htmlentities ,然后对其进行转义。 转义字符串应该是传递给数据库之前对字符串的最后操作。

以错误的方式进行操作可能会导致如上所示的反斜杠,尽管当传递给MySQL时,它们实际上会被忽略,因为\\&不是有效的转义序列。 您只有在输出传递到数据库的变量时才会注意到差异(这与以后从数据库检索变量然后输出)相反。

您可能还想研究mysqli准备好的语句:

http://www.php.net/manual/zh/mysqli.prepare.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM