【问题标题】:Regex for UTF-8 valid filenamesUTF-8 有效文件名的正则表达式
【发布时间】:2012-08-14 18:03:19
【问题描述】:

我正在尝试处理我的用户上传的文件的名称。我想支持所有有效的 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);

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

更新

为了澄清,我不使用文件名作为文件系统上的文件名。我生成一个唯一的散列并使用它——我只需要为适合的用户保存原始名称,因为这是他们识别文件的方式。 SHA1 哈希或 UUID 对他们来说并不重要。

【问题讨论】:

  • 它实际上太激进了。而这些字符中的大多数都是呈现它们以供下载的问题。
  • 您可以将文件名保存在数据库中,并将上传名称设置为您的记录ID。我认为这是最好的方式。您可以通过.htaccess文件或头文件下载同名文件

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


【解决方案1】:

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

mb_internal_encodingmb_check_encoding 是你的朋友。

您正在使用黑名单,但使用白名单是一种良好的安全做法 允许输入。

澄清后编辑

你应该是安全的。如果你不想召唤Zalgo,记得过滤LmNo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 2011-01-04
    • 2013-12-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多