我有一个公共网站,用户可以选择上传pdf文件并在需要时阅读该文件。
我使用php命令
$error = copy($tmp_name, $fpath);
将文件保存到服务器....
我面临的问题是
任何人都可以上传任何类型(.exe,bat)的文件,但我只需要pdf?
当尝试浏览pdf文件时,如果有人将其(.exe,.bat)文件扩展名更改为.pdf,如何降低该脚本在服务器上执行的风险?
我努力在最近几天解决这个问题,但没有成功......
由于
答案 0 :(得分:2)
请勿使用copy()
,使用move_uploaded_file()
获取上传的文件。使用copy()
会受到严重的安全漏洞影响。
如何降低在服务器上执行该脚本的风险?
这很简单:只是不要把它放在执行它的任何地方:)严重的是,你可以将最恶毒的病毒存储在你的服务器上 - 只要它们在一个无法运行的目录中,你没问题。
真正的问题是当人们下载文件时会发生什么。您可以使用其他答案中列出的fileinfo
来确定它是否为PDF。除此之外的任何事情 - 例如检查PDF文件中的恶意黑客,其中有一些 - 您必须安装服务器端病毒扫描程序。
除此之外,用户有责任运行病毒扫描程序。这里没有100%的安全性。完全安全性可能来自使用本机PDF库打开和重新保存每个PDF文档,但我不知道是否有任何PHP库可以做到这一点。
答案 1 :(得分:0)
使用fileinfo获取mimetype(+其他任何你需要的东西)来检查它是否是pdf。
编辑:更简单的替代方法是使用mine_content_type(),但自php5以来已弃用。
PS:pdf-mimetype应为application/pdf
答案 2 :(得分:0)
1)要解决这个问题,你需要在你的一端检查逻辑,例如使用Fileinfo模块找出文件的MIME类型。另外,请确保始终使用.pdf文件扩展名保存文件,并使用错误的扩展名阻止所有内容(以防止用户下载任何可执行文件)。但这不是100%安全。如果您想完全保护自己免受病毒侵害,您需要在服务器上安装防病毒程序并检查所有上传的文件。
2)这更容易。只需在Web服务器配置中禁用上传文件夹的所有脚本执行。这将因Web服务器而异。
哦,如果您的Web服务器允许在目录中配置文件,例如Apache的.htaccess,请确保文件名不是.htaccess
或任何其他魔法文件名..
答案 3 :(得分:0)
您可以使用tool.pdf.Validate之类的工具验证PDF,但是使用许多不同版本的PDF可能会产生漏报,特别是对于较新的软件包。
答案 4 :(得分:0)
bobince在very good write-up中有关于文件上传主题的another question。他的答案带来了一些我以前没想过的问题。这真的值得一读。
正如Pekka已经说过的,不要只使用copy()
,使用move_uploaded_file()
函数来存储从tmp目录移动上传文件。