0

我想动态构建我的查询并使用以下代码段:

--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 毫秒

有没有更聪明的方法来完成我在这里所做的事情?

请指教。

4

2 回答 2

1

如果我理解正确,您应该使用以下内容:

--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是一个字符串数组本身,你可以使用它而不是 split req.fieldsStr

于 2012-11-25T22:42:52.187 回答
1

与每次(或大多数)注入一样,最好的解决方案是预先定义可能的字段列表。例如:

var predefined_fields = [ "id", "name", "age" ];

if (predefined_fields.indexOf( req.fieldsStr ) !== 0) {
    // do something
}

此外,您可以将其推送到:parseInt(req.params.id)外部queryStr

var id = parseInt(req.params.id);
var queryStr = "req.database.table('locations').get("+id+")";

这解决了第二次注入问题。

当然,将来它可能会变得有点复杂,所以我建议编写(或使用)某种查询生成器。

我不知道您正在使用的库,但它看起来就像您可以在没有字符串连接和 eval 的情况下简单地进行查询。毕竟这种.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);
    });
}

安全高效。:)

于 2012-11-25T22:51:59.103 回答