-2

我有一个用 PHP 处理的表单。它包含有关客户作业的备注字段。问题是,如果注释中有一个 ' - 例如它的 O'Reilly 等,它会转义数据库中的字符串,所以我有所有的注释,直到它遇到 ' 那就结束了的笔记。

我知道有 mysqli_ 和 PDO 之类的东西,但现在是繁忙的季节,我可以在 1 月份进行全面更新/大修之前快速修复这个问题。

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

仅供参考:表格列是文本。还有其他几个领域,因此是 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 将 ' 视为字符串的结尾。但是我不知道为什么会发生这种情况,因为我认为该函数应该转义 ' 并允许它进入数据库。

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

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

“今天很灰暗,它”

TIA 和感谢您迄今为止的回复。

4

5 回答 5

2

你确定问题出在写作端吗?您的代码看起来应该可以工作。(好吧,对于一些工作价值,你不想有一个 field <input name='conn' value='haha'>。无论如何,你似乎已经足够了解代码的问题了。)

我假设您看到的不是 SQL 注入,而是 HTML 注入:

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

尝试用

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

以避免问题。

于 2013-08-07T15:25:52.277 回答
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\' - 这是正确的

于 2013-08-07T15:14:40.413 回答
0

感谢大家提供有用的意见。

现在已经修好了,真的不知道怎么弄。

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

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

我删除了回声,将 SQL 放回原处,一切都按预期工作。

我在开始工作之前备份了脚本,此后我将“新”工作脚本与失败的原始脚本进行了比较,它们完全相同,没有丢失字符或多余/丢失的空格,完全相同。o_O

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

无论如何,感谢您的输入。

于 2013-08-09T10:24:23.720 回答
-1

尝试改变这个

$$key = mysql_real_escape_string($value);

进入

$key = mysql_real_escape_string($value);

于 2013-08-07T14:58:03.247 回答
-1

首先mysql_real_escape_string() 始终有效。如果您的某些代码没有 - 好吧,那是您的代码。

其次,但最重要的是:永远不要运行这样的代码

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

它实际上是一个安全漏洞,比任何其他漏洞都糟糕。

最后,从您极其模糊的解释中,我们非常不清楚,但我想这是您获得“笔记结尾”的 HTML 表单。无论如何,你必须修复它发生的地方,而不是责怪你很久以前运行的函数

于 2013-08-07T15:15:39.650 回答