我是一个相对较新的网络程序员,我目前正在做我的第一个主要项目。我正在使用 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)
基本上我已经设置好了,以便我发布或获取到一个 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);
});
}
我对这件事的看法完全错了吗?我从来没有对服务器端脚本进行过正式介绍,而且只是从我读过的东西中解脱出来。我想以“正确的方式”来做,但我需要先知道那种方式是什么......