Javascript 更好更快的评估方法?
我希望动态生成查询并使用以下代码段:Javascript 更好更快的评估方法?,javascript,performance,node.js,Javascript,Performance,Node.js,我希望动态生成查询并使用以下代码段: --snip-- module.exports = { get : function(req, res, next) { var queryStr = "req.database.table('locations').get(parseInt(req.params.id))"; if (req.params.id) { if (req.fields) { queryStr += '.pick(' + req.fieldsStr
--snip--
module.exports = {
get : function(req, res, next) {
var queryStr = "req.database.table('locations').get(parseInt(req.params.id))";
if (req.params.id) {
if (req.fields) {
queryStr += '.pick(' + req.fieldsStr + ')';
}
console.log(queryStr);
eval(queryStr).run(function(result) {
console.log(result);
res.send(result);
});
} else if (!req.params.id) {
--snip--
然而,引入eval打开了我的代码注入(req.fields充满了url参数),我看到我的应用程序的响应时间从7毫秒增加到11毫秒
有没有更聪明的方法来完成我在这里所做的事情
请给出建议。如果我理解正确,您应该使用以下内容:
--snip--
module.exports = {
get : function(req, res, next) {
var queryResult = req.database.table('locations').get(parseInt(req.params.id));
if (req.params.id) {
if (req.fields) {
queryResult = queryResult.pick.apply(queryResult, getFields(req.fieldsStr));
}
queryResult.run(function(result) {
console.log(result);
res.send(result);
});
} else if (!req.params.id) {
--snip--
其中getFields
类似于:
var fields = {
'name': name,
'address': address,
'zipcode': zipcode
// ...
};
function getFields(str) {
return str.split(',').map(function(u) {
return fields[u];
});
}
当然,如果req.fields
本身就是一个字符串数组,那么您可以使用它来代替拆分req.fieldsStr
与每次(或大多数)注入一样,最好的解决方案是预先定义可能的字段列表。例如:
var predefined_fields = [ "id", "name", "age" ];
if (predefined_fields.indexOf( req.fieldsStr ) !== 0) {
// do something
}
此外,您还可以在queryStr
之外推送以下内容:parseInt(req.params.id)
:
var id = parseInt(req.params.id);
var queryStr = "req.database.table('locations').get("+id+")";
解决了二次注射问题
当然,将来它可能会变得有点复杂,所以我建议编写(或使用)某种查询生成器
我不知道您正在使用的库,但是看起来,您可以简单地执行查询,而无需字符串连接和求值。在所有这些之后,.run
方法代表了一些东西,对吗?这将明显提高性能和安全性
编辑您似乎根本不需要这些字符串。这应该起作用:
var query = req.database.table('locations').get(parseInt(req.params.id));
if (req.params.id) {
if (req.fields) {
query = query.pick( req.fieldsStr );
}
console.log(queryStr);
query.run(function(result) {
console.log(result);
res.send(result);
});
}
安全高效。:) 看起来这一切都归结为需要
eval
req.fieldsStr
,可能还有另一种方法。req.fieldsStr
可以是什么值?fieldsStr是从数组生成的,它包含字符串对象,例如“name”、“address”、“zipcode”,我假设您有名为name
、address
、zipcode
等变量。该库来自数据库,我尽量避免对数据建模,以充分利用无模式性database@user1707250是的,那很好。你不需要这些字符串。查看我的更新。