0

TinyMCEエディターがあります-その内容はAJAXによってアップロードされる必要があります。

明らかに、AJAXがパラメーターを送信するため、javascriptsのescape()関数を介してパラメーターをエスケープする必要があります。これは、AJAXパラメーターを壊さないようにするためです。フィールドはmysql_real_escape_stringPHP側で編集され、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

エスケープおよびアンエスケープ機能は、非ASCII文字に対しては正しく機能せず、非推奨になりました。JavaScript 1.5以降では、encodeURI、decodeURI、encodeURIComponent、およびdecodeURIComponentを使用します。

したがって、エスケープは使用しないでください。非推奨です:)

于 2011-03-03T10:25:46.483 に答える
1

答えはTinyMCEにあるようでした。私はmysql_real_escape_string文字列を使用していましたが、TinyMCEはデフォルトですでにそれを実行しているため、phpがこれらの文字をエスケープ解除したとき、すべてのインスタンスではなく、1つのインスタンスのみをエスケープしていました。

于 2011-03-03T13:42:25.283 に答える
1

データベース挿入に関するメモ。

  1. データベースの挿入にurldecodeを使用しないでください。urlancodesはデータベースとは何の関係もありません。挿入には、データベース関連の関数のみを使用する必要があります。
    データがデータベースに挿入されるときではなく、別の場所でそれを行います。mysql_real_escape_stringは、挿入前にデータに適用される最後のものである必要があります。またはあなたはすべてを壊しました(あなたが今しているように)

  2. マイナーな問題。mysql_escape_stringの代わりにmysql_real_escape_stringを使用する方が少し良いです。いくつかの奇妙なエンコーディングでは、それはあなたの背中をカバーします。

  3. 最もひどいこと。あなたは数字を消毒していません。したがって、コードはSQLインジェクション攻撃に対してオープンです。あなたはどちらかをしなければなりません

    • すでに引用しているので、文字列と同じようにエスケープします
    • または、たとえばintval()関数を使用して、プローバータイプにキャストします
    • または、エスケープされているすべての引用符とキャストを取り除き、プリペアドステートメントを使用して変数をバインドします。(コードを大幅に変更する必要があります)

エイリアス変数についても同じで、サイト内の他のすべての動的クエリについても同じだと思います。できるだけ早く修正する必要があります。

于 2011-03-03T10:40:54.520 に答える