使用php copy命令上传文件

时间:2010-10-27 09:56:28

标签: php copy

我有一个公共网站,用户可以选择上传pdf文件并在需要时阅读该文件。

我使用php命令

$error = copy($tmp_name, $fpath);

将文件保存到服务器....

我面临的问题是

  1. 任何人都可以上传任何类型(.exe,bat)的文件,但我只需要pdf?

  2. 当尝试浏览pdf文件时,如果有人将其(.exe,.bat)文件扩展名更改为.pdf,如何降低该脚本在服务器上执行的风险?

  3. 我努力在最近几天解决这个问题,但没有成功......

    由于

5 个答案:

答案 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目录移动上传文件。