php 解码mysql_真实的_escape_string()输出HTML

aiqt4smr  于 2023-05-12  发布在  PHP
关注(0)|答案(9)|浏览(127)

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

mysql_real_escape_string($string);

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

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

我不确定真实的_escape_string添加了多少其他变体,所以不想只替换一些而错过其他...如何将其“解码”回正确格式化的HTML,如:

html_entity_decode(stripslashes($string));
4sup72z8

4sup72z81#

mysql_real_escape_string()不需要解码,它只用于SQL,但转义字符永远不会存储在数据库中。当然,它不应该被用来清理HTML。没有理由在输出网页数据之前使用它。此外,mysql_real_escape_string()也不应该用于将要放入数据库的数据。您的清理过程应该如下所示:

输入

1.接受来自表单或HTTP请求的用户输入
1.使用预准备语句创建数据库查询

输出

1.从数据库中取出数据
1.打印前通过htmlspecialchars()运行任何用户定义的数据
使用MySQLiPDO等数据库驱动程序将允许您使用准备好的语句,这些语句负责为您转义大多数输入。

q3qa4bjr

q3qa4bjr2#

你把一切都搞砸了。

mysql_真实的_escape_string不需要任何解码!

如果你用斜线取回数据,这意味着它已经被转义了两次。而不是剥离出额外的斜线,你只是不应该添加他们摆在首位。
不管是什么东西,都是你的,都是你的,都是你的。

使用预处理语句

而不是任何转义字符串。
所以,永远不要逃跑,永远不要解码。
问题解决了。

0s0u357o

0s0u357o3#

mysql_real_escape_string用于在将用户提供的数据存储到数据库中时防止SQL注入,但更好的方法是使用PDO(例如)进行数据绑定。我总是建议使用它,而不是用逃避来捣乱。
话虽如此,关于你的问题如何显示它之后-数据存储后,当你检索它的数据是完整和有效的,没有任何需要“unescaped”。除非你添加了自己的转义序列,所以请不要这样做。

n6lpvg4x

n6lpvg4x4#

使用下面的函数删除斜线,同时显示在HTML页面上:
return();
$html=stripslashes($html);$html=stripslashes($row[“field name”]);

r6hnlfcb

r6hnlfcb5#

不知道是怎么回事的格式,因为我可以看到它,但你的html形式

<span class="\&quot;className\&quot;">
<p class="\&quot;pClass\&quot;" id="\&quot;pId\&quot;"></p>
</span>

应该简单;

<span class="className">
<p class="pClass" id="pId"></p>
</span>

当你取回它时,在你把它放入数据库之前,你使用mysql_真实的_escape_string()来转义它,以确保你不会遭受sql注入攻击。
因此,您正在转义值,准备放置文本的下一个位置。
当你把它从数据库中取出来(或者把它的任何一个都显示为html),然后你再次用htmlentities()等方法来逃避它,准备好它接下来要去的地方(html),以保护你的用户免受XSS攻击。
这形成了咒语FIEO的EO部分,过滤输入,逃逸输出,你应该在你的眼睑内侧纹身。

yvgpqqbh

yvgpqqbh6#

我想知道为什么这个例程没有附带的解码器例程。它可能被MySQL解释为完全相同的方式,就好像它没有被转义一样。当执行$row=mysql_fetch_array($res, MYSQL_ASSOC)';时,将得到未转义的结果

ekqde3dh

ekqde3dh7#

好吧,我尝试了一下旧的方式,到目前为止,我看不出我的方法有什么问题。显然这有点粗糙,但它完成了工作:

function mysql_unreal_escape_string($string) {
    $characters = array('x00', 'n', 'r', '\\', '\'', '"','x1a');
    $o_chars = array("\x00", "\n", "\r", "\\", "'", "\"", "\x1a");
    for ($i = 0; $i < strlen($string); $i++) {
        if (substr($string, $i, 1) == '\\') {
            foreach ($characters as $index => $char) {
                if ($i <= strlen($string) - strlen($char) && substr($string, $i + 1, strlen($char)) == $char) {
                    $string = substr_replace($string, $o_chars[$index], $i, strlen($char) + 1);
                    break;
                }
            }
        }
    }
    return $string;
}

这应该涵盖大多数情况。

c86crjj0

c86crjj08#

即使这是个老问题。。我和彼得·克雷格有同样的问题。事实上,我必须处理一个旧的CMS。为了防止SQL注入,所有$_POST和$_GET值都是“sql转义”的。不幸的是,这是在一个中心点完成的,所以你所有的模块都在接收所有的数据。在某些情况下,您希望直接显示这些数据,因此您面临一个问题:如何显示一个sql转义字符串,而不需要从数据库中获取它?答案是:使用stripcslashes(不是stripslashes!!)
http://php.net/manual/en/function.stripcslashes.php

z4bn682m

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)应该是所需的全部。

相关问题