escape urldecode unescape путаница - PullRequest
0 голосов
/ 03 марта 2011

У меня есть редактор TinyMCE, содержимое которого необходимо загрузить с помощью AJAX.

Очевидно, что из-за того, что AJAX отправляет параметры, их необходимо экранировать с помощью функции escape () javascripts, так что она не нарушает параметры AJAX. Поля mysql_real_escape_string 'на стороне PHP, мне нужно только экранировать для параметров AJAX.

К сожалению, когда я добавляю ссылки и изображения в редактор, а затем отправляю, URL-адреса к изображениям и ссылкам выглядят так:

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

На странице, где содержимое отображается пользователю (страница просмотра продукта), строка из базы данных пропускается через urldecode(), чтобы избавиться от всех %22 и других экранированных символов. На этой странице нет javascript, все это генерируется с помощью PHP, следовательно, urldecode(), а не unescape(). Есть ли способ обойти это?

КОД:

AJAX Send

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";
}

Ответы [ 3 ]

3 голосов
/ 03 марта 2011

Из 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.

Так что не используйте escape, это устарело:)

1 голос
/ 03 марта 2011

Казалось, ответ лежит в TinyMCE, я mysql_real_escape_string писал строку, но TinyMCE делает это уже для вас по умолчанию, поэтому, когда php убирал эти символы, он избегал только одного его экземпляра, а не всех экземпляров. этого.

1 голос
/ 03 марта 2011

только заметка на вашей вставке базы данных.

  1. Вы не должны использовать urldecode для вставки базы данных.urlancodes не имеет ничего общего с базами данных.для вставки должны использоваться только функции, связанные с базой данных.
    Делайте это где-нибудь еще, а не во время вставки данных в базу данных.mysql_real_escape_string должна быть самая последняя вещь , примененная к данным перед вставкой.Или вы все сломали (как вы делаете в данный момент)

  2. незначительная проблема.немного лучше использовать mysql_real_escape_string вместо mysql_escape_string.Для некоторых странных кодировок это закроет ваши спины.

  3. Самое ужасное.Вы не дезинфицируете номера.Итак, ваш код открыт для SQL-инъекций.Вы должны либо

    • экранировать его так же, как строки, как вы уже цитировали его
    • , или приводить его к типу пробера, используя функцию intval (), например
    • или избавьтесь от всех экранирующих кавычек и приведений и используйте подготовленные операторы для привязки переменных.(это потребует существенных изменений кода)

То же самое для переменной псевдонима и, я полагаю, всех других динамических запросов на вашем сайте.Вы должны исправить это как можно скорее.

...