0

我有一个 TinyMCE 编辑器 - 其内容需要通过 AJAX 上传。

显然,由于 AJAX 发送参数,它们需要通过 javascripts escape() 函数进行转义,这样它就不会破坏 AJAX 参数。这些字段mysql_real_escape_string在 PHP 端是 'ed,我只需要对 AJAX 参数进行转义。

不幸的是,当我将链接和图像添加到编辑器中然后提交时,图像和链接的 URL 如下所示:

http://localhost:8888/%22../img/miscimages/hwo-american.gif/%22

在向用户显示内容的页面(产品视图页面)上,数据库中的字符串被运行urldecode()以去除所有%22和其他转义字符。此页面上没有 javascript,它都是用 PHP 生成的,因此urldecode()而不是unescape(). 有没有办法解决?

代码:

AJAX 发送

function update(){
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }else{// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange=function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            var response = xmlhttp.responseText;
            alert(response);
            window.location = 'admin-products.php';
        }
    }
    var prodID=document.getElementById("editchoice").value;
    var edittitle=escape(document.getElementById("editname").value);
    var editcategory=document.getElementById("editcat").value;
    var editcontent = escape(tinyMCE.get('editcontent').getContent());
    var parameters= "prodID="+prodID+"&title="+edittitle+"&content="+editcontent+"&cat="+editcategory;
    xmlhttp.open("POST", "../scr/editProduct.php", true);
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.send(parameters);
}

PHP 数据库插入

$prodID = $_POST['prodID'];
$title = urldecode(mysql_escape_string($_POST['title']));
$content = urldecode(mysql_escape_string($_POST['content']));
$category = $_POST['cat'];

echo $prodID . $title . $content . $category;

mysql_query("UPDATE product SET title='$title', content='$content', category_id='$category' WHERE id='$prodID'") or die("ERROR: ".mysql_error());

PHP 在页面上显示

/* Get Product from Alias */
$alias = $_GET['name'];
$product_selectProd = mysql_query("SELECT * FROM product WHERE alias='$alias'") or die("ERROR: ". mysql_error());

/* Sort Query Vars */
while($product_arrayProd = mysql_fetch_array($product_selectProd)){
    $product_category = $product_arrayProd['category_id'];
    $product_title = urldecode($product_arrayProd['title']);
    $product_text = urldecode($product_arrayProd['content']);
    $product_image = $product_arrayProd['main_image'];
    $product_sub_image = $product_arrayProd['sub_image'];

    /* Build the Product List */
    $productDetail .= "<img src='$product_image' width='350' height='240' class='prod_image_left' /><img src='$category_image' width='350' height='240' class='prod_image_right' />";
    $productDetail .= "<p>&nbsp;</p><h1>Fiddes $product_title</h1><hr />";
    $productDetail .= "$product_text";
}
4

3 回答 3

3

来自 MDC:https ://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Functions#escape_and_unescape_Functions

escape 和 unescape 函数不适用于非 ASCII 字符,已被弃用。在 JavaScript 1.5 及更高版本中,使用 encodeURI、decodeURI、encodeURIComponent 和 decodeURIComponent。

所以不要使用转义,它已被弃用:)

于 2011-03-03T10:25:46.483 回答
1

似乎答案就在 TinyMCE 中,我正在mysql_real_escape_string输入字符串,但默认情况下 TinyMCE 已经为您完成了,所以当 php 对这些字符进行转义时,它只是转义了它的一个实例,而不是它的所有实例。

于 2011-03-03T13:42:25.283 回答
1

只是关于您的数据库插入的注释。

  1. 您不应该将 urldecode 用于数据库插入。urlancodes 与数据库无关。对于插入,应仅使用与数据库相关的函数。
    在其他地方进行,而不是在将数据插入数据库的时候。mysql_real_escape_string 应该是在插入之前应用于数据的最后一件事。或者你打破了一切(就像你现在所做的那样)

  2. 一个小问题。使用 mysql_real_escape_string 而不是 mysql_escape_string 稍微好一些。对于一些奇怪的编码,它会覆盖你的背部。

  3. 最可怕的事情。你不是在清理数字。因此,您的代码对 sql 注入攻击是开放的。你必须要么

    • 以与字符串相同的方式对其进行转义,因为您已经引用了它
    • 或将其转换为探测器类型,例如使用 intval() 函数
    • 或摆脱所有转义引用和强制转换并使用准备好的语句来绑定变量。(这将需要重大的代码更改)

别名变量也是如此,我想您站点中的所有其他动态查询也是如此。你应该尽快修复它。

于 2011-03-03T10:40:54.520 回答