1

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

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

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

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

有什么建议么?我错过了什么吗?我期望然后必须使用 stripslashes($string) 函数删除反斜杠,但似乎没有任何东西可以剥离......

4

3 回答 3

1

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

通常,您不想在数据库中存储修改或清理过的数据,而应该将数据存储在其原始版本中。例如,最好的做法是存储完整的 HTML 字符串,而不是存储使用 PHP 的htmlspecialchars().

当您从数据库中检索它时,不需要stripslashes()或其他类似的转义。PHP 有一些遗留(错误)功能,例如magic_quotes_gpc旨在通过自动向带引号的字符串添加反斜杠来保护程序员免受自身侵害,要求在输出中使用`stripslashes(),但这些功能已被弃用,现在大部分已被删除.

于 2012-05-02T02:35:45.887 回答
1

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

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

于 2012-05-02T02:38:00.747 回答
0

我正在寻找清除我网站用户输入的所有文本(和大多数其他数据)

这就是你做错了。

  1. mysqli_real_escape_string 不会“清理”任何东西。它的名字中没有“净化”二字。
  2. 您应该格式化,而不是“清理”您的数据。不同的数据需要不同的格式。
  3. 您应该格式化所有数据,而不仅仅是我网站用户输入的数据

在当前形式下,您的网站极易受到攻击和错误的攻击。

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

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

于 2012-05-02T07:01:11.063 回答