从客户端传递选择查询

时间:2015-04-21 10:10:06

标签: javascript database

将数据库查询(选择或更新或其他)作为参数传递给服务器端是否正常(我的意思是安全性原因)(比如,我读取表单字段的值,在javascript中形成查询字符串并传递将字符串形成为服务器作为参数):

$.ajax({
    url : "servletURL",
    type : "post",
    data: {query: "select name, last_name from employees"},
    success: //do things
});

var name = document.getElementById('name').value;
var last_name = document.getElementById('last_name').value;
$.ajax({
    url : "servletURL",
    type : "post",
    data: {query: "select * from employees where name="+name+" and last_name="+last_name},
    success: //do things
});

或者我应该只向服务器传递参数,而不是完整的查询,并在那里制作预备语句?

当然,我可以在将请求发送到服务器之前检查字段值的有效性。

2 个答案:

答案 0 :(得分:3)

除非您正在构建明确用于在数据库(PHPMyAdmin等)上执行查询的内容,否则从不可以执行此操作。

为什么?
恶意用户现在可以删除您的整个数据库,只需编辑javascript即可。

$.ajax({
  url: "",
  type: "post",
  data: {query: "DROP database"},
  success:
  })

最佳做法是将数据发送到服务器,然后在那里构建查询 剩下的唯一攻击是SQL注入。此解决方案特定于每种语言,但您可以查看Tom Scott's explanation on it

答案 1 :(得分:2)

不要将查询作为参数传递。最好避免使用查询模板。安全漏洞很宽,为了关闭它们,您需要在验证代码中使用完整的SQL解析器。

在你的例子中,想象一下中间人攻击 这会更改实例化的查询

select * from employees where name='<name>' and last_name='<last_name>'

select * from employees where name='<name>' and last_name='<last_name>'
union all
select * from employees

只需附加一个常量字符串