ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

セキュアプログラミング教育

Webアプリを作るうえで、SQLやプログラム言語、HTMLの知識は必須だと思うんだ。HTTPは無いよりあったほうがいいが必須か?と言われるとちょっとそうでも無い気がしている。で、SQLとプログラム言語、HTMLを一から勉強する場合、SQLならSQLだけ、プログラム言語ならプログラム言語だけ、HTMLならHTMLだけと別々に勉強しているのではないか?
例えばuserテーブルから「ikepyon」というuseridを検索するというSQLを書けと言われると、以下のものになると思う。

SELECT * FROM user WHERE userid = 'ikepyon';

で、ここからプログラムを書くときに、ユーザーから指定された任意のユーザーを検索する場合どういうSQLを書けばいいか?と考えると

SELECT * FROM user WHERE userid = '指定されたユーザー';

ということになっちゃう。結果、それを元にプログラムを書けっていわれると、

sql = "SELECT * FROM user WHERE userid = '" + uid + "';"
ここでuidはユーザーから入力されたデータとする

というSQLを動的に組み立ててしまうのではないだろうか?これってSQLとプログラム言語を別々に学習した結果、ユーザーが入力するデータってどんなのかわから無いという視点が抜けてしまうからとか無いだろうか?
HTMLもおんなじで、ユーザーからの入力をそのままレスポンスに埋め込んでしまう。
例えば先の例であれば、「O'Reilly」を検索するSQLを書けと言われれば、以下のようになり、誰でもおかしいと直ぐに気づくだろう(多分、きっと、だったらうれしいなぁorz)。

SELECT * FROM user WHERE userid ='O'Reilly';

でも、プログラムに埋め込むとこれが見えなくなっちゃう。
こういうのって、SQLとHTML、プログラム言語を全く別のものとして学習してしまった結果かなぁ?とか思うんだけどどうだろう?
アプリを作る際に、SQLもHTMLもプログラム言語もひっくるめて考えなきゃいけないのに、別々の知識としてあるだけで、それぞれ関係しているんだという意識が無いのかもしれない。だから、平気で「sql = "SELECT * FROM user WHERE userid = '" + uid + "';"」のようなコードを書いちゃうんじゃないのかなぁ?

それに、「O'Reilly」みたいなのを検索できるようなプログラムをサンプルにすりゃいいのに、入門用の解説では「分かりづらくなるので、問題のあるコードにします。セキュリティについては後で書きます」とか出てくるのも、別物として学習させようというのがあるんじゃなかろうか?
「分かりづらくなる」って何だよ!正しく動かないことがあるプログラムを入門用のサンプルとするほうが問題だろうと思うんだけどなぁ?