似乎是安全的,我正在尝试使用此代码(您从 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 观察)。
正如预期的那样,我得到了管理员用户记录。
由于参数被直接评估为字符串,因此不需要引用它们(例如: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'
随意尝试更多组合,在我看来似乎很安全。