【问题标题】:how to check the uploaded file type is pdf [duplicate]如何检查上传的文件类型是pdf [重复]
【发布时间】:2023-04-04 16:03:01
【问题描述】:

可能重复:
How to check file types of uploaded files in PHP?

我的网站上有上传功能,只允许上传 PDF。如何检查上传的文件是否仅为 PDF?就像getimagesize() 可以验证图像文件一样。 有什么方法可以检查文件是PDF吗?我的代码如下:

$whitelist = array(".pdf");

foreach ($whitelist as $item) {
    if (preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) {
        
    }
    else {
        redirect_to("index.php");
    }
}

$uploaddir = 'uploads/';

$uploadfile = mysql_prep($uploaddir . basename($_FILES['uploadfile']['name']));

if (move_uploaded_file($_FILES['uploadfile']['tmp_name'], $uploadfile)) {
    echo "succussfully uploaded";
}

函数redirect_tomysql_prep 由我定义。但是可以使用标头更改 mime 类型。那么有什么方法可以检查文件是否为原始pdf?

【问题讨论】:

  • 为什么if 是空的?请为您的代码使用适当的缩进,否则会发生不好的事情。
  • 我只是想检查一下是不是机器......?
  • 只需做:if (!preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) { redirect_to("index.php"); }
  • 这不是答案@PeeHaa ..我已经这样做了....如何检查 pdf 条目,就像 getimagesize() 函数检查图像文件
  • 不是答案,而是评论。我在告诉你如何改进你的代码:)

标签: php html pdf


【解决方案1】:

您可以使用 PHP 的 File Info Functions 检查文件的 MIME 类型。如果它以“application/pdf”类型返回,那么它应该是 PDF。

文件信息函数是在 PHP 5.3 中添加的,但在此之前您可以使用 mime_content_type 函数。

【讨论】:

  • 但是如果我有一个 php 文件并写入(header: type="application/pdf")...那么它也会向我显示相同的
  • 确实如此,但这不太可能,这取决于这有多重要
  • +1 这只是这里的正确答案。文件信息函数提供了一种获取文件的true* mime 类型的方法
  • 我想克服我的问题......你告诉我的事情我已经检查过了......你有什么答案
  • 需要注意的是(如elsewhere on SO所述)mime_content_type()函数有not been deprecated,并明确提到包含在PHP7中。
【解决方案2】:
mime_content_type('file.ext');

mime_content_type()

【讨论】:

【解决方案3】:

通过打开文件并读取数据的前几个字节来查找 PDF magic number。大多数文件都有特定的格式,PDF 文件以%PDF 开头。

您可以检查文件的前 5 个字符,如果它们等于“%PDF-”,它可能是一个真正的 PDF(但是,这并不能明确证明它是一个 PDF 文件, 因为任何文件都可以以这 5 个字符开头)。正确 PDF 文件中接下来的 4 个字符包含版本号(即 1.2)。

【讨论】:

  • 这是一个非常昂贵的解决方案! :D
  • 这不是基本上 MIME 类型检查也可以做的,但是以更便宜的方式?
  • 好点,它本质上是 mime 类型检查可能已经在做的事情。但是,如果您确实想更确定它是一个有效的 PDF 文件(并且您不介意额外的处理时间),您可以扫描文件以查找其他预期的结构,例如 PDF "%%EOF" 标记文件的结尾。 (假设这不仅仅是 mime 检查所做的)
  • 这是一个非常不安全的解决方案,如果我试图打破这种保护,我会用我希望它看起来像的字节替换前几个字节。很容易做到。
猜你喜欢
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2010-09-23
  • 2013-07-18
  • 2011-10-08
相关资源
最近更新 更多