【问题标题】:Database Exposure: Best Practices数据库暴露:最佳实践
【发布时间】:2013-10-06 18:21:54
【问题描述】:

我是一个相对较新的网络程序员,目前正在从事我的第一个主要项目。我正在使用 angular、express(在节点之上)和图形数据库 neo4j。现在,我正在尝试确定设置 Web 应用程序如何与数据库交互的最佳方式(在安全性和速度优化方面)。

现在我觉得我有点盲目地进行此操作 - 我正在寻找最佳实践指南、需要考虑的安全问题以及任何其他相关建议或设置中需要注意的陷阱建立一个网络应用程序后端。

为了更具体地说明这一点,我将让您了解我现在是如何设置路线的。以下是 app.js 文件中的路由设置。

    //match database query functions
function dataQuery(req, res) {
    var func = database[req.param('query')];
    func(req, res);
}
    //match database create functions
function dataCreate(req, res) {
    var func = database[req.param('create')];
    func(req, res);
}
//handle data queries
app.get('/query/:query', dataQuery);

//handle adding new content
app.post('/create/:create', dataCreate)

基本上我已经设置了它,以便我 POST 或 GET 到一个 url,它只是去执行一个函数。我本质上是在 url 中命名我想运行的函数:/query/theNameOfTheFunction。然后这些函数开始构建密码查询(neo4j 的查询语言),利用请求中的信息与数据库交互或处理添加用户上传的图像等事情。

示例:创建内容(URL:/query/createContent)

exports.createContent = function (req, res) {

    var content = JSON.parse(req.query.content);
    var query = ("CREATE (n:Content {Title: {title}, URL: {url}, Description: {description}, Source: {source}, Links: {links}, Value: {valueStatement} })");

    query = query.replace("{title}", "\"" + content.title + "\"");
    query = query.replace("{url}", "\"" + content.url + "\"");
    query = query.replace("{description}", "\"" + content.description + "\"");
    query = query.replace("{source}", "\"" + content.source + "\"");
    query = query.replace("{links}", "\"" + content.links + "\"");
    query = query.replace("{valueStatement}", "\"" + content.valueStatement + "\"");

   db.query(query, function (err, results) {
       if (err) {res.send()};
       res.send();
   });
}

这里我有一个查询模板,只需使用替换插入用户生成的信息。

示例:将图像添加到服务器(URL:/create/addImage)

exports.addImage = function (req,res) {
    var url = req.query.url;
    var fileName = req.query.fileName;

    console.log(req.query);
    request(url).pipe(fs.createWriteStream("./img/submittedContent/" + fileName));
    res.send();
}

似乎这种方法的可扩展性可能不是很好,但我不确定如何最好地组织服务器端的代码。

我想提及的另一个具体示例是以下案例。查询本身很复杂,我现在已经将它的创建推送到客户端(查询查找与用户选择的术语相关的内容,并相应地改变长度)。客户端发送创建它的查询被传递到 neo4j api。显然这里有一些问题——如果用户能够定义查询,他们可以对数据库执行任何操作(删除所有内容或其他)。我不清楚有人如何准确地做到这一点,但它确实看起来是可行的。

exports.getContent = function (req, res) {
    var query = req.query.query;

        //would checking for black/white list key terms be enough security? (remove, create, set, etc)

    db.query(query, function (err, results) {
        if (err) {throw err};
        res.send(results);
    });
}

我是不是完全走错了方向?我从来没有对服务器端脚本进行过正式介绍,而且只是从我读过的东西中解脱出来。我想以“正确的方式”来做,但我需要先知道那种方式是什么......

【问题讨论】:

  • “我正在寻找的是最佳实践指南、需要考虑的安全问题以及在设置 Web 应用后端时需要注意的任何其他相关建议或陷阱." 你的问题写得太宽泛了……你能缩小范围吗?有些书可以在合理的页数内涵盖您正在寻找的内容。 :)
  • 如果您能推荐任何书籍,我会很高兴。不过,您显然是对的……似乎我无法用我现在所拥有的知识来表达一个简洁的问题。可能立即有益的是解释将 url 映射到特定功能是否是一个糟糕的设计选择,以及可能存在哪些更好的替代方案。我只是不知道服务器上应该存在什么样的模型和对象。如果您能指出我的任何其他资源,我将不胜感激。

标签: node.js security angularjs express neo4j


【解决方案1】:

只是一些随机指针:

  • 我建议设置一个 RESTful Web API 来处理 Angular 和您的数据库之间的通信;无需自己发明所有路由,这也意味着您可以使用出色的库,如 Restangular(用于客户端)和 Restify(用于服务器)来处理通信;
  • 不确定您使用的是哪个 Neo4j 驱动程序,但我很确定它们都支持参数化查询,这意味着您不需要执行所有这些 query.replace() 调用 (see);
  • 根据可能上传的图像数量,将它们存储在文件系统中可能没问题,尽管您永远不应该相信传递的文件名;如果你想要更多的可扩展性,你可以考虑使用 MongoDB 的GridFS
  • 永远不要相信从客户端传递的查询将在服务器上执行;如果您可以在客户端构建查询,您也可以在服务器端构建它,并将信息从客户端传递到服务器(同样,使用参数化查询);

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2018-11-19
    • 1970-01-01
    • 2014-08-01
    相关资源
    最近更新 更多