1

edittext一重引用符()を含む何かをに書き込むと'、プログラムがクラッシュします。これedittextを使用して、データベース内のものを検索できます。それらの一部には、この単一のqouteが含まれています(または、名前が何であれ、アポストロフィが含まれていますが、重要なのは、単一のqouteに関するものです)。私はそれがいくつかの特別な機能を持っていると思います、そしてこれがそれがクラッシュする理由です。その機能を無視したり、この問題を何らかの方法で解決したりするオプションはありますか?

たとえば、私のデータベースのアイテム:

cv.put(KEY_NAME, "Jonh's idea");
cv.put(KEY_HOTNESS, "amazing");
cv.put(KEY_MONEY, "500");
ourDatabase.insert(DATABASE_TABLE, null, cv);

次に、この方法で検索すると、次のようになります。

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",},  
"idea_name like " + "'%" + qq + "%'", null, null, null, null);

ここで、qqはユーザーによって与えられます(たとえば、Jonhのアイデア)。はい、構文エラーが発生します。

4

4 に答える 4

2

'が何らかの SQL インジェクションを引き起こしているように聞こえます... 'SQL ステートメントで構文エラーを引き起こしています。二重チェックを検討する可能性のある事項がいくつかあります。

  1. rawQuery()では SQL インジェクションから保護されないため、使用しないでください (代わりqueryinsert、、、、updateおよびdeleteメソッドを使用してください)。

  2. selectionandを次のようにフォーマットするselectionArgsことをお勧めします (SQL インジェクションから保護されるため)。

    selection = "col_1 = ?";
    selectionArgs = new String[] { "value_1" };
    

    ( の値が文字列の s をString[]置き換えることに注意してください)。?selection

  3. 最初にユーザーがこれらの文字を入力できないようにするには、 を に設定inputTypeしますEditText(つまり、ユーザーに数字のみを入力させたい場合は を設定しますandroid:inputType="number")。

  4. 全体として、クラスで Android メソッドを正しく使用している限り、SQLiteDatabaseSQL インジェクションで問題が発生することはありません (Android はこれを適切にクリーンアップします)。つまり、これらの特殊な目的のメソッドを使用しない場合は、実行時に String の内容を確認し';"、 などの文字をエスケープして保護する必要があります。

詳細については、次の投稿を参照してください。

LIKE ステートメントを使用した SQL の Android 単一引用符

于 2012-06-24T17:17:15.853 に答える
1

文字列をエスケープするには、引数を使用する必要がありselectionArgsます(その中の単一引用符がSQLを壊さないようにするため)。次のようなものを試してください。

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",}, "idea_name like ?", new String[] { "%" + qq + "%" }, null, null, null);
于 2012-06-24T17:25:40.297 に答える
0

SQLインジェクションのよう です。Uはあなたの入力をエスケープする必要があります。

于 2012-06-24T17:15:35.147 に答える