【问题标题】:Escaping backslashed doublequote combined with a doublequote? (ie. \"")转义反斜杠双引号和双引号? (IE。 \””)
【发布时间】:2014-08-08 21:48:20
【问题描述】:

我有以下代码:

<?
    $string="< input type=button value='Open' onclick='document.location.href=\"".format_URL("phpfolder",$sesion)."objects/construct.php?id_object=$id_object\"' >";
    mysql_query( "insert into db (code) values ('$string')" );
?>

当使用$string=mysql_real_escape_string($string); 转义时,结果是

$string=\"< input type=button value=\'Open\' onclick=\'document.location.href=\"\".format_URL(\"phpfolder\",$sesion).\"objects/construct.php?id_object=$id_object\"\' >\";

应该是这样的:

$string=\"< input type=button value=\'Open\' onclick=\'document.location.href=\\\"\".format_URL(\"phpfolder\",$sesion).\"objects/construct.php?id_object=$id_object\\\"\' >\";

为什么 mysql_real_escape_string() 无法识别它必须转义 \"" 的第一个反斜杠才能将其转换为 \\\"\"

这是 PHP 中的错误吗?

我已尝试应用 addlashes、html_entities、str_replace、preg_replace 等函数。没有任何效果或我使用错误。

有什么办法呢?

【问题讨论】:

  • 我不明白$string=\" 中的第一个反斜杠来自哪里。该引号不是字符串的一部分,它是 PHP 字符串周围的分隔符。
  • 我同意 Barmar:从您发布的代码中,我不明白为什么 mysql_real_escape_string 函数会添加反斜杠和双引号字符。基于第一个 $string="&lt;input... 分配,$string 中的第一个字符将是小于号。 mysql_real_escape_string 没有理由添加反斜杠和双引号字符。还有其他事情(你没有显示)。
  • 我的错误,$string 位于我正在处理的 php 代码编辑器项目的文本区域中。这就是我需要转义才能在这种情况下工作的原因。

标签: php mysql regex mysql-real-escape-string


【解决方案1】:

不要使用 mysql_* 函数。只需使用准备好的语句,您就不会遇到这个问题。这是 PDO 中的一个示例:

$stmt = $pdoObject->prepare('INSERT INTO MyTable (code) VALUES (:code)');

$stmt->bindParam(':code', $string, PDO::PARAM_STR);

if ($stmt->execute()) {
   echo 'Success';
} else {
   echo 'Failure';
}

就这么简单。更干净、更安全的代码。

现在的主要问题是您将整个 html/js 保存到表中。就大小而言,您的桌子会非常快速地增长。为什么不将基本 ID 或属性保存到表中并通过从表中检索它来构建该 html。

您应该只将$session$id_object 保存到您的表格中。使用这两个变量,您可以在之后构建 html。

【讨论】:

  • 代码编辑器项目是为我们部门的开发人员准备的,所以他们不需要访问服务器来上传或下载代码脚本。这样我就可以强制执行安全问题并保存完整的代码版本。所需的数据库数量没有问题,因为它是一个封闭的环境。
  • 至于准备好的声明,我会研究一下。有任何 PHP 示例可以分享或参考吗?
  • 这按预期工作。我没有使用 PDO,我会全力以赴看看它的范围。
【解决方案2】:

反斜杠在赋值给 $string 变量时转义了双引号。

<?php

$string = "< input type=button value='Open' onclick='document.location.href=\"".'url_output'."objects/construct.php?id_object=id_object\"' >";

echo $string;

输出:

< input type=button value='Open' onclick='document.location.href="url_outputobjects/construct.php?id_object=id_object"' >

所以当它作为 mysql_real_escape_string 的参数给出时,反斜杠一开始就不存在。

双引号在字符串文字的双引号分隔符内,因此它前面的反斜杠为赋值运算符转义双引号。

简化示例:

<?php

$string = "This is a \"string literal\"";

echo $string;

输出:

This is a "string literal"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2018-02-13
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多