セキュアコーディング~日経ソフトウェア2016年1月号~
日経ソフトウェア2016年1月号にセキュアコーディングについてまとめてありました。
今まで名前は聞いたことがあるものの中身がちゃんとわかってなかったので、理解できてよかったです。
記事にはSQLインジェクション、ディレクトリトラバーサル、OS/コマンドインジェクション、セッションハイジャック、セッションフィクセーション、クロスサイトスクリプティング(XSS)、クロスサイト・リクエスト・フォージェリ(CSRF)、HTTPヘッダーインジェクション、クリックジャッキング、総当り攻撃について記載がありました。
脆弱性のあるプログラムと実際の攻撃の仕方、その対策が具体的に載っておりとてもわかりやすかったです。
では一つ一つ見ていきましょう。
・SQLインジェクション
ユーザの入力値をSQL文の条件に使って意図しない結果となってしまうもの。よく聞くのが、ユーザ認証で、パスワードに「' OR 'A'='A」などを入力するとORの条件で一致するためログイン認証できてしまうこと。対策は、SQL実行時に文字列を無害化するのが一番よいです。多くのプログラミング言語やフレームワークに対策の機能があり、PHPではbindParamというメソッドを使えばよいようです。
・ディレクトリトラバーサル
ファイル名を指定するようなプログラムで、「../etc/passwd」などで上の階層に行き、重要なファイルを読み取ることができてしまうもの。対策は、直接ファイル名を指定させず、IDなどを使う方法です。
・OS/コマンドインジェクション
入力値をもとにコマンドを実行させるようなプログラムの場合に、「create;shutdown -h」などOSのコマンドを1行で複数実行することができるため、シャットダウンも走ってしまうものです。対策は、コマンドを実行させるプログラムでもユーザに使わせるのは一部のことが多いので、IDなどを振って直接指定させないことです。
・セッションハイジャック、セッションフィクセーション
どちらも不正にセッションIDを入手し、ユーザになりすますものです。セッションハイジャックは、盗聴による入手。セッションフィクセーションは、偽サイトからのログイン画面を用意し、そこでセッションIDを固定する方法です。対策は、ログイン成功時に新しくセッションIDを発行し直すのが簡単なようです。
・クロスサイトスクリプティング(XSS)
Webサイトに不正なスクリプトを埋め込み、情報などを盗み出すことです。掲示板の書き込みでスクリプトを書き込んで、そのまま実行されるような状態だと、知らずにアクセスした人がスクリプトを実行されてしまいます。対策は、HTMLタグやJavaScriptを無害化して表示することです。ライブラリやフレームワークの機能を使うことが対策漏れ防止に重要です。PHPではhtmlspecialchars関数を使えばよいようです。
・クロスサイト・リクエスト・フォージェリ(CSRF)
前もって偽装リクエストを送信するサイトを用意して、意図しないリクエストを送信させるものです。twitterなどにログインした状態のまま、偽装サイトのボタンを押すと、意図しないつぶやきが投稿されたりします。対策は、リクエストのつどワンタイムトークンを発行して、チェックするのがよいです。フレームワークに対策機能がついているので、それを利用するのが簡単でよいようです。
・HTTPヘッダーインジェクション
HTTPのヘッダーに改行が含まれていると、それ以降がHTTPのボディとなり、任意のスクリプトを実行されるものです。PHPの最新版では標準で対策されているようです。ただHTTPのヘッダーに情報を追加する場合は、htmlspecialchars関数などを利用して、エスケープ処理をしておくことが望ましいようです。
・クリックジャッキング
インラインフレームの機能を使って本物のサイトを取り込み、その上に透明なボタンなどを配置し、ユーザ情報等を盗むものです。対策は、インラインフレームを無効化することです。サーバの設定ファイル「.htaccess」に「Header always append X-Frame-Options DENY」を追加すればよいようです。
・総当り攻撃
ユーザ認証で、パスワードの組み合わせを全て実行して、ログインするものです。パスワードの桁数が小さかったり、使う文字の種類が少なければすぐにログインできてしまいます。対策は、同じユーザIDに対して連続してログインが失敗したらアクセスを拒否することです。
理解した内容をまとめましたが、記事にはもっと詳しく、対策も複数載っていたので興味がある方は、ぜひ読んでみてください。