2013-10-06 89 views
0

我是一个相对较新的网络程序员,目前我正在开发我的第一个重大项目。我使用角度,表达(在节点顶部)和图形数据库neo4j。现在我正在尝试确定最佳(安全性和速度优化)方式来设置Web应用程序与数据库的交互方式。数据库曝光:最佳实践

现在我觉得我正在盲目地进入这个领域 - 我正在寻找的是最佳实践指南,需要考虑的安全问题以及需要了解的其他相关建议或陷阱设置一个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的查询语言)。

示例:创建内容(网址:/查询/ 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(); 
    }); 
} 

在这里,我已经得到了查询模板,只是在用户使用拖放更换产生的信息。

例如:将图像添加到服务器(网址:/制作/ 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); 
    }); 
} 

我要对这个东西完全错误的领导?我从来没有对服务器端脚本进行过正式的介绍,而只是关注我读过的东西。我想这样做是'正确的方式',但我需要知道这是第一种方式...

+0

*“我正在寻找的是最佳实践指南,需要考虑的安全问题以及在设置Web应用程序后端时要注意的任何其他相关建议或陷阱。”*您的问题范围太广泛,可以缩小范围吗?有些书籍可以在合理的页面中涵盖您要查找的内容。 :) – WiredPrairie

+0

如果你能推荐任何书,我会很高兴。你显然是对的,尽管......看来我无法用我现在的知识来表达一个简洁的问题。可能立即有益的是解释将网址映射到特定功能是否是糟糕的设计选择以及可能存在哪些更好的替代方案。我只是不知道应该在服务器上存在哪种模型和对象。如果你能指点我任何其他资源,我将不胜感激。 – bornytm

回答

3

只是一些随机指针:

  • 我建议设立一个RESTful网络API来处理角度和数据库之间的通信;它不需要自己发明所有路线,也意味着您可以使用像Restangular(用于客户端)和Restify(用于服务器)的伟大库来处理通信;
  • 不知道您使用的是哪个Neo4j驱动程序,但我确定它们都支持参数化查询,这意味着您不需要执行所有这些调用(see);
  • 取决于可能上传的图像数量,将它们存储在文件系统中可能没有问题,尽管您不应该信任传入的文件名;如果你想要更多的可扩展性,你可以考虑使用MongoDB的GridFS;
  • 永不相信从客户端传递的查询在服务器上执行;如果您可以在客户端构建查询,则还可以使用从客户端传递到服务器的信息(再次使用参数化查询)在服务器端构建它;