我正在使用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”(准备查询)的概念,我不确定他们是否引用相同的东西。
似乎是安全的,我正在尝试使用以下代码(您从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求值,因此不需要引用它们(例如,:name
not ':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] 删除。
我来说两句