澄清mysqli_real_escape_string:存储在数据库中

时间:2012-05-02 02:20:40

标签: mysqli mysql-real-escape-string

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

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

我对包含此类潜在恶意字符的组成字符串执行了一个简单测试,并将其回显到文档中,完全看到了我的预期:带有反斜杠的字符串转义这些字符。

因此,在将数据存储到数据库之前,我继续将清理功能添加到数据中。我将它(mysqli_real_escape_string($ link,$ string))插入到我为数据存储构建的查询中。测试脚本,我很惊讶(有点令我懊恼)注意到存储在数据库中的数据似乎没有包含反斜杠。我测试,测试和测试,但都无济于事,我不知所措......

有什么建议吗?我错过了什么吗?我当时希望用striplashes($ string)函数删除反斜杠,但似乎没有任何东西要剥离...

3 个答案:

答案 0 :(得分:1)

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

通常,您想要在数据库中存储已修改或已清理的数据,而应将数据存储在其原始版本中。例如,最佳实践是存储完整的HTML字符串,而不是存储使用PHP htmlspecialchars()编码的HTML。

当您从数据库中检索它时,不需要stripslashes()或其他类似的unescaping。像magic_quotes_gpc这样的PHP有一些遗留(错误)功能,它们旨在通过自动在引用的字符串中添加反斜杠来保护程序员自己,需要在输出上使用`stripslashes(),但这些功能已经被已弃用,现已大部分已删除。

答案 1 :(得分:1)

MySQL不使用斜杠存储数据(尽管它使用斜杠传递给RDBMS)。所以你以后不需要使用stripslashes()。

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

答案 2 :(得分:0)

  

我希望清理我网站用户输入的所有文字(以及大多数其他数据)

这就是你做错了。

  1. mysqli_real_escape_string不会“清理”任何内容。它的名字中没有“清洁”字样。
  2. 您应该格式化,而不是“清理”您的数据。不同的数据需要不同的格式。
  3. 您应该格式化所有数据,而不仅是我网站用户输入的数据
  4. 在当前表单中,您离开您的网站时极易受到攻击和错误的攻击。

      

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

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