【问题标题】:File naming convention and allowed characters between different OS不同操作系统之间的文件命名约定和允许的字符
【发布时间】:2011-11-28 16:48:31
【问题描述】:

我正在用 PHP 编写一段代码来保存电子邮件附件。 我可以假设这永远不会因为操作系统之间允许的字符不同而失败吗?

foreach($message->attachments as $a)
{
   // Make dir if not exists
   $dir = __DIR__ . "/saved/$uid"; // Message id
   if (!file_exists($dir)) mkdir($dir) or die("Cannot create: $dir");

   // Save the attachment using original!!! filename as found in email
   $fp = fopen($dir . '/' . $a->filename, 'w+');
   fwrite($fp, $a->data);
   fclose($fp);
}

【问题讨论】:

  • @rootatwc 是的,有点错误,请参阅我的编辑,但问题的关键在于附件的文件名。
  • 是否有您可以使用的电子邮件 ID 或唯一字符串?
  • @ajreal 不是每个附件的 ID,只有给定邮箱的给​​定消息应该唯一的消息 ID。
  • 啊,我明白了。只是不要保留原来的名称,给它一个新的随机名称,也可以避免安全隐患。
  • 是的,您应该给附件名称,如 $email_id-1、$email_id-2 等?

标签: php file file-io fopen


【解决方案1】:

您永远不应该使用您无法控制的名称,它可以包含各种字符,例如../../..

您可以使用basename 之类的函数来清理它,并使用DIRECTORY_SEPARATOR 之类的常量来分隔目录。

我个人会重命名文件,但您也可以在使用变量之前对其进行过滤。

【讨论】:

  • 这不是答案,而是最佳实践,感谢basename 的提示,我将与DIRECTORY_SEPARATOR 一起使用。问题仍然存在:$a->filename 可以包含不允许的字符吗? +1 小费。
  • @Gremo 这不是答案吗?如果您的文件名开头包含../../,则您的操作将因权限不足而失败(希望您...)。
  • @Gremo 是的,这就是为什么如果你不想重命名它,我建议过滤:-)
【解决方案2】:

最好替换 Windows 上文件名中可能出现的某些字符。

Unix 几乎可以处理文件名中的任何字符(但不能处理“/”和 0x00 [空字符]),但为了防止编码问题和下载文件的困难,我建议替换任何不匹配的字符 /[A-Za-Z0-9_-\.]/g,满足 POSIX 完全可移植的文件名格式。

所以preg_replace("/[^A-Za-Z0-9_-\.]/g","_",$filename); 会做得很好。

一种更慷慨的方法是仅替换 |\?*<":>+[]\x00/,它不会改变 öäü 等特殊语言字符,并且与 FAT32、NTFS、任何 Unix 和 Mac OS X 兼容。

在这种情况下使用preg_replace("/[\|\\\?\*<\":>\+\[\]\/]\x00/g","_",$filename);

【讨论】:

    【解决方案3】:

    不,您应该假设这很有可能失败。有两个原因:

    1. 如果两封电子邮件的文件名相同(例如 selfie.jpg)怎么办?
    2. 如果文件名包含不可接受的字符怎么办?

    您应该使用内部命名约定(例如,用户+日期时间+顺序)并将名称保存在至少包含 3 个字段的 MySQL 表中:

    1. Id - 自动编号
    2. 文件名 - 由您的 php 保存
    3. 原始名称 - 与原始电子邮件中的名称相同
    4. 可选用户名 - 或发送电子邮件的用户代码或电子邮件地址
    5. 可选的日期时间戳

    将原始文件名保存为 VARCHAR,您将能够跟踪原始名称,甚至显示、搜索等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 2011-06-21
      • 2017-08-12
      • 1970-01-01
      • 2018-10-21
      • 1970-01-01
      • 2022-10-17
      • 2010-12-26
      相关资源
      最近更新 更多