Php 转义以插入MySql
我有一个php页面,它使用Php 转义以插入MySql,php,mysql,escaping,Php,Mysql,Escaping,我有一个php页面,它使用mysql\u real\u escape\u string()来转义包含单引号的内容。我相信它使用的是utf-8(但我不确定)。当我插入一些内容时,我得到了以下mysql警告(它在内容中添加了一个?而不是'in'): 不正确的字符串值:'\x92t 以下是我的php示例: $link = ConnectToServer($theIntranet, $theUser, $thePW); $theTagToFind = 'ac'; $theTagToUse = '
mysql\u real\u escape\u string()
来转义包含单引号的内容。我相信它使用的是utf-8(但我不确定)。当我插入一些内容时,我得到了以下mysql警告(它在内容中添加了一个?而不是'in'):
不正确的字符串值:'\x92t
以下是我的php示例:
$link = ConnectToServer($theIntranet, $theUser, $thePW);
$theTagToFind = 'ac';
$theTagToUse = 'trc';
$database = '{databaseName}';
$theQuery = "SELECT * FROM {$database}.templates
WHERE content like '%{" . $theTagToFind . ":%'";
$updates = fopen('001_intranet_change' . strtoupper($theTagToFind) . 'to' . strtoupper($theTagToUse) . '.sql', 'w+');
$rollback = fopen('001_intranet_change' . strtoupper($theTagToUse) . 'backto' . strtoupper($theTagToFind) . '.sql', 'w+');
$theResultHandle = mysql_query($theQuery, $link);
$comment = "--Update All $theTagToFind tags to $theTagToUse tags in $database --";
fwrite($updates, $comment . "\r\n\r\n");
fwrite($rollback, "--Rollback - Convert all $theTagToUse tags back to $theTagToFind tags --\r\n\r\n");
mysql_set_charset('latin1');
while (($data = mysql_fetch_assoc($theResultHandle)) != false)
{
$rb_content = $data['content'];
$data['content'] = preg_replace("/{" . $theTagToFind . ":/", "{" . $theTagToUse . ":", $data['content']);
$theResult[] = $data;
$update_script = "\r\n
Update $database.templates
SET content = '" . mysql_real_escape_string($data['content']) . "'
WHERE _id = " .$data['_id'] . ";";
$rollback_script = "\r\n
UPDATE $database.templates
SET content = '" . mysql_real_escape_string($rb_content) . "'
WHERE _id = " . $data['_id'] . ";";;
fwrite($updates, $update_script);
fwrite($rollback, $rollback_script);
}
fclose ($updates);
fclose($rollback);
print_r($theResult);
而$data['content']
可以等于:
“你好,
请记住联系医生办公室,电话是……“您确定您的服务器配置正确并且已关闭吗?这些值可能具有双重转义值的效果 您可以通过查看
$\u POST
数据来测试这一点,看看它是否根据您的预期进行了修改。如果是,请查看是否可以在php.ini
中修复该设置
请注意,您不应该在新代码中使用mysql\u query
。它很危险,已弃用,将在PHP的未来版本中删除。使用是最安全、最简单的逃跑方式
在这里的简短示例中,您似乎忘记了转义$data[''u id']
,这意味着这可能是一个SQL注入错误。即使是一个错误也可能造成严重后果,因此永远不要将未替换的数据放入查询字符串中。给你
mysql_set_charset('utf8');
您必须确保表定义中的字符集也设置为utf8谢谢tadman,(我没有投反对票)。这是一个intranet应用程序,该组织的标准是使用mysql_query()(我想他们不会很快更新PHP)。我很确定这个错误与mysql和uft8有关,而不是双转义(因为单引号的utf8表示形式是\x92),魔引号不会导致错误的字符串错误;mysql_查询并不危险;转义的_id对任何人都没有帮助。好吧,不管您是否希望将未转义的值放入您的查询中。该值在转义之前是什么样子的?你需要
echo
it来找出答案。@tadman,我同意应该对值进行转义。因为我只是编写一个实用脚本来更新数据并将其从一个db移动到另一个db,所以它并不重要(根本没有用户输入)。这在我的帖子里没有解释,所以你不可能知道。然而,发生了一些不同的事情,阻止了转义“这是一个intranet应用程序,组织的标准是使用mysql_query()”,这听起来像是一个功能失调的组织。过去,我(被动地、积极地)在名为VulnerableMySql_Query()
的包装函数中封装了对不安全方法的调用,并使用不推荐的方法使用类似“//As per[requester's email address]”的代码注释。像这样的选择看起来像是小问题,但当你负责维护和修复它时,有助于了解外部需求在哪里破坏了你的工作。我尝试使用mysql\u set\u charset('latin1'),因为表就是这样设置的。不幸的是,我正在做的是写入一个文本文件以便稍后导入(我必须创建一种方法来更新表的生产版本)。我会发布我剩下的代码,你可以看一下。