読者です 読者をやめる 読者になる 読者になる

ディレクトリトラバーサル対策について

PHPでファイル操作周りを扱う際に
忘れがちだったので徳丸先生の本をもとに思い出すついでのメモ

概要

外部からパラメータでサーバ上のファイル名を指定できるWebアプリケーションでは、
ファイル名に対するチェックが不十分であるとアプリケーションの意図しないファイルに対して閲覧や改ざん、削除ができる場合がある。
これをディレクトリ・トラバーサル脆弱性と呼ぶ。

脆弱性が生まれる原因と対策

外部からファイル名を指定できる仕様を避ける

ファイル名を固定にする、もしくはファイル名を間接的に番号で指定する

ファイル名にディレクトリを含まれないようにする

ファイル名にディレクトリ名が含まれないようにすれば、アプリケーションの想定したディレクトリのみにアクセスすることになりディレクトリ・トラバーサル脆弱性が解消する。
ディレクトリを示す記号文字は「/」、「\」、「:」などOSで異なる。
そのため、OSによる違いを吸収できるライブラリを使用するべきである。PHPの場合はbasename()を使用する。
サンプルコード

<?php
 define('TMPLDIR','/var/www/tmpl/');
 $tmpl = $_GET['template'];
 if(!pregmatch('/\A[a-z0-9]+\z/ui',$tmpl)){
 die('template')
 }
?>
<body>
<?php readfile(TMPLDIR.$tmpl.'.html'); ?>
</body>
ファイル名を英数字に限定する(記号を許可しない)

ファイル名を英数字のみを通す正規表現に限定することが効果的な対策と言える

まとめ

ファイル名を外部から指定しない