我有一个TinyMCE编辑器 - 其中的内容需要由AJAX上传。
显然由于AJAX发送参数,它们需要通过javascripts escape()函数进行转义,这样就不会破坏AJAX参数。这些字段在PHP端是mysql_real_escape_string
,我只需要转义AJAX参数。
不幸的是,当我将链接和图像添加到编辑器中然后提交时,图像和链接的URL显示如下:
http://localhost:8888/%22../img/miscimages/hwo-american.gif/%22
在向用户显示内容的页面(产品视图页面)上,数据库中的字符串通过urldecode()
运行,以清除所有%22
和其他转义字符。这个页面上没有javascript,它都是用PHP生成的,因此是urldecode()
而不是unescape()
。有没有办法解决这个问题?
CODE:
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> </p><h1>Fiddes $product_title</h1><hr />";
$productDetail .= "$product_text";
}
答案 0 :(得分: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。
所以不要使用escape,它已被弃用:)
答案 1 :(得分:1)
只是关于数据库插入的说明。
您不应该将urldecode用于数据库插入。 urlancodes与数据库无关。对于插入,只应使用与数据库相关的函数 在其他地方执行,而不是将数据插入数据库的时间。在插入之前,mysql_real_escape_string应该是最后一个应用于数据的东西。或者你打破了一切(正如你现在所做的那样)
一个小问题。使用mysql_real_escape_string而不是mysql_escape_string稍微好一些。对于一些奇怪的编码,它将覆盖你的背部。
最可怕的事情。你没有消毒数字。所以,你的代码是开放的SQL注入攻击。你必须
alias变量相同,我想,您网站中的所有其他动态查询。你应该尽快解决它。
答案 2 :(得分:1)
似乎答案在于TinyMCE,我是mysql_real_escape_string
字符串,但TinyMCE默认为你做了这个,所以当php没有使用这些字符时,它只是转义它的一个实例,而不是它的所有实例。