au端末のみアクセス可能なサイトでクロスサイトリクエストフォージェリー対策が必要になったのだが、ワンタイムトークンとかのよくある手段だとおもしろくないので、何かないかと考えてみた。
auの端末からのリクエストには、端末の契約情報に紐づいた一意のID(サブスクライバID)がリクエストヘッダとして送信される。そこで、こんなのを作ってみた。
(1)リモートアドレスでauのデートウェイからのリクエスト以外は弾く
(2)POSTリクエストを受け付けるURIはサブスクライバIDで異なる
まあ(1)はよくあることなのでいいとして、(2)はこんな感じになっている。公開するURLは「http://example.com/form」とかいう形式になっている。au端末からそのURLへのリクエストがあると、サーバ側で「https://example.com/xxxxxxxxxx/」にリダイレクトする。この「xxxxxxxxxx」はサブスクライバIDとサーバ側に保持している特定のsaltとなる文字列(例えば創世記の全文)から生成されたハッシュ値になっている。リクエストしてきた端末のサブスクライバIDから生成したハッシュ値とURIのハッシュ値が一致すればリクエストを通して、そうでなければ弾く。リダイレクト処理が入るので「http://example.com/form」へのPOSTリクエストはリクエストボディーの内容が消えたGETのリクエストになってしまうから、もし第三者がこのURLに対してCSRFを仕掛けてきても無効化される。ハッシュ値付きの正しいURLにPOSTリクエストを投げるようにしたくても、端末が送信するサブスクライバIDとsalt値とハッシュ値の生成ルールが分からなければ犠牲者の端末専用のURLが推測できないため攻撃用のフォームを作ることができない。
あとは.htaccessなどで存在しないディレクトリへのアクセスをリライトしてしまえばおしまい。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
とかいう感じ。いやっほう。
あんまり見たことないやり方なので破り方があるかどうかちゃんと検証できてない気がするけど、思いつかないので実戦投入した。
Popularity: 3% [?]
「ダースまめ」は考えました。
ぼくもライトセーバーがほしいな。
思い立ったらすぐ行動、それが暗黒卿の生きる道です。
しめしめ、お母ちゃんは見当たらないぞ。
これはライトセーバーかな?
やったあ、ライトセーバーをゲット(たぶん)だ!
ご満悦の暗黒卿。
こうして、宇宙を征服するはずの暗黒卿「ダースまめ」は、すっかり野球選手になってしまいましたとさ。
Popularity: 2% [?]
携帯サイト構築で忘れがちなセキュリティ対策を記録しておく。もちろん、外部に公開されているサーバで余計なポートが開放されていたり要らないサービスが起動していたりするのは論外。
SSL
SSLを利用している場合、基本的にSSLv3とTLS1以外を利用することはないので切っておく。特にNull暗号をオフにしておく必要がある。
Apacheだとこんな感じ。
SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:!eNULL:!aNULL
Poundだとこんな感じ。
ListenHTTPS Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXP:!eNULL:!aNULL"
Apache
リクエストヘッダのHost部分を書き換えられることを前提とした設定をしていないケースが多いと思われる。VirtualHostの先頭にデフォルトの設定を入れて対応する。mod_rewriteは入っているものとみなす。
Apacheのバージョンが低い場合のTRACEメソッドの禁止も追加。
DocumentRoot /var/www/html ServerName default.host.name RewriteEngine on RewriteCond %{REQUEST_URI} !^/server-status RewriteRule .* - [F] #TRACEメソッドの禁止 RewriteCond %{REQUEST_METHOD} ^TRACE RewriteRule .* - [F]
Aliasで指定されたiconsやmanualは不要なので削除。
#Alias /icons/ "/var/www/icons/" # #以下このディレクティブの最後まで。
PHP
基本的な設定はされているものとして、忘れがちなのをいくつか。php.iniの場合は
バージョン情報を晒さない。
expose_php = Off
リモートファイルをスクリプトとして読み込ませない。
allow_url_fopen = Off
リモートファイルをスクリプトとして読み込ませない。
display_errors = Off
続く、かも。
Popularity: 3% [?]






