【问题标题】:Secure File Upload and validating it安全文件上传和验证
【发布时间】:2011-10-02 05:12:56
【问题描述】:

我收到视频上传和图片上传:

我的环境:LAMP

编辑:我将允许远程上传和POST 视频上传

EDIT2:我得到的文件将被重命名,我不会存储原始文件名。

  1. 首先我检查$_FILES mime 类型。

  2. 其次,我再次检查finfo_file(如果函数存在)mimetype (PHP 5.3) 或使用 shell 命令文件。

  3. 如果通过上述检查,文件将移至公共目录。

我的问题是这个设置安全吗?或者我可以改进一些东西吗?我昨天读了洞天这对我来说似乎已经足够了,但谁知道:)

在编码和安全方面我是新手 :-)

【问题讨论】:

  • 第 1 步应该跳过

标签: php security file-upload


【解决方案1】:

我还可以推荐以下:

  1. is_uploaded_file 如果文件名命名的文件是通过 HTTP POST 上传的,则返回 TRUE。这有助于确保恶意用户没有试图诱使脚本处理它不应该工作的文件——例如,/etc/passwd。如果有任何文件,这种检查尤其重要对上传文件进行的任何操作都可能向用户泄露其内容,甚至向同一系统上的其他用户泄露。

  2. basename() 函数只获取文件名,例如basename(c:/fakepath/something.avi); // will return something.avi,因为有些人试图通过提供类似目录的文件名来欺骗计算机。

更多关于basename()

当您上传文件时,您想将文件移动到您想要的目录,例如/uploads/ 文件夹下,但恶意用户可以将文件命名为something/hello.jpg,然后在移动文件时使用@ 987654328@ 你的$destination 将是/uploads/something/hello.jpg,这会导致问题。为确保您只获得正确的文件名,您需要使用返回 hello.jpgbasename() 函数等等。

$file_name = basename($_FILES["upload_ctrl"]["name"]);
if(!move_uploaded_file($_FILES["upload_ctrl"]["tmp_name"],"uploads/".$file_name))
    echo "Opps I cannot upload the file";

basename的用法请访问:http://php.net/manual/en/function.basename.php

【讨论】:

  • 啊,我忘了说我将允许从某些用户组远程上传文件。关于 basename 我不明白你的意思我看了 php.net 但我还是不明白:)
  • basename() 提取文件名,不带任何附加路径。
  • 抱歉再次询问,当我检查 $_FILES[tmp_name] 时,它为我提供了文件名已重命名为 [tmp_name] => /var/www/vhosts/domain.com/ 的目录tmp/p2A32.tmp 这个漏洞可以利用吗?因为php已经重命名了文件,我不明白basename对我有什么帮助。
  • 它是给tmp_name的,当你想用它的原始名称存储文件时呢?然后你会从用户那里得到一个被欺骗的文件名。 PHP 将存储临时文件及其元数据,例如 file_name、file_type 等,只要脚本正在处理,但之后它们将被删除。 basename() 在您想要存储文件及其原始名称时很有用。
  • 好的,我现在明白你的意思了,但是文件被重命名和编码/调整了唯一的 ID,如果没有更多的答案,我会标记你的答案谢谢 :-)
【解决方案2】:

只要您使用自己的文件名和扩展名进行重命名,并且在您的应用程序代码中没有包含类型漏洞(即:include($_GET['whatever']);),这就相当不错了。您还需要确保服务器堆栈上的所有内容都是最新版本(尤其是处理图像/视频的所有内容)。

其他人会建议包含一个输出文件的文件服务脚本,而不是将文件保存在公用文件夹中并直接在 src 属性中引用该文件。有些人还建议对所有内容进行病毒扫描。

【讨论】:

猜你喜欢
  • 2011-08-02
  • 2017-02-16
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2013-10-18
相关资源
最近更新 更多