是否可以在jquery Ajax帖子中操作post数据?

时间:2014-03-26 15:08:51

标签: php ajax sql-injection

我想知道我写的代码是否可以攻击。

    $.ajax({
        url: site_url+"/customer/update",
        type: 'POST',
        dataType: "json",
        async: true,
        data: {
            'id':$('#id').val(),
            'cuFirstname':$('#firstname').val(),
            'cuLastname':$('#lastname').val(),
            'cuPersonalnr':$('#personalnr').val(),
        },
    });

在服务器上它看起来像这样:

    $this->db->where('cuID = '.$customerid);
    $this->db->update('customers',$_POST);

所以我想如果有人可以在ajax帖子的数据部分更改变量(cuFirstname,cuLastname,cuPersonalnr),那么他们就可以在那里编写sql代码。

“更新客户设置cuFirstname ='charlie',cuLastname ='brown',cuP​​ersonalnr ='7012230303'其中cuID = 1000”

因此,如果他们将cuLastname更改为其他内容,则可能如下所示:

更新客户设置cuFirstname ='charlie',[cuShouldnotbechanged] ='brown',cuP​​ersonalnr ='7012230303'其中cuID = 1000

所以我的问题是:攻击者是否有可能更改这些变量名称?若然,怎么办?

2 个答案:

答案 0 :(得分:1)

客户端可以更改AJAX调用的任何方面,只需使用自己的参数向URL发出自己的HTTP请求即可。所以,是的,他们可以想象地改变请求的任何部分。

在您的代码中,问题实际上归结为“我的数据库库如何处理更新?”。你正在做以下事情:

$this->db->where('cuID = '.$customerid);
$this->db->update('customers',$_POST);

这可能是建立一个类似的查询:

UPDATE customers SET column1='some value', column2='some other value', ... WHERE cuID='whatever';

基于$_POST数组的键和值。为了解决您在客户更改$_POST数组中的密钥时会发生什么情况的具体问题,在我看来有两种可能性:

  1. 如果输入的列名不存在,数据库库要么忽略它(并更新它能够的东西),要么抛出错误(因为UPDATE语句带有不存在的列名是SQL错误。)

  2. 如果他们输入了一个存在但不打算更新的列名,则可能会使用和更新该新列名(除非您的数据库已经为此保护 - 有些需要您明确说明可以用这种方式更新哪些列。)

答案 1 :(得分:0)

用户可以将SQL代码写入这些变量吗?答案是肯定的。

是否可以接受攻击?这完全取决于您的清理/ SQL输入方法。

您可以使用PDO(正确)等预准备语句来防止这种可能性。

否则清理/检查发送的数据: 它看起来像cuPersonalnr,应该是数字?检查以确保:

if (!is_numeric ($_POST['cuPersonalnr'])) 
    exit();    //script stops, not a number

名字和姓氏,我假设只需要字母数字? 很好地创建一个检查,或者清理任何其他不是字母数字的值:

if(!ctype_alnum($_POST['cuFirstname'])) {
    exit();    //script stops, contains unsafe characters
}

而不是exit()您可以创建错误变量,并返回错误。