如何使用Node.js处理OrientDB中的SQL注入?

杜加尔德

我正在使用orientjs库在Orient数据库中执行操作。我在文档中读到,可以使用如下所示的参数样式查询:

db.query(
   'SELECT name, ba FROM Player '
   + 'WHERE ba >= :ba AND team = ":team"',
   {params: {
      ba: targetBA,
      team: targetTeam }
   }, limit: 20
).then(function(hitters){
   console.log(hitters)
});

我的问题是:是否足以防止SQL注入?因为我没有在NodeJS API中找到有关该信息的信息。对于Java,有一个“ Prepared Query”(准备查询)的概念,我不确定他们是否引用相同的东西。

伊万·梅内蒂(Ivan Mainetti)

似乎是安全的,我正在尝试使用以下代码(您从Wiki上获取的代码有点错误):

var name='admin';

db.open().then(function() {
    return db.query(
        "SELECT * FROM OUser "
        + "WHERE name = :name",
        {params:{
            name: name
            }
        });
}).then(function(res){
    console.log(res);
    db.close().then(function(){
        console.log('closed');
    });
});

首先,查询被解析为SELECT * FROM OUser WHERE name = "admin"(与Studio Query Profiler一起观察)。

不出所料,我得到了管理员用户记录。

由于参数直接作为String求值,因此不需要引用它们(例如,:namenot ':name')。因此,有没有办法注入类似' OR '1'='1或任何; drop something;


这是我做的一些测试:

  • var name='; create class p;';

    不返回任何记录;

    由Orient评估为: SELECT * FROM OUser WHERE name = "; create class p;"

  • var name="' OR '1'='1";

    不返回任何记录;

    评估为: SELECT * FROM OUser WHERE name = "' OR '1'='1"

  • var name='" OR "1"="1';

    不返回任何记录;

    评估为: SELECT * FROM OUser WHERE name = "\" OR \"1\"=\"1"

  • 引用查询中的参数名称: "WHERE name = ':name'"

    评估为: SELECT * FROM OUser WHERE name = ':name'


随意尝试更多组合,在我看来似乎很安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章