用于Cordova应用程序的Javascript SQLite - 使用参数搜索,其中字符串包含不区分大小写的子字符串

时间:2016-04-02 12:06:59

标签: javascript sqlite cordova sql-injection sql-like

在我的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注入的方法

1 个答案:

答案 0 :(得分:0)

为了防止SQL注入eventName,请使用regEx验证进行检查,以仅包含alphanumneric和whiteelist特定字符/^[ A-Za-z0-9_@./#&+-]*$/。另请尝试此regEx /^[a-zA-Z0-9!@#\$%\^\&*)(+=._-]+$/g。我不认为 ?将使用SQL SELECT语句,因此您需要传递+eventname+

希望它有所帮助。