更新情報
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。
テーブルは消えないわ、私が守るもの!