我想动态构建查询并使用以下代码片段:
--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 会打开我的代码以进行注入(inject)(req.fields 中填充了 url 参数),并且我看到应用程序的响应时间从 7 毫秒增加到 11 毫秒
有没有更聪明的方法来完成我在这里所做的事情?
请指教。
最佳答案
与每次(或大多数)注入(inject)一样,最佳解决方案是预定义可能字段的列表。例如:
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+")";
这解决了第二次注入(inject)问题。
当然,将来可能会变得有点复杂,所以我建议编写(或使用)某种查询生成器。
我不知道您正在使用的库,但看起来您可以简单地进行查询,而无需字符串连接和评估。毕竟这个 .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);
});
}
安全高效。 :)
关于javascript - 更好更快的评估方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556136/