Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在web服务器中存储文件的安全方法?_Php_Mysql_Security_File_Webserver - Fatal编程技术网

Php 在web服务器中存储文件的安全方法?

Php 在web服务器中存储文件的安全方法?,php,mysql,security,file,webserver,Php,Mysql,Security,File,Webserver,我希望我的文件在我的web服务器中是安全的。只有访问这些文件的经过身份验证的用户才能访问这些文件。我曾想过将文件存储在数据库中作为“长BLOB”,但它只支持2MB的数据。文件大小可能超过50MB。有没有其他更好的方法来保护这些文件?请帮助我。提前谢谢。不要将它们存储在数据库中。将它们放在您的web目录中,并使用保护它们 如果您希望通过其他方式进行身份验证,则将文件存储在一个目录中,该目录不可通过web访问,但可供php运行时的用户读取 我想到了几个选择 如果您使用的是Apache,则可以使用ht

我希望我的文件在我的web服务器中是安全的。只有访问这些文件的经过身份验证的用户才能访问这些文件。我曾想过将文件存储在数据库中作为“长BLOB”,但它只支持2MB的数据。文件大小可能超过50MB。有没有其他更好的方法来保护这些文件?请帮助我。提前谢谢。

不要将它们存储在数据库中。将它们放在您的web目录中,并使用保护它们


如果您希望通过其他方式进行身份验证,则将文件存储在一个目录中,该目录不可通过web访问,但可供php运行时的用户读取

我想到了几个选择

如果您使用的是Apache,则可以使用htaccess来保护目录的密码。(谷歌搜索的第一个链接:)

或 将文件存储在web服务器上方。 用php创建一个允许授权用户访问的脚本


如果您想通过FTP进行此操作,并且您正在运行cpanel,则可以创建新的FTP帐户。检查yourdomain.com/cpanel以确定是否安装了它。

在数据库中存储文件是非常糟糕的做法。仅存储有关文件的信息是非常好的做法。姓名,分机号码。文件保存在服务器上,如$id.$ext。这将是一个很好的体系结构。当用户下载文件时,他会使用数据库中的文件名。
对不起,我的英语是。

最好的方法是将文件引用存储在数据库中。文件本身将存储在服务器文件系统中。其复杂性在于确保数据库文件引用和服务器文件系统中现有文件之间具有引用完整性。某些数据库(如SQLServer2008)具有维护对实际文件本身的文件引用完整性的功能


除此之外,在服务器中保护文件本身取决于操作系统,在该操作系统中,可以对文件所在的特定文件夹配置权限。

如果文件是纯静态的,则可以使用只读或WORM介质来存储数据文件,或者从“LiveCD”运行整个web服务器。它当然不适合每个人的需要,但在数据完整性至关重要的有限情况下,它可以工作。

可下载的文件可以存储在htaccess保护的文件夹中。下面的脚本可用于为可下载文件生成动态链接

例如,安全下载链接

讨论 如果您选择将高价值的可下载内容文件直接保存在文件系统上,那么最好将它们保存在webroot之外。 然后,您的应用程序必须解决为内容(PDF、Word文档、歌曲等)创建url(必要时进行url编码)的问题

通常,这可以通过使用查询来检索文件路径,然后在用户单击锚点时使用文件路径将内容发送给用户(使用
header()
等…)(所有这些用户都没有看到真实的服务器端文件路径)

如果您不希望用户A向用户B共享高价值可下载内容的URL,那么您的应用程序必须以某种方式将链接专门绑定到用户A。可以做些什么?我应该从哪里开始

显然,在用户下载文件之前,您需要确保用户A在会话期间已登录。不太明显的是如何防止登录用户B使用从用户a(到用户B)发送的URL下载a的数字内容

使用
$\u SESSION
存储登录用户的ID(数字或字符串),并在最终查询中使用该部分(假设内容与用户购买或其他内容相关),将阻止登录用户下载未购买的内容,但您仍然会因为处理他们尚未购买的项目的SQL空集而招致资源损失。这听起来是个不错的第二步

第一步呢?是否有什么东西可以阻止开始时进行查询

好吧,让我们看看。在HTML表单中,可以在隐藏字段中使用XSRF令牌来验证提交的表单是否确实来自接收POST/GET请求的web服务器。一个令牌用于整个表单

给定一页特定于用户的下载内容(锚),可以将单个令牌(相同的令牌,但每页请求不同)以查询字符串参数的形式嵌入到每个锚的
href
属性中,并将此令牌的副本存储在
$\u会话中

现在,当登录用户B尝试使用登录用户a的共享URL时,整个过程都失败了,因为用户a和用户B有不同的会话(或者根本没有会话),因此令牌也不同。换句话说,“我的链接与你的相同,但不同。”锚定将绑定到会话,而不仅仅是页面、用户或内容

有了这个系统,PHP可以在不涉及数据库的情况下确定内容请求是否有效(通过将提交的令牌与
$\u会话中的令牌进行比较)。此外,可以在
$\u会话
中建立时间限制,以限制有效XSRF令牌的持续时间/生存期。只需使用
time()
函数和基本数学。在这种情况下,60分钟可能是锚的理想令牌寿命。如果单击的锚的令牌已过期,请让用户再次登录

总结 如果使用文件系统上的文件并将路径存储在数据库中,请确保也执行以下操作(至少)

  • 将适当的文件权限应用于内容目录(webroot之外)
  • 对上传的文件使用随机名称
  • 保存上载文件之前,请检查重复的文件名
  • 只有已登录的用户才能访问dow