我试图保护自己免受sql注入的影响,并使用:
mysql_real_escape_string($string);
当发布HTML时,它看起来像这样:
<span class="\"className\"">
<p class="\"pClass\"" id="\"pId\""></p>
</span>
我不确定真实的_escape_string添加了多少其他变体,所以不想只替换一些而错过其他...如何将其“解码”回正确格式化的HTML,如:
html_entity_decode(stripslashes($string));
9条答案
按热度按时间4sup72z81#
mysql_real_escape_string()
不需要解码,它只用于SQL,但转义字符永远不会存储在数据库中。当然,它不应该被用来清理HTML。没有理由在输出网页数据之前使用它。此外,mysql_real_escape_string()
也不应该用于将要放入数据库的数据。您的清理过程应该如下所示:输入
1.接受来自表单或HTTP请求的用户输入
1.使用预准备语句创建数据库查询
输出
1.从数据库中取出数据
1.打印前通过
htmlspecialchars()
运行任何用户定义的数据使用MySQLi或PDO等数据库驱动程序将允许您使用准备好的语句,这些语句负责为您转义大多数输入。
q3qa4bjr2#
你把一切都搞砸了。
mysql_真实的_escape_string不需要任何解码!
如果你用斜线取回数据,这意味着它已经被转义了两次。而不是剥离出额外的斜线,你只是不应该添加他们摆在首位。
不管是什么东西,都是你的,都是你的,都是你的。
使用预处理语句
而不是任何转义字符串。
所以,永远不要逃跑,永远不要解码。
问题解决了。
0s0u357o3#
mysql_real_escape_string
用于在将用户提供的数据存储到数据库中时防止SQL注入,但更好的方法是使用PDO(例如)进行数据绑定。我总是建议使用它,而不是用逃避来捣乱。话虽如此,关于你的问题如何显示它之后-数据存储后,当你检索它的数据是完整和有效的,没有任何需要“unescaped”。除非你添加了自己的转义序列,所以请不要这样做。
n6lpvg4x4#
使用下面的函数删除斜线,同时显示在HTML页面上:
return();
$html=stripslashes($html);$html=stripslashes($row[“field name”]);
r6hnlfcb5#
不知道是怎么回事的格式,因为我可以看到它,但你的html形式
应该简单;
当你取回它时,在你把它放入数据库之前,你使用mysql_真实的_escape_string()来转义它,以确保你不会遭受sql注入攻击。
因此,您正在转义值,准备放置文本的下一个位置。
当你把它从数据库中取出来(或者把它的任何一个都显示为html),然后你再次用htmlentities()等方法来逃避它,准备好它接下来要去的地方(html),以保护你的用户免受XSS攻击。
这形成了咒语FIEO的EO部分,过滤输入,逃逸输出,你应该在你的眼睑内侧纹身。
yvgpqqbh6#
我想知道为什么这个例程没有附带的解码器例程。它可能被MySQL解释为完全相同的方式,就好像它没有被转义一样。当执行
$row=mysql_fetch_array($res, MYSQL_ASSOC)';
时,将得到未转义的结果ekqde3dh7#
好吧,我尝试了一下旧的方式,到目前为止,我看不出我的方法有什么问题。显然这有点粗糙,但它完成了工作:
这应该涵盖大多数情况。
c86crjj08#
即使这是个老问题。。我和彼得·克雷格有同样的问题。事实上,我必须处理一个旧的CMS。为了防止SQL注入,所有$_POST和$_GET值都是“sql转义”的。不幸的是,这是在一个中心点完成的,所以你所有的模块都在接收所有的数据。在某些情况下,您希望直接显示这些数据,因此您面临一个问题:如何显示一个sql转义字符串,而不需要从数据库中获取它?答案是:使用stripcslashes(不是stripslashes!!)
http://php.net/manual/en/function.stripcslashes.php
z4bn682m9#
我认为其他一些答案忽略了一个明显的问题。
您正在对输入的内容使用mysql_真实的_escape_string(如果不使用准备好的语句)。
你的问题在于输出。
当前的问题是您正在调用html_entity_decode。只需stripslashes即可恢复原始文本。html_entity_decode是什么搞乱了你的报价,等等,因为它正在改变它们。你实际上想要输出html,而不仅仅是纯文本(当你使用html_entities等时)。你正在解码你想编码的东西。
如果只想显示文本版本,可以使用实体。如果你担心标签不好,使用striptags,只允许你想要的标签(如b,i等)。
最后,请记住以正确的顺序进行编码和解码。如果你运行mysql_真实的_escape_String(htmlentities($str)),那么你需要运行html_entity_decode(stripslashes($str))。操作的顺序很重要。
更新:我没有意识到html_entity_decode也去掉了斜杠。这一页上没有明确的记录,我只是从来没有抓住它。我仍然会自动运行它,因为我展示的大多数html都希望保留为实体,即使我不这样做,我也更喜欢在我的db类之外根据具体情况做出决定。这样的话,我就知道那些斜线不见了。
看起来原来的海报正在运行htmlentities(或者他的输入程序,就像tinymce为他做的那样),他想把它转回到内容。因此,html_entity_decode($Str)应该是所需的全部。