ユーザーがアップロードしたファイルの名前を処理しようとしています。HTML Web ページでの表示、CLI インターフェースを介したアクセス、またはファイルシステムでの保存と取得で問題を引き起こす可能性のある文字を除いて、すべての有効な UTF-8 文字をサポートしたいと考えています。
とにかく、私は次の寛大な関数を思いついたので、使用するのに十分安全かどうか疑問に思っています. 私はすべてのデータベース クエリに準備済みステートメントを使用し、常に出力を html エンコードしますが、これもよく考え抜かれたアプローチであることを知りたいと思っています。
// $filename = $_FILES['file']['name'];
$filename = 'Filename 123;".\'"."la\l[a]*(/.jpg
∮ E⋅da = Q, n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),
ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),
2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm
sfajs,-=[];\',./09μετράει
าวนั้นเป็นชน
Καλημέρα κόσμε, コンニチハ
()_+{}|":?><';
// Replace symbols, punctuation, and ASCII control characters like \n or [BEL]
$filename = preg_replace('~[\p{S}\p{P}\p{C}]+~u', ' ', $filename);
このアプローチは私にとって安全で、ユーザーに適していますか?
アップデート
明確にするために、ファイルシステム上のファイルの名前にファイル名を使用しません。一意のハッシュを生成してそれを使用します。ユーザーがファイルを認識する方法であるため、ユーザーに適した元の名前を保存する必要があるだけです。SHA1 ハッシュや UUID は彼らにとって意味がありません。