最近、セキュリティ系に、かなり興味があります。‘高木浩光@自宅の日記’で、@IT の記事が取り上げられていました。
@IT の記事:
SQLインジェクションも特殊文字を悪用することによって行われるので、ユーザー名やパスワードの文字種制限やサニタイジングが有効である。
高木さんの blog:
パスワードに「'」を使わせないつもりなのか? パスワードには強度確保のた めに記号を入れるのが常識なのに?
「サニタイジング」という便利な言葉は、問題の本質から目を背け、場当たり 的な対処方法という安易な説明を誘発してしまうので、有害だ。
私も、高木さんがおっしゃるように、パスワードに "'" も含めた記号を入力できるようにしたいです。しかし、その前に、データベースにパスワードをそのまましまうな、と言いたい。だって、データベースの管理者は、どのユーザでもログインできる、ってことですよ?たとえ個人データが暗号化してあっても、パスワードが平文で入っているなら、データベース管理者に対しては、平文で格納してあるのも同じですよ。
「SQL インジェクション」の説明なので、まぁ、おまけなんですけど。
ところで、こんなコメントも見つけました。「セキュアなWebアプリ実現のために本来やるべきことは? - 高木浩光氏
」という記事にある、SQL インジェクション対策としてのサニタイズに関してですが、、、
これ、SQLインジェクションが起きた後になってからは、いえることなんだけど、今問題になっているのは、SQLインジェクションの問題が言われる「前」に開発したシステムに関してですよね。
その時点では、SQLインジェクションの問題は起きていなかった。
そうすると、ですよ、ログイン名のところに、itazura' OR 'a'='a という文字列(こういう文字列を入れてSQLインジェクションを起こす)を入れるケースって、まず考えられないですよね!
ん~?ちょっと待ってください。少なくとも、SQL 文を組み立てるために「"username='" + username + "'"」と、シングルクォーテーションをコーディングしています。ここで、「あれ?username 内にシングルクォーテーションがあったらどうなる?」と、疑問を挟む余地は、ないのでしょうか?また、SQL 文として解釈可能な入力がされた時だけ、SQL インジェクションなのでしょうか?「my'name」という入力がされたら、どうなります?当然、データベースがエラーを返し、実装言語はエラーか例外を発生させます。入力可能な文字が通るかどうかのテストをしていないのなら、テストケース落ちではないでしょうか。例外をキャッチしたけど、それを握りつぶしているなら、本来しなければならない処理をしていない、という問題ではないでしょうか。
高木さんが指摘されているのは、プログラマがするべき処理を実装するように促すこと、です。たとえ SQL インジェクションというものを知らなくても、入力可能な文字を入力してエラーが発生しないこと、を確認(するように注意を促して)いれば、問題は発生しないのではないでしょうか。
10年前に、私が作った Windows アプリケーションに対して行われたテストを基にしてコメントしています。
投稿日時 : 2005年11月24日 20:36