首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JS执行MySQL查询及其涉及的安全问题

使用JS执行MySQL查询及其涉及的安全问题
EN

Stack Overflow用户
提问于 2015-01-29 11:27:09
回答 4查看 15.6K关注 0票数 4

我一直在互联网上搜索,寻找一种在JavaScript中定义查询的方法,将该查询传递给PHP。让PHP建立一个MySQL连接,执行查询并返回编码的结果json。

但是,我担心的是这种方法的安全性,因为用户可以篡改查询,做一些您不希望他们做的事情,或者请求您不希望他们看到的数据。

问题

在这样的应用程序/插件中,您建议采取什么样的安全措施来阻止用户请求我不希望他们提供的信息?

编辑

我的插件的最终结果将是

代码语言:javascript
复制
var data = Querier({
    table: "mytable",
    columns: {"column1", "column2", "column3"},
    where: "column2='blablabla'",
    limit: "10"
});

我将让该函数发出AJAX请求,并使用上述数据在PHP中执行查询。我想知道这会带来什么样的安全风险,以及如何防范这些风险。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-02-26 08:25:28

引入简单的JavaScript数据访问 因此,您想要快速建立一个非常酷的Web2.0 JavaScript应用程序的原型,但是您不想花费所有的时间来编写连接代码来访问数据库?传统上,要从数据库获取数据到前端,需要为数据库中的每个表编写一个类,其中包含所有CRUD (CRUD)方法。然后,您需要在上面添加一些编组代码,以便为前端提供一个访问层。然后将JavaScript库放在上面,以访问后端。好痛啊!

文章介绍了另一种方法,在这种方法中,您可以使用单个数据库类包装多个数据库表。一个驱动程序脚本将前端连接到后端,前端的另一个包装类允许您访问所需的所有表。

例子/用法

代码语言: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();
        });
    });
});

我想这正是你要找的。这样你就不用自己建造了。

票数 0
EN

Stack Overflow用户

发布于 2015-01-29 11:34:42

从您的问题中可以看出,您是否允许用户键入将对您的数据库运行的查询,或者您在浏览器中运行的代码是否正在运行(例如,不是用户)。

如果是用户:您必须真正信任他们,因为他们可以(而且可能会)破坏您的数据库。

如果是您在浏览器中运行的代码创建了它们:不要这样做。相反,让客户端代码向服务器发送数据,并使用完全预防措施来制定服务器上的查询,以防止SQL注入(参数化查询等)。

关于您的最新情况:

我至少可以看到几个问题:

  1. 这里有个风险: 其中:“列2=‘blablabla’” 现在,假设我决定在将它发送到服务器之前得到它,并将其更改为: 其中:“column2=”;丢弃桌上的东西;--“

您不能向服务器发送完整的WHERE子句,因为您不能信任它。这就是参数化查询的要点:

相反,请按名称和PHP端指定列,确保您正在正确处理参数值(更多在这里)。

var data = Querier({ table:"mytable",列:{"column1","column2","column3"},其中:{ column2:{ op:'=',值:'blablabla‘}限制:"10“};

现在,您可以构建查询,而不必盲目地信任来自客户端的文本;您需要对列名、运算符等进行彻底的验证。

  1. 向全世界公开关于你的计划的信息就是免费放弃信息。安全是洋葱,洋葱的外层之一是模糊的。它本身远远不够,但它是一个起点。因此,不要让您的客户端代码(因此任何人阅读它)知道您的表名和列名。考虑使用服务器端名称映射等。
票数 4
EN

Stack Overflow用户

发布于 2015-01-29 12:15:34

取决于你打算怎么做,你可能会有一个比这个经济中制造的洞更大的洞,或者根本就没有洞。

如果要在客户端编写查询并发送到php,我将创建一个只有selectinsertdeleteupdate的用户,没有访问任何其他数据库的权限。

如果使用SQlite,请忽略这一点。

我劝你不要这样!

如果您在服务器端构建查询,只需将所需的数据填充到服务器!

我会把代码修改成这样:

代码语言:javascript
复制
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
});

在服务器端,它将生成查询:

代码语言:javascript
复制
select `id`,`name`,`email` from `db.users` where `id`>5 and `name` like '%david%' limit 10

这将是更好的使用。

对于准备好的声明,您可以使用:

代码语言:javascript
复制
select `id`,`name`,`email` from `db.users` where `id`>:id and `name` like :name limit 10

传递给PDO,伪代码:

代码语言:javascript
复制
$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。

很久以前我就想实现这样的东西,这是锻炼我思想的好方法。

也许我会这样实现它!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28213575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档