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

  • 2008/06/26(木) 14:00:00

更新情報

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


LINEで送る

この記事に対するトラックバック

この記事のトラックバックURL

-

管理人の承認後に表示されます

  • From: |
  • 2011/12/17(土) 03:32:40

それはそれで・・・

キケンなSQLインジェクション うちの母親なんてアドレスバー非表示にしてるつうの!! それはそれでフィッシング詐欺に関する問題にハマるのでは・・・ 簡単!やさしいセキュリティ教室

この記事に対するコメント

秘密のコメント

ブログ管理人への秘密コメントです

  • 投稿者: -
  • 2008/06/30(月) 10:01:08
  • [編集]

プレースホルダを使用した方が安全では?
文字列検索をさせたいときに困りますよ

  • 投稿者: -
  • URL
  • 2008/06/27(金) 11:39:30
  • [編集]

この記事にコメントする

管理者にだけ表示を許可する