首先是魔术引用&运行时在php.ini
中已正确停用,并由phpinfo()
确认。
PHP version: 5.3.4
MySQL version: 5.1.52
我只在mysql_real_escape_string
和htmlspecialchars
之后对数据使用trim
,这是变量上的所有数据清理。
然而,当我提交单引号时,斜杠仍然在数据库中。
运行mysql_query
我正在使用"' . $var . '"
,虽然过去这没有改变任何东西(可能是由于双引号?)。
有什么想法吗?请不要告诉我关于PDO /准备好的陈述,我知道它们,我有理由这样做。
谢谢!
代码示例(这是对数据唯一做的事情):
mysql_real_escape_string( htmlspecialchars( trim( $data ) ) );
答案 0 :(得分:3)
我只对数据使用mysql_real_escape_string,在htmlspecialchars和trim之后,这是对变量的所有数据清理。
没有。 仅使用mysql_real_escape_string
在数据库中存储数据。存储时不要破坏数据。
函数htmlspecialchars
用于将字符串编码为HTML(<
变为<
等),它只能用于此目的。
答案 1 :(得分:1)
也许是大规模误导,无益和破坏性的选择
magic_quotes_gpc
已启用?
你可以在phpinfo()的输出中检查一下,但是如果服务器管理员在没有覆盖的情况下全局启用它,你可以做很多事情。
我建议检查它是否打开(当然是在应用程序的每个页面上),如果是这样,导致应用程序快速而痛苦地死亡,以确保您避免数据损坏(这主要表现为反射的扩散你描述)。
然后用你选择的钝武器到服务器管理员的家里去。
希望你可以在你的数据库被恶意自我倍增的反斜杠溢出之前完成所有这些。
答案 2 :(得分:1)
您的存储过程是正确的。 (可能不需要altt htmlspecialchars和/或trim - 但我不知道你的应用程序)
根据您提供的信息,没有理由看到您的问题。
接下来的调试方法是记住您在系统上可能已更改或已更改的任何其他内容(maby您正在使用某些第三方安装映像?)。
如果失败,即留下疯狂猜测可能的原因,我将提供第一个:
mysql可以在NO_BACKSLASH_ESCAPES -mode中运行,这会导致反斜杠被视为常规字符。
此外,看起来你用双引号包装你的字符串,然后插入一个单引号 - 通常会被转义 - 直接进入你的数据库,前面加一个反斜杠。
很可能也是这样 - 因为你在sql语句中用双引号包装你的字符串,这不是它应该是什么样的,我感到困惑你没有得到语法违规错误,你最终得到了一些像"john\'s house"
这样的查询是由mysql_real_escape中的单引号引起的,如果您的查询正确地用单引号包装,这将是正确的。
这引出了我的问题。尝试插入双引号时,是否会出现语法错误(或注入的查询)?
至于你的评论。你可以很好地用pdo编写语句,然后从中获取查询字符串,并使用mysql函数执行它们。但是我意识到这不是你问题的解决方案。
请尝试将整个查询仅放在一个变量中,然后在执行之前将其打印出来。然后查看它并按照生成字符串的操作跟随任何错误的操作返回操作。
答案 3 :(得分:0)
如果在转义数据后在 中使用双引号:
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')");