关于mysqli_real_escape_string的说明:存储在数据库中

问题描述 投票:1回答:3

为了避免SQL注入攻击,我希望在将网站用户输入的所有文本(以及大多数其他数据)发送到数据库进行存储之前,先将其清理干净。

我给人的印象是该函数在所有有恶意的字符(\ n,',“等)之前插入反斜杠(\),并期望返回的字符串包含新添加的反斜杠。

我对包含此类潜在恶意字符的组成字符串进行了简单测试,并将其回显到文档中,确切地看到了我的期望:带反斜杠的字符串将这些字符转义。

因此,在存储到数据库之前,我先向数据添加了清理功能。我将它(mysqli_real_escape_string($ link,$ string))插入到为数据存储而构建的查询中。测试脚本后,我惊讶(有点不高兴)发现数据库中存储的数据似乎不包含反斜杠。我进行了测试,测试和测试,但无济于事,我茫然不知所措...

有什么建议吗?我想念什么吗?我原本期望然后必须使用stripslashes($ string)函数删除反斜杠,但似乎没有要剥离的任何东西...

php mysqli sql-injection mysql-real-escape-string
3个回答
1
投票

成功插入后在数据库中查看数据时,用mysql_real_escape_string()对其进行了转义,您将不会看到数据库中的反斜杠。这是因为转义反斜杠仅在SQL查询语句中需要。 mysql_real_escape_string()对其进行清理以进行插入(或更新,或其他查询输入),但在存储数据时不会导致数据的永久修改版本。

通常,您希望在数据库中存储经过修改或清除的数据,而应该以原始版本存储数据。例如,最佳做法是存储完整的HTML字符串,而不是存储已用PHP的htmlspecialchars()编码的HTML。

当您从数据库中取回它时,就不需要stripslashes()或其他类似的转义。 PHP具有magic_quotes_gpc之类的一些遗留(mis-)功能,旨在通过自动在引用的字符串中添加反斜杠来保护程序员免受自身侵害,要求在输出中使用`stripslashes(),但是这些功能已被弃用,并且现在大部分已删除。


1
投票

MySQL存储数据时不带斜杠(尽管它以斜杠传递给RDBMS)。因此,您以后无需再使用stripslashes()。

您可以确定该字符串已转义,否则将导致查询失败。


0
投票

我正在清理网站用户输入的所有文本(以及大多数其他数据)

这是您做错了。

  1. mysqli_real_escape_string不会“清除”任何内容。名称中没有单词“ cleanse”。
  2. 您应该格式化而不是“清理”您的数据。并且不同的数据需要不同的格式。
  3. 您应该格式化所有数据,而不仅是我的网站用户输入的数据

按照目前的形式,您将使站点极易受到攻击和错误的攻击。

我给人的印象是,该函数在所有有恶意的字符(\ n,',“等)之前插入反斜杠(\),

让您知道,任何字符都没有恶意。有些服务字符在某些情况下可能会被误解。但是添加反斜杠不会使您的数据自动“安全”。某些注入不需要任何特殊字符。因此,您需要正确格式化数据,而不仅仅是使用某种魔术,可以使您神奇地安全]

© www.soinside.com 2019 - 2024. All rights reserved.