Php 将机密信息存储在可通过Web访问的目录中?

Php 将机密信息存储在可通过Web访问的目录中?,php,file,security,curl,Php,File,Security,Curl,这个问题的答案可能相当明显,但我想解释一下为什么一种文件安全方法优先于另一种 考虑以下环境: 用户上传一个文件。该文件将重命名为:newfile_randomstring.png。然后通过cURL将文件发送到远程服务器。当远程服务器接收到该文件时,将创建一个新目录,并按如下方式存储该文件: 'public_html/uploads/user_id/file_id/newfile_randomstring/newfile_randomstring.png' 假设这些是重要的文件,比如纳税申报单或法

这个问题的答案可能相当明显,但我想解释一下为什么一种文件安全方法优先于另一种

考虑以下环境:

用户上传一个文件。该文件将重命名为:newfile_randomstring.png。然后通过cURL将文件发送到远程服务器。当远程服务器接收到该文件时,将创建一个新目录,并按如下方式存储该文件:

'public_html/uploads/user_id/file_id/newfile_randomstring/newfile_randomstring.png'

假设这些是重要的文件,比如纳税申报单或法律文件

我的问题是:将文件上传到一个不可通过web访问的目录会比建议的环境提供更多的安全性吗?其次,使用PHP的uniqid函数从随机字符串创建目录/文件名的建议方法是否首先提供了足够的保护,防止不必要的访问?(例如,有人计算出远程服务器的IP地址,并开始四处挖掘,试图猜测目录名和结构)


如果文件在上传后很快就被自动删除了呢?Bot/WebScraper是否仍然可以访问这些文件?

是的,请立即将它们存储在不可通过web访问的目录中。如果明智的文件是在网络上发布的,很容易获得并用于反扭曲和欺诈。将其从公用文件夹中取出,那么任何黑客都必须首先侵入您的系统才能获取信息

不,随机字符串根本没有保护,这就是权限存在的原因

是的,它们仍然可用,时间更短,但仍然可用

如果你只想到网络破坏者试图进入网站,那么很可能什么都没有发生,但大多数黑客行为都是通过社会工程进行的,你所描述的系统几乎不安全,有很多后门打开

将文件上载到不可通过web访问的目录会比我当前的环境提供更多的安全性吗

简短回答:是的,访问越少越好。但是,我不会仅仅因为文件位于不可通过web访问的目录中就说您的系统是安全的。我确实有一些关于你目前正在做什么的问题,但我会在下面进行讨论

其次,我目前使用PHP的uniqid函数从随机字符串创建目录/文件名的方法是否首先提供了足够的保护,防止不必要的访问?(例如,有人计算出我的远程服务器的IP地址,并开始四处挖掘,试图猜测目录名和结构)

不,隐藏文件名本身不足以阻止攻击者访问文件。您至少应该将这些文件保存在不具有直接公共访问权限的专用网络上,需要(强)身份验证才能访问这些文件,拥有用户可以访问哪些文件的授权策略,仅通过安全通道(如TLS)连接,加密这些文件(最好要求客户端使用他们在帐户创建期间收到的密钥解密文件,但考虑到您的使用情况,这可能不可能),并记录/监视所有事件(例如,身份验证、文件下载、身份验证失败等)

如果这些文件在上传后很快就被自动删除了怎么办?机器人程序/网络垃圾程序还能访问这些文件吗

在您不需要后删除是一个好主意,但它本身不会为您提供足够的安全性。机器人程序/刮板程序访问文件的时间肯定会减少,但他们仍然可以访问文件。您肯定希望将这些敏感文件从公用目录中删除

我的问题是:

  • 这些文件的最终存放位置(即,您通过cURL上传到的目录)是否可以公开访问?如果我知道URL和端口,我是否可以访问该服务器

  • 您是否通过安全通道(如TLS)发送所有信息

  • 您的服务器需要身份验证吗?如果需要,如何进行身份验证

  • 是否为不同的文件制定了不同的访问策略

  • 您如何处理冲突(即,要上载的文件与磁盘上的另一个文件同名)?您是否只是假设不会有冲突,因为您使用的是随机字符串

  • 为什么发送文件的服务器会命名文件?这可能会导致您不想处理的各种攻击

  • 您是否对要上载的文件(及其元数据)进行了任何输入?至少,您是否确保它没有超过特定的大小限制

  • 上传后,谁将使用这些文件?如何访问这些文件

  • 您在哪里跟踪随机生成的名称及其映射到的内容

  • 文件内容上载到的所有目录的权限设置是什么

  • 我相信,一旦这些问题得到回答,我还会有更多的问题


    编辑:添加了另一个问题

    轻松阅读:“将机密信息存储在Web可访问的目录中?”是非常疯狂的。只需将文件放在Web根目录之外,我无法想象您为什么不这样做。PHP不是安全随机的。它是为了(希望如此)输出一个与它每隔一次调用时返回的字符串不同的字符串,但这并不意味着要输出难以猜测的字符串,而且它与递增整数没有多大区别。这里的经典XY问题,返回并问你认为这种疯狂会解决的问题。1)是的;2)否3)是;RSA密钥认证;4.)用户将无法直接访问远程服务器。只有他们访问的页面