我使用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;概念,我不确定他们是否指的是同一件事。
答案 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'
随意尝试更多组合,在我看来似乎很安全。