2011-12-30 14 views
0

カーソルから列情報を取得しようとしていて、イライラするエラーが発生しました。 $ SEARCHを含むすべての列を選択したいとします。ここでは、コードは次のとおりです。sqliteデータベースのカーソル照会でエラーが発生しました

Bundle b = getIntent().getExtras(); 
     SEARCH = b.getString("searchtext"); 
     Cursor c = mDBHelper.getReadableDatabase().query("table", null, "name="+ SEARCH, null, null, null, null); 

何らかの理由で、カーソルがランタイム例外をスローしています。ここでエラーです:

12-30 03:55:00.357: E/AndroidRuntime(1302): Caused by: android.database.sqlite.SQLiteException: near "CAP": syntax error: , while compiling: SELECT * FROM kroger WHERE name=john 

なぜこれが起こっているわからないが、おそらく私のコードでは、非常に単純な誤りがありますが、私はそれが何であるかわかりません。ご協力いただきありがとうございます!

答えて

3

"name="+SEARCHは、有効なSQL式ではないname=CAPになります。

"name='" + SEARCH + "'" 

しかし、これはSQLインジェクション攻撃の対象となります。これは単引用符で囲みます。引数を渡す機能を使用して、検索用語をインジェクションフリーに渡す:

query("table", null, "name=?", new String[] {SEARCH}, null, null, null); 
+0

素晴らしい説明、ありがとうございます! – benbeel

+0

最初の提案はなぜ攻撃の対象となり、2番目の提案は攻撃されないのですか? – barry

+1

@barry:ユーザーが 'CAP 'を検索したとします。 DROP TABLEテーブル。 - '。最初の解決策では、これは次のSQLになります: 'SELECT * FROM table where name = 'CAP'; DROP TABLEテーブル。 - ''。 2番目の解決策では、SQLは '?* FROM table WHERE name =?'のままであり、 '? 'は偽の検索語句に文字列値として、構文的には意味的に束縛されているため、検索は良質な方法で失敗します。 –

関連する問題