解码mysql_real_escape_string()以输出HTML

Pet*_*aig 11 php sql-injection html-encode mysql-real-escape-string

我试图保护自己免受sql注入并使用:

mysql_real_escape_string($string);
Run Code Online (Sandbox Code Playgroud)

发布HTML时,它看起来像这样:

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>
Run Code Online (Sandbox Code Playgroud)

我不确定real_escape_string添加了多少其他变体,所以不想只替换一些并错过其他...我如何将其"解码"回到格式正确的HTML中,例如:

html_entity_decode(stripslashes($string));
Run Code Online (Sandbox Code Playgroud)

zom*_*bat 13

mysql_real_escape_string()手册页告诉你哪些字符转义:

mysql_real_escape_string()调用MySQL的库函数mysql_real_escape_string,它将反斜杠添加到以下字符:\ x00,\n,\ r,\,',"和\ x1a.

您可以通过使用未转义的表单替换这些转义字符来成功撤消转义.

mysql_real_escape_string()虽然不应该用来清理HTML ...在输出网页数据之前没有理由使用它.它应该只用于您要放入数据库的数据.您的清理过程应如下所示:

输入

  1. 接受来自表单或HTTP请求的用户输入
  2. 使用创建数据库查询 mysql_real_escape_string()

产量

  1. 从数据库中获取数据
  2. htmlspecialchars()在打印之前运行任何用户定义的数据

使用不同的数据库驱动程序(如MySQLiPDO)将允许您使用准备语句,这些语句负责为您转义大多数输入.但是,如果你无法切换或利用它们,那么一定要使用mysql_real_escape_string()...只在插入数据之前使用它.


You*_*nse 9

你搞得一切搞砸了.

mysql_real_escape_string不需要任何解码.

如果你用斜杠获取数据,则意味着它已被转义两次.而不是剥离额外的斜杠你应该不添加它们.

更不用说任何逃避都被淘汰了,你应该这样做

用准备好的陈述

而不是任何逃避字符串.

所以,永远不要逃避,不要解码.
问题解决了.


Gus*_*uss 8

mysql_real_escape_string用于在将用户提供的数据存储到数据库时防止SQL注入,但更好的方法是使用PDO(例如)使用数据绑定.我总是建议使用它而不是弄乱逃脱.

话虽如此,关于如何在之后显示它的问题 - 在存储数据之后,当您检索数据时,数据是完整且有效的,而不需要"未转义".除非您添加了自己的转义序列,否则请不要这样做.