在我的Cordova应用程序中,我需要查询SQLite数据库并选择其中EventName列的值包含子字符串的行。我希望能够使用?保持值以避免SQL注入。我试过这个问题:
SELECT * FROM EventName WHERE 1 = 1 AND lower(EventName) LIKE lower('%?%');
这是我用来查询数据库的JavaScript代码:
function searchEvent(onSearch, eventName) {
// First create the query string
var params = [];
var query = "SELECT * FROM Event WHERE 1 = 1";
if (eventName != null && eventName != "") {
query += " AND lower(EventName) LIKE lower('%?%')";
params.push(eventName);
}
query += ";";
console.log(query); // Log the query
console.log(params); // Log the parameters
// Then execute query statement
db.transaction(function(tx) {
tx.executeSql(query, params, function(tx, rs) {
onSearch(rs);
});
}, function(err) {
console.log(err); // This statement was executed
});
}
这是记录的查询:
SELECT * FROM事件WHERE 1 = 1 AND lower(EventName)LIKE 下( '%%?');
这是记录的参数:
[ 'myInput' ]
这是返回的错误:
{
code: 5,
messsage: 'number of \'?\'s in statement string does not match argument count'
}
正如您所看到的,有1个?占位符和1个输入参数,因此数字 DO 匹配。我认为这是因为?位于单引号('')之间,所以它被认为是搜索字符串的一部分。我该如何解决这个问题?
编辑:
JavaScript语句"SELECT * FROM Event WHERE 1 = 1" + " AND lower(EventName) LIKE lower('%" + eventName + "%')"
没问题,但我想使用一种可以保护我免受SQL注入的方法
答案 0 :(得分:0)
为了防止SQL注入eventName
,请使用regEx验证进行检查,以仅包含alphanumneric和whiteelist特定字符/^[ A-Za-z0-9_@./#&+-]*$/
。另请尝试此regEx /^[a-zA-Z0-9!@#\$%\^\&*)(+=._-]+$/g
。我不认为 ?将使用SQL SELECT
语句,因此您需要传递+eventname+
希望它有所帮助。