检测PDF是否用PHP加密的最简单方法


Easiest way to detect that a PDF is encrypted with PHP

我正试图找到最好的方法来检测给定的PDF是用PHP加密的。我不需要解密或编辑它或类似的东西。这个想法是如果用户上传加密的PDF文件,简单地向用户提供一个错误消息。

大多数用于PHP的PDF解析库似乎都需要将整个PDF读入内存才能进行解析。对于我来说,将整个PDF读入内存是不可接受的,因为我正在处理的PDF可能有几十兆,如果不是几百兆的话。

pdfinfo支付不是一个很好的选择(因为我不喜欢启动一个新的进程来做这件事),但如果没有其他选择,这是一个解决方案。我不太了解PDF的二进制结构,甚至无法编写足够的解析器来检测此问题,因此pdfinfo可能是唯一的选择。

TL;DR是否有一种简单的方法,纯PHP(没有C扩展)来检测PDF是否加密(也称为密码保护),即读取整个东西到内存中?

不幸的是,加密标志(即:"/Encrypt")位于文件末尾。

正常的文件解析函数从文件的开头到结尾(或到一定长度)读取文件,因此从逻辑上讲,如果你想确定pdf是否被加密/保护,你可能需要读取整个文件,这就是为什么大多数pdf解析库都读取整个文件来进行解析。

当前服务器的性能应该可以毫无问题地读取大的PDF文件。

我个人使用以下脚本,它没有任何性能问题:

<?php
$filename= "./useruploads/". $uploadedfilename; 
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);
if (stristr($contents, "/Encrypt")) 
{echo " (Suspected Enrypted PDF File !)";}
else
{echo " OK ";}  
?>

看起来最简单的方法是使用pdflib。虽然这是一个C扩展,但它是专门解决此问题的最快速和最可靠的方法,而无需向其他程序进行攻击。