我允许用户将文件上传到我的服务器。我将面对哪些可能的安全威胁,以及如何消除它们?
假设我允许用户从其系统或网络将图像上传到我的服务器。现在,要检查这些图像的大小,我必须将它们存储在/tmp
文件夹中。有风险吗?如何将风险降到最低?
也可以说我正在wget
从用户在我的表单中上传的链接中下载图像。首先,我必须将这些文件保存在服务器中,以检查它们是否实际上是图像。另外,如果一个恶作剧者给我一个URL,而我最终却下载了一个充满恶意软件的网站,那该怎么办?
首先,意识到上传文件意味着用户以各种格式为您提供 了很多
数据,并且用户对该数据具有完全控制权。对于普通形式的文本字段,这甚至是一个问题,文件上传是相同的,而且更多。第一条规则是:不信任任何一个。
通过文件上传您从用户那里得到什么:
这是文件上传的三个主要组成部分,并且都不可信。
不要信任中的MIME类型$_FILES['file']['type']
。这是一个完全任意的,用户提供的值。
不要将文件名用于任何重要的事情。这是一个完全任意的,用户提供的值。通常,您不能信任文件扩展名或名称。请勿使用将该文件保存到服务器的硬盘上'dir/' . $_FILES['file']['name']
。如果名称为'../../../passwd'
,则您正在覆盖其他目录中的文件。始终自己生成一个随机名称以将文件另存为。如果需要,可以将原始文件名作为元数据存储在数据库中。
切勿让任何人或任何人随意访问该文件。例如,如果攻击者将malicious.php
文件上传到您的服务器,并且您将其存储在站点的webroot目录中,则用户可以直接example.com/uploads/malicious.html" target="_blank">php
执行该文件并在服务器上运行任意PHP代码。
切勿将任意上传的文件公开存储在任何地方,始终将其存储在只有您的应用程序可以访问它们的地方。
仅允许特定进程访问文件。如果应该是图像文件,则仅允许读取图像并调整其大小的脚本直接访问该文件。如果此脚本在读取文件时遇到问题,则可能不是图像文件,请对其进行标记和/或丢弃。其他文件类型也是如此。如果该文件应由其他用户下载,则创建一个脚本来提供文件以供下载,并且不执行任何其他操作。
如果您不知道要处理的文件类型,请自己检测文件的MIME类型和/或尝试让特定进程打开文件(例如,让图像调整大小的过程尝试调整假定图像的大小)。在此也要小心,如果该过程中存在漏洞,恶意制作的文件可能会利用它,从而可能导致安全漏洞(此类攻击最常见的示例是Adobe的PDF Reader)。
要解决您的特定问题:
[T]甚至检查这些图像的大小,我必须将它们存储在我的/ tmp文件夹中。有风险吗?
否。如果您不对数据进行任何处理,仅将数据存储在临时文件夹中的文件中就没有风险。数据就是数据,无论其内容如何。仅当您尝试执行数据或程序正在解析数据时才有风险,如果程序包含解析缺陷,恶意数据可能会诱使这些数据做意外的事情。
当然,在磁盘上摆放各种恶意数据比在任何地方都没有恶意数据风险更大。您永远不知道谁会来做这件事。因此,您应该验证所有上传的数据,如果未通过验证,则应尽快将其丢弃。
如果一个恶作剧者给我一个网址,而我最终下载了一个充满恶意软件的整个网站怎么办?
It’s up to you what exactly you download. One URL will result at most in one
blob of data. If you are parsing that data and are downloading the content of
more URLs based on that initial blob that’s your problem. Don’t do it. But
even if you did, well, then you’d have a temp directory full of stuff. Again,
this is not dangerous if you’re not doing anything dangerous with that stuff.
我们正在研究安全预防,并且在下面的代码中,正在提供存储的XSS攻击……下面是我们从Checkmark工具获得的信息。 method从数据库中获取的数据。然后,该元素的值在没有正确过滤或编码的情况下流过代码,最终在method中显示给用户。这可能会启用存储跨站点脚本攻击。
我不知道这是否会发生,但我会试试。 在过去的一个小时里,我研究了图像上传的安全性。我了解到有很多函数可以测试上传。 在我的项目中,我需要安全地上传图像。也有可能是一个非常大的数量,它可能需要大量的带宽,所以购买一个API不是一个选项。 所以我决定得到一个完整的PHP脚本,用于真正安全的图像上传。我也认为这对许多人有帮助,因为不可能找到真正安全的。但是我不是PHP的专家,所以添加一些功能对我来说真的
一面: 自我介绍 介绍SM3和SM4 为什么没用SM2 SM2的原理是什么 研究方向介绍一下 Diffie-Hellman协议过程 项目中的数据库池和线程池中几个线程 第二个项目效率质疑(解释了一下 然后他们表示了这就是他们不太用这个的原因) 第二个项目单个元素多大 为什么用这个大小 反问:业务 总结:两天后就挂了…
我用apache安装了docker自定义映像。我必须在docker conatiner上安装libapache2 mod security,我在docker容器中使用下面的命令,但出现错误。 apt-get安装libapache2-mod-Security root@8e8d98a4910e:/opt-获取安装libapache2-mod-安全读取包列表构建依赖树读取状态信息...完成E:无法定位
问题内容: 我想要一个文件夹,叫它docs,其中包含登录用户可以下载的文档。这些都有非常敏感的信息。如何最好地保护文件夹。我来自PHP背景,因此想知道是否忽略了任何内容。 我将使用.htaccess保护该文件夹,并且当用户单击“下载”时,他们将永远不会显示该文件夹。下载是通过php强制删除它们的文件夹名称。 当然,为了保护用户区域,我正在所有输入字段上进行卫生和验证,并注意SQLInjection
秋招安全岗面经系列之 海康威视-网络安全工程师-杭州 时间线:面完很久没消息,某一天看了一下发现已经挂了 x 投递 网络安全工程师 x+10 一面 x+16 二面(HR面) x+n 发现未通过 一面 时长:15分钟 自我介绍 渗透测试的流程 大hw的成果介绍 觉得实习3(甲方红队)和其他攻击队比起来你们的优势在哪里 poc用什么写的,会经常关注新漏洞吗 有了解最近的漏洞吗(spring、log4j