我一直在互联网上搜索,寻找一种在JavaScript中定义查询的方法,将该查询传递给PHP。让PHP建立一个MySQL连接,执行查询并返回编码的结果json。
但是,我担心的是这种方法的安全性,因为用户可以篡改查询,做一些您不希望他们做的事情,或者请求您不希望他们看到的数据。
问题
在这样的应用程序/插件中,您建议采取什么样的安全措施来阻止用户请求我不希望他们提供的信息?
编辑
我的插件的最终结果将是
var data = Querier({
table: "mytable",
columns: {"column1", "column2", "column3"},
where: "column2='blablabla'",
limit: "10"
});我将让该函数发出AJAX请求,并使用上述数据在PHP中执行查询。我想知道这会带来什么样的安全风险,以及如何防范这些风险。
发布于 2015-02-26 08:25:28
引入简单的JavaScript数据访问 因此,您想要快速建立一个非常酷的Web2.0 JavaScript应用程序的原型,但是您不想花费所有的时间来编写连接代码来访问数据库?传统上,要从数据库获取数据到前端,需要为数据库中的每个表编写一个类,其中包含所有CRUD (CRUD)方法。然后,您需要在上面添加一些编组代码,以便为前端提供一个访问层。然后将JavaScript库放在上面,以访问后端。好痛啊!
这文章介绍了另一种方法,在这种方法中,您可以使用单个数据库类包装多个数据库表。一个驱动程序脚本将前端连接到后端,前端的另一个包装类允许您访问所需的所有表。
例子/用法
// Sample functions to update authors
function updateAuthorsTable() {
dbw.getAll( function(data) {
$('#authors').html('<table id="authors"><tr><td>ID</td><td>Author</td></tr></table>');
$(data).each( function( ind, author ) {
$('#authors tr:last').after('<tr><td>'+author.id+'</td><td>'+author.name+'</td></tr>');
});
});
}
$(document).ready(function() {
dbw = new DbWrapper();
dbw.table = 'authors';
updateAuthorsTable();
$('#addbutton').click( function() {
dbw.insertObject( { name: $('#authorname').val() },
function(data) {
updateAuthorsTable();
});
});
});我想这正是你要找的。这样你就不用自己建造了。
发布于 2015-01-29 11:34:42
从您的问题中可以看出,您是否允许用户键入将对您的数据库运行的查询,或者您在浏览器中运行的代码是否正在运行(例如,不是用户)。
如果是用户:您必须真正信任他们,因为他们可以(而且可能会)破坏您的数据库。
如果是您在浏览器中运行的代码创建了它们:不要这样做。相反,让客户端代码向服务器发送数据,并使用完全预防措施来制定服务器上的查询,以防止SQL注入(参数化查询等)。
关于您的最新情况:
我至少可以看到几个问题:

您不能向服务器发送完整的WHERE子句,因为您不能信任它。这就是参数化查询的要点:
相反,请按名称和PHP端指定列,确保您正在正确处理参数值(更多在这里)。
var data = Querier({ table:"mytable",列:{"column1","column2","column3"},其中:{ column2:{ op:'=',值:'blablabla‘}限制:"10“};
现在,您可以构建查询,而不必盲目地信任来自客户端的文本;您需要对列名、运算符等进行彻底的验证。
发布于 2015-01-29 12:15:34
取决于你打算怎么做,你可能会有一个比这个经济中制造的洞更大的洞,或者根本就没有洞。
如果要在客户端编写查询并发送到php,我将创建一个只有select、insert、delete和update的用户,没有访问任何其他数据库的权限。
如果使用SQlite,请忽略这一点。
我劝你不要这样!
如果您在服务器端构建查询,只需将所需的数据填充到服务器!
我会把代码修改成这样:
var link = QuerierLink('sql.php');//filename to use for the query
var data = Querier('users',link);//locks access to only this table
data.select({
columns: ['id','name','email'],
where: [
{id:{'>':5}},
{name:{'like':'%david%'}}
],
limit:10
});在服务器端,它将生成查询:
select `id`,`name`,`email` from `db.users` where `id`>5 and `name` like '%david%' limit 10这将是更好的使用。
对于准备好的声明,您可以使用:
select `id`,`name`,`email` from `db.users` where `id`>:id and `name` like :name limit 10传递给PDO,伪代码:
$query='select `id`,`name`,`email` from `'.$database_name.'.users` where `id`>:id and `name` like :name limit 10';
$result=$PDO->exec($query,array(
'id'=>5,
'name'=>'%david%'
)
);这是一种更好的方式,因为您可以更好地控制传递的内容。
另外,按照表的名称设置确切的数据库名称,这样可以避免用户访问其他表/数据库中的内容。
其他数据库包括information_schema,它拥有从整个数据库中获取的每一条信息,包括用户列表和限制。
对于SQlite,忽略这一点。
如果要使用MySQL/MariaDB/other,则应该禁用所有读/写权限。
您真的不希望有人将文件写入您的服务器!特别是进入,任何他们想要的位置。
风险:他们有一个新的小狗为攻击者做他们想做的!这是一个巨大的洞。
解决方案:禁用文件特权或限制对使用.htaccess阻止外部访问的目录的访问,使用--secure_file_priv或系统变量@@secure_file_priv。
如果使用SQlite,只需为每个连接的客户端创建一个基于模板文件的.sqlite(3)文件。然后,当用户关闭连接时删除该文件,或每n分钟对超过x时间的文件报废一次。
风险:用.sqlite文件填充磁盘。
解决方案:尽早清除文件或使用带有cron作业的ramdisk。
很久以前我就想实现这样的东西,这是锻炼我思想的好方法。
也许我会这样实现它!
https://stackoverflow.com/questions/28213575
复制相似问题