- ベストアンサー
SQL injectionに対する脆弱性
SQL injectionに対する脆弱性発見方法について3つ質問をさせていただきます。 質問1 SQL ' と入力した場合に、エラーとなると脆弱性ありと判断されるそうですが、理由は何でしょうか? 質問2 「検索キー」と「検索キー'and'a'='a 」を比較して、「検索キー」のみと同じ結果になれば、脆弱性ありと判断されるそうですが、理由は何でしょうか? 質問3 「検索キー(数値)」と「検索キー and 1=1 」を比較して、「検索キー(数値)」のみと同じ結果になれば、脆弱性ありと判断されるそうですが、理由は何でしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
質問1については、 例えば名前と完全一致で検索するような場合は以下のようなSQLが実行されると推測されます。 select * from test_table where name='入力された内容' 「入力された内容」の部分にシングルクォートのことを何も考慮せずに「SQL'」を入れれば、 select * from test_table where name='SQL'' となり、エラーになります。 シングルクォートを正しくエスケープしていれば、エラーにはなりません。 他の質問も、where句にそのままいれたらSQLがどうなるかを考えればわかります。
その他の回答 (1)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
質問1 意味がよくわかりません。 エスケープしていないなどの理由により、複数クエリが実行できてしまうとかそういうことを 言ってますかね?? 質問2 シングルクォーテーションがエスケープされていないから。 『and 'a'='a'』がクエリ条件として走行してしまいます。 本来行われるべき検索条件は『検索項目 = '検索キー\'and\'a\'=\'a'』であって、結果は0件ですよね。 質問3 数値項目であるにも関わらず文字列が設定され、更にシングルクォーテーションで囲まれていないから。 『and 1=1』がクエリ条件として走行してしまいます。 いずれにしても、すべてプレースホルダーを利用したクエリの実行を心掛ければ解決すると思います。