私の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インジェクションに対して
?などのワイルドカードを使用する代わりに、側ではなぜ単に値を渡すことはありません、私はそれを信じていますか?パラメータはSQL文で指定された値で動作します。 – IamKarim1992
@ IamKarim1992私はSQLインジェクション攻撃を恐れています。今のところ私はSQLのパラメータを使用することをあきらめて、通常の方法で '' SELECT * FROMイベントWHERE 1 = 1 "+" AND lower(EventName)LIKE lower( '% "+ eventName +"% ")" –
はいSQLインジェクション攻撃は、後でステージに入りますが、RegExを使用してeventNameに特殊文字を除外することで回避できます。 – IamKarim1992