ギークなお姉さんは好きですか

恋焦がれる理想の男性・ギークを知るため、プログラミングがわかるお姉さんを目指すブログ

キケンなSQLインジェクション

更新情報

yappoさん、nipotanさん、麻理さんを追加しました!ありがとうございます!!
日本のGeeksがマジ優しすぎて鼻から牛乳><
geek DataBase - ギークデータベース



SQLインジェクション攻撃による不正なデータベース操作を防ぐ

前回の更新後、さっそく秘密コメントやTwitter等で脆弱性を指摘されました><
zapaさん、kidd-number5さん、ほかアドバイスくださったすべての方へ!
とても勉強になりました!ありがとう、ありガ島通信!!!

geekDataBaseに、かの有名なSQLインジェクションの脆弱性がある、という衝撃の事実が判明。
うわさには聞いていたが、まさか自分の身に降りかかるとはっ・・・。
参考:サイト脆弱性をチェックしよう!--第6回:SQLインジェクションの検査方法


// id=数字以外はエラーメッセージを表示 という部分。
これを追加してすっかり満足してたけど、どうやら入れるタイミングがまずいらしい。

7   $sql="select * from geekDB where id = " . $id;
8   $result = mysql_query($sql);


というクエリ実行後に「そういえばidは数字以外じゃダメだからね!」と言っても遅い。
もし、悪いやつが「";DELETE FROM geekDB;」なんて入力したら、なんとデータが消えてしまうΣ(゚Д゚)
あぶねぇぇぇえええ!あな、おそろしや・・・おそろしや・・・。
紅が無知なだけというせいもあるけど、世の中には、思いもよらぬ行動を取る人がいるんだなぁと痛感。
だって!URL欄にクエリ打ち込むて!!うちの母親なんてアドレスバー非表示にしてるつうの!!


話がそれた。
まとめよう。
今回覚えたこと。

「$idは数字以外は受け付けない」というのは、クエリ実行後ではなく、
一番最初に言わなければいけない。



それでは、追加したコードを移動。

3    mysql_connect('localhost','ユーザ名','パスワード');
4    mysql_select_db('データベース名');
5    mysql_query("set names utf-8");
6
7  //id=数字以外はエラーメッセージを表示
8   if(!is_numeric($id)){
9   echo "該当データがありません";
10  }
11   else{
12  //ここまで
13   
14    $sql="select * from geekDB where id = " . $id;
15    $result = mysql_query($sql);
16
17   while ($item = mysql_fetch_array($result)) {
18   ・・・(以下略)



これでOK、今度こそOK。
テーブルは消えないわ、私が守るもの!