如何使用nodejs处理OrientDB中的SQL注入?

时间:2016-10-05 23:29:53

标签: node.js orientdb orientjs

我使用orientjs库在Orient Database中执行操作。我在文档中读到可以使用如下参数式查询:

import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class CompositionsService {

  private url: string = 'http://localhost:3000/api';

  constructor(private http: Http) { }
  //TODO you don't actually need to pass an id here maybe just a page limit
  byInstrument(id: any, instrument: string): Observable<any> {
   return this.http.get(this.url + '/compositions?instrumentation=' + instrument);
  }
}

我的问题是:是否足以阻止SQL注入?因为我在NodeJS API中没有找到相关信息。在Java的情况下,有一个准备好的查询&#39;概念,我不确定他们是否指的是同一件事。

1 个答案:

答案 0 :(得分:4)

似乎是安全的,我正在尝试使用此代码(您从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观察)。

正如所料,我获得了管理员用户记录。

由于params直接被评估为String,因此不需要引用它们(例如:name而不是':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'

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