1

首先,魔术引号和运行时在 中正确禁用php.ini,并由phpinfo().

PHP version: 5.3.4
MySQL version: 5.1.52

我只mysql_real_escape_string在数据上使用, afterhtmlspecialchars和 a trim,这就是变量的所有数据清理。

然而,当我提交单引号时,斜线仍保留在数据库中。

运行时mysql_query我正在使用"' . $var . '",尽管在过去这并没有改变任何东西(可能是由于双引号?)。

有任何想法吗?请不要告诉我有关 PDO/准备好的声明,我知道它们并且我有这样做的理由。

谢谢!

代码示例(这是对数据所做的唯一事情):

mysql_real_escape_string( htmlspecialchars( trim( $data ) ) );
4

4 回答 4

3

我只在数据上使用 mysql_real_escape_string,在 htmlspecialchars 和修剪之后,这就是变量的所有数据清理。

不,用于mysql_real_escape_string在数据库中存储数据。存储数据时不要破坏数据。

该函数htmlspecialchars用于将字符串编码为 HTML(<成为&lt;等),并且只能用于此目的。

于 2011-01-03T21:53:38.297 回答
1

也许是被误导、无用且具有破坏性的选择

magic_quotes_gpc

是否已启用?

您可以在 phpinfo() 的输出中检查这一点,但如果服务器管理员已全局启用它而无法覆盖,则您无能为力。

我建议检查它是否打开(当然在应用程序的每个页面上),如果是,导致应用程序快速而痛苦地死掉,以确保您避免数据损坏(这主要表现为您所描述的反斜杠的扩散)。

然后带着你选择的钝器去服务器管理员家。

希望您可以在数据库被大量邪恶的自倍增反斜杠淹没之前完成所有这些工作。

于 2011-01-03T21:57:53.747 回答
1

您的存储过程是正确的。(尽管可能不需要 htmlspecialchars 和/或 trim - 但我不知道你的应用程序)

根据您提供的信息,没有理由看到您的问题。

然后,下一个调试方法将记住您在系统上可能更改或已更改的任何其他内容(可能您正在使用某些第 3 方安装映像?)。

如果失败了,即留给疯狂猜测可能的原因,我将提供第一个:

mysql 可以在 NO_BACKSLASH_ESCAPES模式下运行,这会导致反斜杠被视为常规字符。

此外,您似乎将字符串用双引号括起来,然后将单引号(通常会被转义)直接插入数据库,前面是反斜杠。

很可能也有可能 - 当您在 sql 语句中用双引号将字符串包装起来时,这不是应该的样子,我很困惑您没有收到语法违规错误,您最终会得到一些查询,例如"john\'s house"这是由从 mysql_real_escape 中转义的单引号引起的,如果您的查询正确地用单引号括起来,这将是正确的。

这让我想到了这个问题。尝试插入双引号时是否出现语法错误(或注入查询)?

至于你的评论。您可以很好地使用 pdo 准备语句,然后从中获取查询字符串,并使用 mysql 函数执行它们。但是我意识到这不能解决您的问题。

还请尝试将整个查询仅放在一个变量中,并在执行之前直接打印出来。然后查看它并通过执行生成字符串的操作来跟踪任何错误的操作返回操作。

于 2011-01-03T22:20:19.863 回答
0

如果在转义数据后在 SQL 命令中使用双引号

 SELECT "1\'2"

然后它将存储并返回值,因为1\'2反斜杠仍然完好无损。

SQL 字符串的正确语法是使用单引号。这mysql_real_escape_string就是逃避的目的。否则它将不得不转义双引号,但是它完全不知道其用法。

在 PHP 中使用双引号。对 SQL 使用单引号。像这样重写你的代码:

 $x = escapy($x);
 $y = escapy($y);
 sql_query("INSERT INTO tbl (x,y) VALUES ('$x', '$y')");
于 2011-01-03T22:24:27.183 回答