将数据库查询(选择或更新或其他)作为参数传递给服务器端是否正常(我的意思是安全性原因)(比如,我读取表单字段的值,在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
});
或者我应该只向服务器传递参数,而不是完整的查询,并在那里制作预备语句?
当然,我可以在将请求发送到服务器之前检查字段值的有效性。
答案 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
只需附加一个常量字符串