PHP:如何清理上传的文件名?

发布于 2024-09-24 09:26:29 字数 244 浏览 8 评论 0原文

我有一个 PHP 应用程序。

我允许用户将文件上传到我的网络应用程序。

问题:在 PHP 中清理上传文档 $_FILES["filename"]["tmp_name"] 的文件名的最佳方法是什么?

更新

我可以获取上传文件名的 MD5 并将其用作新分配的文件名吗?如果是这样,我该如何在 PHP 中做到这一点?

I have a PHP application.

I allow users to upload files to my web application.

Question: What's the best way for me to sanitize the file names of the uploaded documents $_FILES["filename"]["tmp_name"] in PHP?

UPDATE:

Can I take an MD5 of the uploaded filename and use that as the newly assigned filename? If so, how do I do that in PHP?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

如歌彻婉言 2024-10-01 09:26:29

我打赌您还在数据库中存储了有关该文件的一些信息。如果这是正确的,那么您可以使用主键 (ID) 作为服务器上的文件名,并在数据库中保留原始文件名。这为您提供了更大的灵活性,因为您可以操作元数据而无需重命名实际文件。

I bet that you also store some information about the file in the database. If this is correct, then you can use the primary key (ID) as a filename on your server and preserve the original filename in the database. This gives you greater flexibility, because you can manipulate the metadata without renaming the actual file.

节枝 2024-10-01 09:26:29

我只需运行一个简单的正则表达式,用下划线替换任何非字母数字字符(或者完全删除这些字符)。当然,请确保保留扩展名。

如果您想更进一步,可以使用 magic mime 扩展名来确保文件的格式与扩展名所示的格式相同。

编辑:为了避免目录中的文件名冲突,您可以将用户 IP + 当前时间的 md5 附加到文件名中。

I would just run a simple regex that replaces any non alphanumeric characters with an underscore (or just remove these character altogether). Make sure you preserve the extension of course.

If you want to go a bit further, you could use magic mime extension to ensure the file is the same format that the extension says it is.

EDIT: To avoid filename collisions in a directory, you could append a md5 of users IP + current time to the filename.

难理解 2024-10-01 09:26:29

为了避免文件名冲突,只需检查给定或生成的文件名是否尚不存在:

do {
   // Generate filename, eg.:
   $filename = md5(uniqid()) . $fileExtension;
} while (file_exists($filename));

这可以让您 100% 确保文件名是唯一的。使用 md5(或任何其他哈希算法)可确保文件名安全 - 并且易于处理。

To avoid filename collision just check whether given or generated filename doesn't already exists:

do {
   // Generate filename, eg.:
   $filename = md5(uniqid()) . $fileExtension;
} while (file_exists($filename));

That gives you 100% sure that the filename is unique. Using md5 (or any other hash algorithm) ensures you that the filename is secure - and easy to handle.

梦里泪两行 2024-10-01 09:26:29

Ciao,这个函数还会删除所有点,然后我创建带有扩展名的干净字符串。

function sanitaze_upload_file($data)
{
    $imgName   = $data;
    $indexOFF  = strrpos($imgName, '.');
    $nameFile  = substr($imgName, 0,$indexOFF);
    $extension = substr($imgName, $indexOFF);
    $clean     = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", 
    $nameFile);
    $NAMEFILE  = str_replace(' ', '', $clean).$extension;
    return $NAMEFILE;
}

Ciao, this function also removes all the points and then I create the clean string with the extension.

function sanitaze_upload_file($data)
{
    $imgName   = $data;
    $indexOFF  = strrpos($imgName, '.');
    $nameFile  = substr($imgName, 0,$indexOFF);
    $extension = substr($imgName, $indexOFF);
    $clean     = preg_replace("([^\w\s\d\-_~,;\[\]\(\)])", "", 
    $nameFile);
    $NAMEFILE  = str_replace(' ', '', $clean).$extension;
    return $NAMEFILE;
}
逆流 2024-10-01 09:26:29

不要清理用户指定的文件名,而是使用该照片的任何其他唯一标识符并将其存储为文件名。我更喜欢使用数字且始终唯一的用户 ID。

<代码>
move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));

然后,您只需知道用户的 ID,就可以从任何位置(例如,S3 甚至您自己的服务器)获取图像。您甚至不需要数据库中的属性来存储图像 URL。

Instead of sanitizing filenames specified by the user, use any other unique identifier for that photo and store that as the filename. I prefer using user ID's which are numeric and always unique.


move_uploaded_file($_FILES["tmp_name"],"/home/yourname/".$user_id));

You can then fetch the image from any location (say, S3 or even your own server) by just knowing the user's ID. You don't even need a attribute in your database to store image URL's.

噩梦成真你也成魔 2024-10-01 09:26:29

如果您不反对丢失实际的文件名,我通常做的是创建文件名的哈希值并将文件名设置为该文件名,如果您正在开发的任何内容有大量正在上传的图片,它有助于避免命名两个文件名的冲突类似并会发生覆盖。

hash('md5', $_FILES["filename"]["tmp_name"]);

If you're not against losing the actual filenames, what I usually do is create a hash of the filename and set the filename to that, if whatever you're developing has loads of pictures being uploaded it helps avoid conflicts where two filenames are named alike and overwrites occur.

hash('md5', $_FILES["filename"]["tmp_name"]);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文