我正试图找到最好的方法来检测给定的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扩展,但它是专门解决此问题的最快速和最可靠的方法,而无需向其他程序进行攻击。