我想知道我写的代码是否可以攻击。
$.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',cuPersonalnr ='7012230303'其中cuID = 1000”
因此,如果他们将cuLastname更改为其他内容,则可能如下所示:
更新客户设置cuFirstname ='charlie',[cuShouldnotbechanged] ='brown',cuPersonalnr ='7012230303'其中cuID = 1000
所以我的问题是:攻击者是否有可能更改这些变量名称?若然,怎么办?
答案 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
数组中的密钥时会发生什么情况的具体问题,在我看来有两种可能性:
如果输入的列名不存在,数据库库要么忽略它(并更新它能够的东西),要么抛出错误(因为UPDATE
语句带有不存在的列名是SQL错误。)
如果他们输入了一个存在但不打算更新的列名,则可能会使用和更新该新列名(除非您的数据库已经为此保护 - 有些需要您明确说明可以用这种方式更新哪些列。)
答案 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()
您可以创建错误变量,并返回错误。