回答編集履歴
1
ディレクトリ部分について追加
answer
CHANGED
@@ -8,9 +8,11 @@
|
|
8
8
|
|
9
9
|
最後に、拡張子を考慮しましょう。アップできるのがjpegやpngなど決まっているのであれば、拡張子があっていなければ弾いても良いでしょう。
|
10
10
|
|
11
|
+
忘れるところでした。ファイル名にはそれまでのディレクトリへのパスがつけてあるかもしれません。階層構造は不要ですし、時にはセキュリティ上の問題が起きる場合がありますので、ディレクトリの部分はすべて切り捨てましょう。
|
12
|
+
|
11
13
|
まとめると一例として次のような処理になります。
|
12
14
|
|
13
|
-
1. ファイル名を拡張子を除いたファイル名部分と拡張子に分解します。[pathinfo()](http://php.net/manual/ja/function.pathinfo.php)を使うと良いでしょう。ファイルパスのディレクトリの部分は無視します。
|
15
|
+
1. ファイル名を拡張子を除いたファイル名部分と拡張子に分解します。[pathinfo()](http://php.net/manual/ja/function.pathinfo.php)を使うと良いでしょう。**ファイルパスのディレクトリの部分は無視します。**
|
14
16
|
2. 拡張子が想定のフォーマットで無ければ拒否します。なお、フロント側でJavaScriptを使って拒否する場合であっても、**必ずPHP側にも拒否する処理を入れてください**。フロント側のJavaScriptによるチェックを回避した悪意あるアクセスをすることで、想定外のファイルがアップロードされる可能性があります。
|
15
17
|
3. 拡張子以外のファイル名部分について次のように書き換えます。
|
16
18
|
(1) 英数字および"_"の記号以外は全ての文字を"_"にします。
|
@@ -35,7 +37,7 @@
|
|
35
37
|
|
36
38
|
その3 ランダム
|
37
39
|
|
38
|
-
十分な長さのランダムな英数字にします。ファイル名が重なる可能性が極僅かに存在しますが「その2」と同じ対策を行えば十分でしょう。他のファイルのファイル名を推測することはほぼ不可能です。乱数に暗号論的擬似乱数(PHPではopenssl_random_pseudo_bytes()などを使います)を使えばさらに推測は不可能になり、より安全です。
|
40
|
+
十分な長さのランダムな英数字にします。ファイル名が重なる可能性が極僅かに存在しますが「その2」と同じ対策を行えば十分でしょう。他のファイルのファイル名を推測することはほぼ不可能です。乱数に暗号論的擬似乱数(PHPでは`openssl_random_pseudo_bytes()`などを使います)を使えばさらに推測は不可能になり、より安全です。
|
39
41
|
|
40
42
|
---
|
41
43
|
|