使用AJAX时没有正确转义引号

时间:2012-12-30 18:33:41

标签: php html mysql ajax

这个javascript / AJAX正在我的localhost服务器上工作,但是当我将它移动到共享主机时,它现在在MySQL调用中的非对象上抛出一个被调用的成员函数execute()的错误。

HTML:

onclick="showTrending('page_views DESC', 'product.active= "y" 
AND product.deleted= "n" ', '12', 'popular')"

然后是javascript:

function showTrending(mysql_order, mysql_limit, limit, trend)
{
$.ajax({ type: "POST", 
url: '/ajax/product_trending.php', 
data: {Mysql_Order: mysql_order, Mysql_Limit: mysql_limit, Limit: limit},
cache: false, 
success: function(result) {
 // if productSubType array is defined and has at least one element, display subcategory list
if(result != 0){...

和错误输出的AJAX中调用的PHP文件:

//Retrieve subcategories for supplied product type
if(isset($_POST['Mysql_Order']) && isset($_POST['Mysql_Limit']) 
&& isset($_POST['Limit'])){
$mysql_order = $_POST['Mysql_Order'];
$mysql_limit = $_POST['Mysql_Limit'];
$limit = $_POST['Limit'];
//Overlay for wishlist
if(!isset($_SESSION['email'])){
    $item_wishlist = NULL;
} else{
    $item_wishlist = $_SESSION['id'];
}
//Get product records from db
require_once($GLOBALS['domain'].'includes/connection.inc.php');
$db = dbConnect();
$stmt = $db->stmt_init();


$stmt = $db->prepare("SELECT product.id, product.image_thumb, product.title,
    product.eng_title, product.price, seller.shop_name, seller.id FROM product 
    INNER JOIN seller ON product.seller_id=seller.id WHERE $mysql_limit ORDER BY
    $mysql_order LIMIT 0,$limit"); <-- This is the part that errors


$stmt->execute();
$stmt->bind_result($row['product_id'], $row['image_thumb'], $row['title'],
    $row['eng_title'], $row['price'], $row['shop_name'], $row['seller_id']);
$counter = 0;
$product_array = array();
while ($stmt->fetch()){
    ...store variables
    $counter++;
}
if($counter > 0){
    echo json_encode($product_array);
}else{
    echo json_encode(0);
}
}

问题是当我插入从HTML传递的POST变量时,我没有正确准备MySQL字符串。我测试并确认它是有效的,如果我只是为MySQL编写以下内容:

"SELECT product.id, product.image_thumb, product.title,
 product.eng_title, product.price, seller.shop_name, seller.id FROM product 
 INNER JOIN seller ON product.seller_id=seller.id WHERE product.active= 'y' 
AND product.deleted= 'n' ORDER BY
 page_views DESC LIMIT 0,12"

我应该如何正确编写初始HTML调用,以便在MySQL中获得所需的结果?

2 个答案:

答案 0 :(得分:1)

你的主机可能有一个名为magic_quotes的古老PHP功能,它会导致所有GET / POST / etc数据被自动转义。这是(一种非常糟糕的)防止SQL注入的方法,现在已经弃用了。

你的脚本有一个明显的SQL注入漏洞,这个功能确实“保护”你。重写您的脚本,以便不会将用户输入添加到SQL字符串中 - 最好是使用参数化查询(google it)。

答案 1 :(得分:1)

我想提请您注意$mysql_order受SQL注入的影响。

仅仅因为您使用预准备语句并不意味着查询是安全的。 您需要为$mysql_order part使用白名单。