2016-04-02 3 views
0

私のCordovaアプリケーションでSQLiteデータベースをクエリし、列EventNameの値に部分文字列が含まれている行を選択する必要があります。私は使用できるようにしたいですか? SQLインジェクションを避けるために値を保持する。私はこのクエリを試してみました:Javascript SQLite for Cordova app - 文字列に部分文字列が含まれていないパラメータを使用して検索する

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 * 1のイベントから= 1 AND(イベント名)LIKE lower( '%?%');

これは、ログに記録PARAMATERSです:これは、エラーが返されたされ

[ 'myInput' ] 

{ 
    code: 5, 
    messsage: 'number of \'?\'s in statement string does not match argument count' 
} 

は1 があるあなたが見ることができるように?プレースホルダと1つの入力パラメータのため、数字と一致します。私はそれがだと思いますか?は一重引用符('')の間にあるため、検索された文字列の一部であると考えられます。これをどうやって解決するのですか?

EDIT:

JavaScriptステートメント"SELECT * FROM Event WHERE 1 = 1" + " AND lower(EventName) LIKE lower('%" + eventName + "%')"はOKですが、私は正規表現の検証をして、それを確認し、SQLインジェクションからeventNameを防止するために、SQLインジェクションに対して

+0

?などのワイルドカードを使用する代わりに、側ではなぜ単に値を渡すことはありません、私はそれを信じていますか?パラメータはSQL文で指定された値で動作します。 – IamKarim1992

+0

@ IamKarim1992私はSQLインジェクション攻撃を恐れています。今のところ私はSQLのパラメータを使用することをあきらめて、通常の方法で '' SELECT * FROMイベントWHERE 1 = 1 "+" AND lower(EventName)LIKE lower( '% "+ eventName +"% ")" –

+0

はいSQLインジェクション攻撃は、後でステージに入りますが、RegExを使用してeventNameに特殊文字を除外することで回避できます。 – IamKarim1992

答えて

0

私を守ることができる方法を使用したいです英数字とホワイトリストの特殊文字/^[ [email protected]/#&+-]*$/のみを使用してください。また、このregEx /^[[email protected]#\$%\^\&*)(+=._-]+$/gを試してください。私はそれを信じない ? SQL SELECTステートメントで動作するので、渡す必要があります+eventname+

希望します。

関連する問題