通过php上传文件时的安全措施

通过php上传文件时的安全措施,php,security,file-upload,Php,Security,File Upload,我有一个文件上传脚本,可供公众使用(例如,不是封闭的工作环境),我担心安全性: 我想允许上传任何文件,每个文件都将上传到它自己的唯一目录,显然,我无法控制人们是否上传恶意文件,但处理这些文件的最佳方法是什么 我想到: 完全删除扩展名,并且仅当提供要下载的文件时,才将其原始扩展名还给它们(因为所有文件名和位置都将保存在db中) 创建“安全区域”以禁止在目录中运行多个扩展 不允许上传“不安全”的扩展 当然,问题是: 有太多的“不安全”文件扩展名,无法将其全部计算在内。 可以将文件屏蔽为“安全的”,尽

我有一个文件上传脚本,可供公众使用(例如,不是封闭的工作环境),我担心安全性: 我想允许上传任何文件,每个文件都将上传到它自己的唯一目录,显然,我无法控制人们是否上传恶意文件,但处理这些文件的最佳方法是什么

我想到:

完全删除扩展名,并且仅当提供要下载的文件时,才将其原始扩展名还给它们(因为所有文件名和位置都将保存在db中)

创建“安全区域”以禁止在目录中运行多个扩展

不允许上传“不安全”的扩展

当然,问题是: 有太多的“不安全”文件扩展名,无法将其全部计算在内。 可以将文件屏蔽为“安全的”,尽管它包含一些代码。 还有很多其他的安全风险


所以。。。有什么建议吗?

如果你所做的只是充当一个文件存储,你关心什么?你没有执行这些文件,也没有以任何方式查看它们,是吗

文件扩展名与文件的安全性无关


编辑:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后您的脚本将被传递该校验和,该校验和将在您的数据库中查找,然后您将以某种方式返回该文件。不要使用您的Web服务器提供文件,否则(正如您在下面的评论中所说)您可能会意外地执行上载的PHP文件。

如果您所做的只是充当文件存储,您关心什么?你没有执行这些文件,也没有以任何方式查看它们,是吗

文件扩展名与文件的安全性无关

编辑:您真正要做的是将文件名与完整路径的校验和一起存储在数据库中。然后您的脚本将被传递该校验和,该校验和将在您的数据库中查找,然后您将以某种方式返回该文件。不要使用您的Web服务器提供文件,否则(正如您在下面的评论中所说)您可能会意外地执行上载的PHP文件。

为了适当的安全:

  • 限制文件大小
  • 切勿使用任何用户提供的数据作为文件名的一部分来存储文件。通过数据库跟踪上传,并使用相关记录的主键存储文件
  • 不要将文件放在可通过web访问的目录中-仅允许通过脚本进行访问。然后,此脚本可以在下载标题中填写原始文件名
  • 无论在何处存储文件,都要使用非执行权限存储它们。这意味着在Unix ish系统上最多只能有0640个,在Windows系统上最多只能有相当的数量
  • 限制上传,防止用户在你的系统中塞满最新的夏季大片bluray rip。限制下载,防止你的网站成为下一个warez天堂
  • 尽可能多地跟踪有关用户的数据:至少跟踪浏览器ID及其IP地址。更好的是,在让他们靠近站点的文件处理部分之前,需要某种形式的身份验证/登录
  • 为了适当的安全:

  • 限制文件大小
  • 切勿使用任何用户提供的数据作为文件名的一部分来存储文件。通过数据库跟踪上传,并使用相关记录的主键存储文件
  • 不要将文件放在可通过web访问的目录中-仅允许通过脚本进行访问。然后,此脚本可以在下载标题中填写原始文件名
  • 无论在何处存储文件,都要使用非执行权限存储它们。这意味着在Unix ish系统上最多只能有0640个,在Windows系统上最多只能有相当的数量
  • 限制上传,防止用户在你的系统中塞满最新的夏季大片bluray rip。限制下载,防止你的网站成为下一个warez天堂
  • 尽可能多地跟踪有关用户的数据:至少跟踪浏览器ID及其IP地址。更好的是,在让他们靠近站点的文件处理部分之前,需要某种形式的身份验证/登录

  • 只需在您的文档根目录外上传它们,并在请求时为它们提供一个php文件

    只需在您的文档根目录外上传它们,并在请求时为它们提供一个php文件

    为了防止服务器端执行,不要将它们放在可通过web访问的文件夹中,而是使用脚本来处理文件的发送

    即:


    为了防止服务器端执行,不要将它们放在可通过web访问的文件夹中,而是使用脚本来处理文件的发送

    即:


    我想你可以用这种方法来保证它的安全

    1-不要将文件作为其名称上载(意味着您应该使用
    md5(rand().time().rand());

    )

    2-在字典中添加空页以便上载,您可以添加.htaccess以拒绝所有您可以使用的读取

    要显示或下载图像的文件

    3-如果允许使用->可以使用php中的
    rename()
    将字典重命名为其他名称

    4-检查上传大小,并使用
    @include()隐藏所有路径

    5-正如@periklis所说,如果您可以将文件保存在文档根目录之外,这将很有帮助:)


    6-在您降低文件扩展名后,拒绝此扩展名
    .php、.asp.pl.py.rb.htaccess
    ,我认为您可以使用此方法使其安全

    1-不要将文件作为其名称上载(意味着您应该使用
    md5(rand().time().rand());

    )

    2-在字典中添加空页以便上载,您可以添加.htaccess以拒绝所有您可以使用的读取

    要显示或下载图像的文件

    3-如果允许使用->可以使用php中的
    rename()
    将字典重命名为其他名称

    4-检查上传大小,并使用
    @include()隐藏所有路径<?php
    
    // TODO: acl related stuff
    // TODO: Map request to file name
    // Send the file as an attachment
    header('Content-type: application/octet-stream');
    header('Content-Disposition: attachment; filename="' . $givenFileName . '"');
    readfile($realFileName);