勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHPでファイルアップロード時にディレクトリトラバーサル攻撃の対策をする方法

  PHP

あるシステムのセキュリティ対策としてディレクトリトラバーサル(Directory Traversal)攻撃対策をしてほしいと要望を受けた。ディレクトリトラバーサル攻撃というワード自体把握していなかったのでその辺りの詳細とPHPでのファイルアップロード時の対策方法をメモ。

 

ディレクトリトラバーサル(Directory Traversal)とは

ファイル名を扱うようなシステムに対し「../」のような特殊な文字列を送信することで通常ではアクセスできないファイルやディレクトリの内容を取得もしくは書き換えるといった攻撃のこと。

 

対策方法

basename関数でファイル名のみ取り出すことで対策できる模様。

#NGパターン
$filename = './upload/' . $_FILES['test_file']['name'];

#OKパターン
$filename = './upload/' . basename($_FILES['test_file']['name']);

 

所感

普段ファイルアップロードする際は「ランダム英数+タイムスタンプ」といったファイル名にリネームしているので特に影響はなさそうだけど、そのままのファイル名でアップロードする必要が出てきた場合は上記の対策を取るようにしたい。

 

参考サイト

https://teratail.com/questions/78163

 - PHP

  関連記事

PHP / MySQLで2038年問題の対策
PHP / MySQLで2038年問題の対策

先日打ち合わせの際に「タイムスタンプを使ってユニークキーに云々~~」といったよう ...

PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズ
PHPで縦横どちらかが指定の長さを超えた場合、比率を保ったままリサイズ

PHPで縦横どちらかが指定の長さを超えた場合、 比率を保ったままリサイズしたかっ ...

PHPでメルマガを配信する方法(BCCで一括送信するパターン)
PHPでメルマガを配信する方法(BCCで一括送信するパターン)

PHPでメールマガジンを配信したかった。宛先のメールアドレスはMySQLに保存さ ...

PHPで複数の変数に同じ値を代入する方法(多重代入 / 一括代入 / 同時代入)
PHPで複数の変数に同じ値を代入する方法(多重代入 / 一括代入 / 同時代入)

PHPのソースコード上に「$a = $b = $c = 12;」みたいな見たこと ...

CodeIgniter3でファイルキャッシュする方法
CodeIgniter3でファイルキャッシュする方法

CodeIgniterでファイルキャッシュが楽に導入できた。そこそこ使いそうなの ...