ノート:SQLインジェクション

ページのコンテンツが他言語でサポートされていません。

文字列置換によって入力からアポストロフィーを取り除く方法[編集]

≪文字列置換によって入力からアポストロフィーを取り除く方法≫という部分を除去しました。

当初は何とか残す方法を考えていたのですが、断念しました。例示がSELECT文主体なので、SELECT文の本来のWHERE句の条件を無視してSELECTを成功させることにしか思いついていないのかもしれませんが、INSERT文やUPDATE文において≪アポストロフィーを取り除く≫ということは、DB上のユーザー入力項目においてアポストロフィーを禁止文字とする、ということです。つまり、名前欄に「Heather O'Rourke」のようなアポストロフィーを含む文字を登録するという機能は失われるということです。これではシステム機能を維持したままの対策ではありませんので、メリットデメリットも提示せずに「こんな簡単な方法もあるよ」などと無責任に示せる対策とは言い難いと思うのです。そして、もっと本質的な話として、バックスラッシュがエスケープシーケンスプレフィックスとして機能するデータベースにおいては、単純に単一引用符を2重化することはSQLインジェクションを防ぐことには結びつきません。その理由の詳細は記事に反映しておきました。

後、何点か編集の内容を補足します。

  1. アポストロフィーを単一引用符に変更しました。SQLの世界における定訳は単一引用符だと思うので。片仮名表記ならシングルクォートだと思うし、その意味でもアポストロフィーとは違うと思うのです。いやそれは違うぞ、ということであれば、SQLの世界で文字列リテラルの囲み文字をアポストロフィーと説明していて、それが一般的だとする資料をご提示いただきたく存じます。
  2. 「WHERE name = '' OR 't' = 't'」は、「''をNULLと同等と見なす」および「NULL値には何を加除してもNULL」というデータベース環境下(Oracle Databaseはそうではなかっただろうか)では、WHERE句の条件はNULLになってしまいませんか?という理由で、より普遍的に条件が真となると思われる「WHERE name = 't' OR 't' = 't'」を条件とするように変更しました。
  3. 単一引用符を2重化すればよい、だけであれば、原理と対策を別節にしてもよいと思いましたが、そんな単純なものではありませんので、複数の手法を示してその原理と対策を挙げていくことを考えると、単一節にまとめるほうが説明しやすいと感じました。もしより適切な節分けがあれば、編集いただければありがたいです。
  4. 「準備された文」の部分について「エスケープ処理が自動化される」とありましたが、「変数をそのまま変数として渡すことができるためにエスケープ不要となる」と説明するのがより正確ではないでしょうか?という意味で、エスケープ不要と表現を修正しました。

以上が編集意図です。もし説明できていない編集内容があれば、あるいは納得のいかない編集内容があれば、ご指摘ください。--NISYAN 2011年7月5日 (火) 23:09 (UTC)[返信]