セキュリティ「SQLインジェクション」対策について
やっといろいろ調べてみた。
「データベースと連動したWebサイトで、
パラメータとしてSQL文の断片を与えることにより、
データベースを改ざんしたり不正に情報を入手する攻撃。
また、そのような攻撃を許してしまうプログラムの脆弱性のこと。」
(IT用語辞典より)
なるほど・・確かに危険です
ユーザー登録とかさせるならなおさら厳重に対策しなければ・・
さて、対策はどうするのだ??
純粋に『’』とか『”』とかを変換で消しちゃえばいい・・って単純に思うのだけど。。
●phpマニュアルよりメモのため一部抜粋。
・ありがちなテーブル名やカラム名などは攻撃の対象となります。なので避ける。
(ログインフォームで使っているテーブル名が ‘users’ で、その中に ‘id’、’username’、’password’ といったカラムがある場合など)
・データベースにスーパーユーザーまたはデータベースの所有者として 接続しないでください。 非常に制限された権限を有するカスタマイズ されたユーザを常に使用してください。
・指定された入力が期待するデータ型であることを確認してください。 ~~
・アプリケーションが、数値入力を期待している場合、データを is_numeric()で検証するか、 settype()により暗黙の型変換を行うか、 sprintf()により数値表現を使用することを検討 してみてください。~~
・データベースに渡される数値以外のユーザ入力を データベース固有の文字列エスケープ関数 (mysql_real_escape_string(), sqlite_escape_string() など) でクオートしてください。
・データベース固有の情報、特にスキーマに関する情報は出力してはいけません。~~エラーとか。
・データベース自体でクエリのログをとる
~~などなど。
●あとは私の恒例の本Head First PHP & MySQLより。
・trim()で文字列の先頭および末尾にあるホワイトスペースを取り除く
・mysqli_real_escape_string()を使用してSQL 文中で用いる文字列の特殊文字をエスケープする
・insertではどのカラムにどの値を入れるかちゃんと指定
~などなど、このあたり本にはいろいろ書いてありましたが、
「フォームデータの妥当性検証にはやり過ぎということはありません」
になるほどぉと思いました。
なぜかというと、、
攻撃者はフィルタをすり抜けて不正なシングルクォーテーションを混入させる手法の発見に血道をあげており、フィルタの開発と攻撃手法の確立はいたちごっこであると言える。
(SQLインジェクションとは何か?その正体とクラッキング対策。)
うはぁ。ちょっとだけハッカーの世界が想像できたょ。
・・一概にこうすれば安全、といえるものはないということですね。
入力されるデータとその使用法に合わせて適切で最高の対策をとらなければならないということでしょうか。
究極をいえば
動的にSQLを組み立てなければ原理的にはSQLインジェクションは発生しない・・
便利さを求めるというのは刺激的です。
☆☆2011/11/9 追記
やはり動的にSQLを組み立ててはいけないのでしょうか。
http://d.hatena.ne.jp/ajiyoshi/20100409/1270809525
修正必要かもしれない・・
—–
コメント