2013-08-07 25 views
-2

我有一个使用PHP处理的表单。它包含关于客户端作业的Notes的字段。 问题是,如果在笔记中有一个“内部”,例如O'Reilly,那么它就会跳出数据库中的字符串,所以我将所有注释都记录下来,直到它遇到'那么这就是笔记结尾。mysql_real_escape_string不能使用'

我意识到有些事情像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”部分。 (这是整个$$ key = $ value部分)

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

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

推测,这是发生了什么事。

“今天非常灰暗,下雨”以$ bookingNotes的形式输入。然后该脚本将其输入到数据库的TEXT列中。但是数据库中出现的是什么;

“今天是非常灰色的,它”

TIA和感谢迄今响应。

+1

$ bookingNotes和$ CID是在哪里定义的,它们似乎没有从循环数组值 –

+1

获取哪些php版本使用的值?原始的mysql扩展从php 5.5.x版本中折旧。 – Nishant

+0

也许这是错的? - >'$$ key' – aldanux

回答

0

感谢大家的帮助。

它现在已经修复,我真的不知道如何。

我删除了SQL语句中的''(WHERE bookingNotes ='bookingNotes')来强制执行错误。

我还检查(回波)的$ bookingNotes,这是POST数据后mysql_real_escape_string(),它有完整的字符串与单引号转义(下调)

我删除了回音,把SQL后面的内容,并且它按照预期的方式工作。

在我开始工作之前,我备份了脚本,之后我比较了“新”工作与原来的失败并且完全相同,没有缺失字符或额外/缺失空格的完全相同。 o_O

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

感谢您的意见。

-1

尝试改变这个

$$ key = mysql_real_escape_string($ value);

INTO

$键= mysql_real_escape_string($值);

+0

对不起,你是对的,我的错。 – Julian

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 \” - 这是正确的

+1

问题是我有变量$ _POST ['bookingNotes']其中包含 - 让我们说“今天下雨”。这将发送到处理脚本,该脚本将$ _POST ['bookingNotes']转换为$ bookingNotes,然后将内容插入到数据库中的TEXT列中。 数据库中的结果是“今天它”。 '之后的所有东西都不见了。 – Biomech

+0

是的,这就是我认为可能导致中断发生的原因。另一种可以克服的方式是添加strip strips和addslashes。我还没有使用这些方法进行测试,但它也应该起作用。 – Julian

-1

首先mysql_real_escape_string()总是作品。如果你的代码没有 - 呃,这是你的代码。

,但最重要的:NEVER像这样运行

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

代码实际上是安全孔,比任何其他更糟糕。

最后,从你非常模糊的解释来看,这是非常不清楚的,但我想它是HTML表单,你可以在其中得到你的“笔记结尾”。无论如何,你必须修复它发生的地方,不要责怪你很久以前运行的功能

+0

感谢您的意见,您能否解释为什么这是安全漏洞? 我不是“责备”这个函数,我试图找出它为什么不起作用,我知道它在发生什么,为什么会发生 - mysql看到的是“'”,并把它当作结束的字符串。我不知道的是,为什么'在使用我认为应该逃脱它的功能时没有逃脱。 – Biomech

2

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

我假设你看到的不是SQL注入但HTML注入:

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

尝试逃避与

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

,以避免此问题。

+0

方向是对的,但是这个特定的代码不会帮助 –

+0

正确,我忘了告诉它逃脱报价。编辑。 – sba

+0

这不是一个注射问题,它是当数据进入数据库时​​,它到达'时停止。因此,输入“今天是灰色且正在下雨”作为“今天是灰色并且它”存储在数据库中 – Biomech

相关问题