mysql_real_escape_string不能使用'

时间:2013-08-07 14:52:59

标签: php mysql security sql-injection mysql-real-escape-string

我有一个用PHP处理过的表单。它包含有关客户端作业的Notes字段。 问题是,如果笔记中有一个'内部 - 例如它,O'Reilly,那是等等,它会逃脱数据库中的字符串,所以我将所有笔记都放到了它之后才会遇到'那就是结束了的笔记。

我意识到有像mysqli_和PDO这样的东西,但现在是忙碌的季节,我可以在1月完成更新/大修之前快速解决这个问题。

知道它为什么不起作用?代码包括在内我把mysql_real_escape_string()放在哪里都没关系,它在任何地方都不起作用。

仅供参考:表格列为TEXT。还有其他几个领域,因此是foreach

// SELECTS AND CONNECTS TO SERVER/DB
include_once('config/db.inc.php');


// CONVERT ALL $_POST['name'] to $name and clean/prep for mysql insertion
foreach($_POST as $key => $value ) {    
       $$key = mysql_real_escape_string($value); 
       }


// UPDATE CLIENT JOB NOTES
$query = "UPDATE client_list SET bookingNotes='$bookingNotes' WHERE id='$CID'";
         mysql_query($query, $conn) or die(mysql_error());

TIA

编辑以下回复:

$ bookingNotes和$ CID由表单变量$ _POST ['bookingNotes']和$ _POST ['CID']定义,其中foreach基本上删除了“_POST”部分。 (这是整个$$键= $ value部分)

如前所述,我很欣赏mysqli_和PDO,但目前我无法学习,更新和实施这些系统。这在本地运行,我当前版本的PHP 5.4.1支持该功能。我知道PDO更好,但是现在这不是一个选项,所以请不要贬低我“正确地做”或“学习如何编码”。这不是问题所在。

我知道发生了什么,在哪里以及为什么 - mysql正在处理'as和end的字符串。但是我不知道为什么当我认为函数应该逃脱'并允许它进入数据库时​​发生这种情况。

猜测,这就是发生的事情。

“今天很灰,下雨了”作为$ bookingNotes进入表格。然后,该脚本将其输入到数据库的TEXT列中。但是数据库中出现的是;

“今天非常灰,而且”

TIA并感谢到目前为止的回复。

5 个答案:

答案 0 :(得分:2)

你确定问题是在写作结束吗?您的代码看起来应该有效。 (好吧,对于某些工作价值,你不希望有一个字段<input name='conn' value='haha'>。无论如何,你似乎很好地理解了代码的问题。)

我认为你看到的不是SQL注入而是HTML注入:

<input name='bookingNotes' value='<?php=$bookingNotes?>'>

尝试使用

转义
<input name='bookingNotes' value='<?php=htmlspecialchars($bookingNotes, ENT_QUOTES)?>'>

避免这个问题。

答案 1 :(得分:0)

我试过了,似乎没问题

$_POST['name'] = "1'";
$_POST['age'] = '2';/* 
$_POST[] = '3';
$_POST[] = '3'; */
foreach($_POST as $key => $value ) {    
    $$key = mysql_real_escape_string($value); 
    echo $$key;

}

我得到的结果是:1 \' - 这是正确的

答案 2 :(得分:0)

感谢所有有帮助的人。

现在已经修好了,老实说我不知道​​怎么做。

我删除了SQL语句上的''(WHERE bookingNotes ='bookingNotes')以强制显示错误。

我还检查了(回显)$ bookingNotes的内容,这是POST数据后的mysql_real_escape_string(),它有完整的字符串,带有撇号(斜线)

我删除了回声,把SQL放回去,这一切都按预期的那样工作。

我在开始工作之前备份了脚本,之后我将“新”工作与失败的原始工作进行了比较,它们完全相同,没有丢失的字符或额外/缺少的空白,完全相同。 O_O

所以我不知道那里发生了什么!

感谢您的输入。

答案 3 :(得分:-1)

尝试更改此

$$ key = mysql_real_escape_string($ value);

INTO

$ key = mysql_real_escape_string($ value);

答案 4 :(得分:-1)

首先mysql_real_escape_string() 始终有效。如果你的代码没有 - 好吧,这是你的代码。

第二,但最重要的是:从不运行这样的代码

foreach($_POST as $key => $value ) {    
    $$key = // whatever.
}

它在安全方面实际上是一个洞,比其他任何一个都差。

最后,你的非常模糊的解释是非常不清楚的,但我想这是HTML形式,你得到你的“笔记结束”。无论如何,你必须修复它发生的地方,而不是责怪你很久以前运行的功能