webサイトのセキュリティ対策:CGI入力

これまたお客さんのサイト開発で得た知識です。

昨今webサイトのセキュリティについて、要求レベルが上がってきており、開発者側もコストがかかるようになってきています。ここでは主にwebサイトのCGIよりユーザより入力されるデータについて気をつけるべき点を説明します。

1.テスト方法

FirefoxプラグインのTamperDataというものを使います。

これを使うとsubmit直前のCGI入力データを色々書き換えることができます。

デバッグできると同時にハッキングにも使えますね。

入力データにjavascriptとかを埋め込んだり、ダブルクォーテーションなどが混ぜてHTMLタグの崩れによる脆弱性などを調べます。

・よく使われるテストデータ

<script>alert();</script>  : 入力データにjavascriptを受け付けられるか

“> <script>alert();</script> : ダブルクォーテーションが影響しないか?

2.開発ポイント

以前はphpの場合、strip_tagsとかいう関数で入力されたデータからHTMLタグ(<>で囲まれた文字列)を取り去ってしまえば良かったのですが、昨今ブログなどで顔文字やHTMLタグを入力として受け付ける必要性が出てきて、対応が厄介になってきています。

ポイントは

(1) データはhiddenの際、escapeして保持する。

(2) 入力データは認められたタグ以外は切り取る。

phpの場合、strip_tagsとかだと、顔文字とかもタグ として削除されてしまうので、独自の関数が必要になります。

(3) データ自体はescapeしないで保存する。

escapeしたままDBに保存すると、再編集の際などの処理が厄介になるので、そのまま保存します。(例: <++> を <++> として保存しない)

(4) データをweb表示する際は、escapeして出力する。

ここでいうescapeとは、phpのhtmlspecialcharsという関数をさしています。

私は開発にSmartyを使っていますが、pluginのescapeという関数は(4)をとても簡単に実現してくれるので役立っています。(2)についてはオリジナルを作ったのですが、気が向いたら公開することにします。

携帯のセキュリティチェックの際は、これまたFirefoxのUser Agent Switcherが便利です。