正则表达式用于UTF-8有效文件名

时间:2012-08-14 18:03:20

标签: php file-upload utf-8 filenames sanitization

我正在尝试处理用户上传的文件的名称。我想支持所有有效的UTF-8字符,除了那些可能在HTML网页上显示,通过CLI界面访问或在文件系统上存储和检索时出现问题的字符。

无论如何,我想出了以下的宽松功能,我想知道它是否足够安全使用。我为所有数据库查询使用预准备语句,并且我总是对输出进行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);

这种方法对我来说是否安全,适合我的用户?

更新

为了澄清,我不使用文件名作为文件系统上文件的名称。我生成一个唯一的哈希并使用它 - 我只需要保存用户befit的原始名称,因为这是他们识别他们的文件。 SHA1哈希或UUID对他们来说并不意味着什么。

1 个答案:

答案 0 :(得分:2)

您需要做的第一件事就是检查输入 UTF-8。

mb_internal_encodingmb_check_encoding是您的朋友。

使用黑名单时,如果使用白名单是一种很好的安全措施 允许输入。

澄清后编辑

你应该安全。如果您不想传唤Zalgo,请务必过滤LmNo