【问题标题】:Website upload prevent hacking网站上传防止黑客入侵
【发布时间】:2017-02-18 10:16:40
【问题描述】:

我的网站上有一个上传表单。我实际上并没有真正包含或排除文件类型。

我使用的是这个:

$fileUploadName = $target_dir.md5(uniqid($target_file.rand(),true)).".".$imageFileType;

这将保留文件类型,但将文件名更改为一些随机的神秘名称,例如 790cd5a974bf570ff6a303c3dc5be90f

这样,黑客无法上传hack.php 文件并使用www.example.com/uploaded_files/hack.php 打开它,因为它已更改为例如790cd5a974bf570ff6a303c3dc5be90f.php。在我看来,这种方式是完全安全的。我这样说是安全的吗?

我认为只有一个自执行文件可能是一个问题。自执行文件是否存在?

【问题讨论】:

  • 应用Kerckhoff's Principle“攻击者知道系统的一切,除了(加密)密钥”,您的攻击者可能知道您使用文件名的MD5校验和,因此可以推断出上传的文件名.
  • 为什么在任何情况下都允许执行上传的文件?
  • @miken32 我不明白你的意思。当然我要避免黑客可以上传文件然后执行。为避免这种情况,我正在使用 md5(uniqid($filename)) 更改真实文件名。这样,我希望黑客不能通过浏览器调用和执行文件,因为他不知道(实际)文件名。当然,如果它是一个自执行文件,这将不起作用。但是做。甚至存在自执行文件?
  • @JonathanLeffler 我想你错过了我正在混合MD5uniqid()$target_file。我想这应该是够保存的,不可破解的,不是吗? – 大卫 21 分钟前

标签: php security upload


【解决方案1】:

您还应该检查上传文件的 MIME 类型和扩展名(尽管在上传时很容易伪造)。 如果您只需要图像,您还可以通过执行如下脚本来检查图像宽度和长度参数:

$size = getimagesize($target_file);

如果这没有返回正确的值,则它不是图像文件。

您可能还想了解像 Gifar 这样的危险图形。

【讨论】:

  • 好的,但是我为什么要额外检查呢?用户将无法调用/打开上传的文件,还是会?
  • 我会尽可能地清理每一次上传。如果您需要图像文件,我会使用例如 getimagesize 来检查图像文件。在很多情况下,有人实际上可以访问上传的文件。例如,网络服务器更新/错误配置可能会启用目录浏览。或者有人可以尝试暴力攻击以在服务器上查找文件(假设它们可以从网络上执行)。
  • 通常人们想对稍后上传的文件做一些事情。下载它们,在某处展示它们。即使是针对文件或某些索引服务的简单优化脚本也可以触发文件并在情况允许的情况下执行。
  • 上传的文件仅供我(网站所有者)使用。用户(或任何用户)上传后无权访问。
  • 如果这些文件再也没有发生任何事情并且它们被安全锁定,我认为您的解决方案应该没问题。
【解决方案2】:

将上传的文件放在自己的文件夹中,例如/etc/web/uploads/<Random> (../uploads),而网站根目录位于/etc/web/public/,或者如果您可以使用.htaccess,则在上传文件夹中创建一个并放入Deny from all 此外 uniqid 和 rand 不会生成加密安全值 我还会检查上传的文件是否是图像 Link to someones isimage function http://php.net/manual/en/function.uniqid.php http://php.net/manual/en/function.rand.php

使用file_get_contents获取用户图片

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2015-10-08
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多