【问题标题】:Letting Users Upload Huge Files to Website让用户上传大文件到网站
【发布时间】:2012-06-16 13:50:52
【问题描述】:

所以我需要一点建议。我正在建立一个仅用于学术目的的网站,仅限于少数人。本网站的唯一目的是作为文件上传的 GUI。这些文件的大小通常在 10-12GB 之间。

通过 reasearch,我发现我可以使用 php 脚本上传文件并更改 php.ini 中的最大文件上传大小(但我找不到最大文件上传大小限制)。我有几个问题。

1) 我是否需要想办法保持网站和用户之间的连接打开,以避免出现连接超时等问题?如果是这样,在服务器端这样做就足够了吗?还是这些用户将使用的网络浏览器也存在问题(网络浏览器是否会使您的连接超时)? --- 我问这个是因为这些上传将花费大量时间。

2) 我必须考虑哪些安全问题?到目前为止,我发现并考虑了以下内容:

  1. 限制仅从多个子网(我希望的学术用户)访问网站

  2. 要上传到网站的文件是一种特殊格式,由唯一的标题组成)——因此会检查这些标题。

  3. 使用 .htaccess 禁用 CGI 执行

  4. 将所有上传文件移到 www 根文件夹之外

  5. 检查这些文件可能会找到防病毒软件

  6. 1234563 ?

本网站的安全性对其开发至关重要,当您处理 12 GB 文件时,这是一个非常棘手的问题。

这些是我认为很难实现的一些事情,但我相信还有更多。你们认为我还应该考虑什么?另外,如果有其他实现方法,请不要犹豫。

附加信息:

  • 截至目前,这些用户使用 scp 将文件上传到此服务器
  • 这些用户深受我的社区的信任,但安全是这个社区的第一要务 - 很少有东西向公众开放,而且存储在这些服务器上的一些信息不能被泄露
  • 要上传到服务器的文件基本上是关于真人的机密数据——所以我必须考虑诸如数据包嗅探之类的事情

谢谢大家,我知道这很困难,但任何帮助都将不胜感激。

【问题讨论】:

    标签: php security upload


    【解决方案1】:

    您不可能通过 PHP 上传这么大的单个文件。不管你投入多少服务器资源(内存)(相信我,你需要很多!),PHP 中有一个限制会阻止你这样做。

    在 php.ini 中,有一个名为“post_max_size”的变量会影响您可以发送到服务器的最大数据大小。这个变量是一个无符号的 32 位整数,这意味着你不能超过 4,294,967,295。

    一个好的解决方案是使用Flash将文件分成几个小部分,然后进行文件上传。我为您找到了一个完全可以做到这一点的库:http://www.blog.elimak.com/2011/08/uploading-large-files-with-flash-splitting-the-bytearray-in-chunks/

    如果您在 PHP 中遇到内存问题,只需将块变小即可。

    祝你好运!

    编辑:要回答您的第二个问题,您已经掌握了大部分内容。如果您担心数据可能在途中被劫持,请使用 SSL 进行传输。至于身份验证,请考虑使用 OAuth,并确保在传输不活动时撤销用户的访问令牌。将php_flag engine off 添加到您的 .htaccess 文件中,以防止上传的 PHP 文件运行。而且定期运行服务器病毒扫描程序也不是一件坏事:)

    【讨论】:

      【解决方案2】:

      不了解您的用户,我建议您坚持使用 SCP。您的所有安全问题都已通过 SCP 得到解决,并且可以广泛免费获得。

      话虽如此,我知道如果您是非技术用户,SCP 会很痛苦。如果我是你,我不会尝试将其完全实现为 Web 应用程序。我将有一个 Web 前端,它只会为用户生成适当的 SCP 命令,并为他们执行它。使用 Java 小程序应该很容易做到这一点,您可以通过浏览器提供粗略的进度,只需将它反馈给您的进程的 SCP 进度转换为 Java。如果你走小程序路线,你会遇到一些安全问题,因为小程序通常不能在客户端的 PC 上启动进程。要解决此问题,您需要签署小程序和/或请求更高级别的权限。同样,这可能是也可能不是一个好的解决方案,具体取决于您的用户的技术水平。

      如果您坚持使用网络应用程序路线,请确保使用 SSL/TLS 进行传输。这可以解决您的数据包嗅探问题。还要确保没有在任何大文件上设置可执行位。如果它们需要可执行,请坚持让用户在下载时设置可执行位,而不是在存储时设置。如果必须在服务器上执行,请使用内置的文件系统权限对应用程序进行沙箱处理。如果他们必须以 root 身份在服务器上上传和执行,天堂会帮助您。如果是这样,那么安全性是不可能的:-)

      使用防病毒软件检查文件是好的,但请注意,检测率很糟糕。我见过文件被深度感染并被 35 个 AV 程序中的 30 个宣布为干净的情况。假设所有文件都被感染并适当地限制它们的权限。

      真正的风险是有人可能会上传包含漏洞利用的代码。只要文件不可执行,就更难了。如果无法访问编译器,那就更难了。如果您将文件可以访问的方式限制为仅某些程序,那么对利用者来说就更难了。但是,您可以做的最好的事情是安装补丁来防止这种情况。更新可以确保您的安全,即使它们有时会破坏某些内容。

      如果用户是值得信赖的,您可以允许他们自己设置可以读取/写入文件的权限。这样个人的敏感信息就受到控制,如果有人将权限设置为松散,就会有一些责任。

      这是一个需要解决的大问题,我知道我只是触及了表面。我希望它至少能有所帮助。

      【讨论】:

        【解决方案3】:

        如您所说,有效地建立这样一个网站确实非常棘手。但是,您可能需要考虑使用 Java 或 C# 中构建的 GUI 程序作为更合适/更安全的方法。原因和优点很多。

        首先,非常建议您在上传之前在客户端进行拆分。您的用户可以轻松使用为此而设计的强大实用程序,例如 FFSJ Command Line Interface(适用于 Windows)或 JJSplit (Java Open Source)

        使用这样的程序的好处如下:

        1. 更好、更安全的用户身份验证
        2. 在客户端和服务器端验证用户 IP 子网
        3. 您可以选择拆分文件以便于传输
        4. 您可以同时上传多个文件部分
        5. 您可以使用用户的互联网连接最高速度
        6. 您有能力确保最大限度地减少和纠正上传过程中可能发生的错误。
        7. 上传后校验校验,确保上传的真实性和正确性
        8. 更多安全优势,因为您上传的内容甚至可以加密。

        我可以继续说下去,但你明白要点。但是,如果您不是程序员,则此选项的明显缺点是财务成本和时间。

        但是,已经具备基本拆分和上传能力的程序之一是GSplit。在基于 Unix 的系统上,他们还可以在上传或使用诸如 HJSplit 之类的程序之前自行拆分文件。

        ps:

        如果您必须始终坚持使用 PHP,请查看 Open Upload。它类似于 RapidShare 克隆,并且已经具有 ip 限制、用户身份验证、验证码等。

        我希望能详尽地回答您的问题。祝你好运。

        【讨论】:

        • +1:除了关于“如果你必须坚持使用 php”的部分。我会将其更改为“不要在 php 中执行此操作。它不会成功。”
        • :D 应该降低你的声音。一些 PHP 成瘾者可能会提出不同的论点。
        【解决方案4】:

        您可以使用 ajax 函数来保持会话正常运行或使用 ob 函数来控制流程。 见http://www.php.net/manual-lookup.php?pattern=ob&lang=pt_BR&scope=quickref

        【讨论】:

          【解决方案5】:

          是的,您可以不使用 flash 或 java,但使用 HTML5。您可以通过 FileReader 对象创建文件的读取切片,然后通过 ajax 将原始块发送到服务器,然后您可以读取它们并在 PHP 中组装它们。好的想法是,当您将文件发布到 PHP 时,您可以在 ajax 发布请求中传递其他属性,例如开始字节和结束字节,这样您就可以跟踪上传了哪些部分,并且您可以构建某种如果需要,暂停/恢复逻辑。欲了解更多信息,请查看:

          http://www.html5rocks.com/en/tutorials/file/dndfiles/ http://www.webiny.com/blog/2012/05/07/webiny-file-upload-with-html5-and-ajax-using-php-streams/

          我宁愿使用 HTML5 而不是 java 或 flash。您可以使用 SSL,如果您真的希望它更安全,您可以在发送之前为这些用户提供私钥来加密数据,然后您可以在服务器上解密(如果您使用 SSL,这将有点多余)。请记住,解密 12 GB 的数据文件可能会很慢。

          【讨论】:

            【解决方案6】:

            恕我直言,FTP 更适合这种情况。

            【讨论】:

              【解决方案7】:

              我会认真建议 FTP + 显式/隐式 SSL。这肯定会解决您的问题。

              周围有一些先进的 ftpd,它们支持:

              1. 允许用户上传大文件(大多数情况下);
              2. 在纯密码身份验证之前拒绝用户连接;
              3. 允许用户在其特定 IP 范围内登录;
              4. 上传/下载/删除/列表等自定义权限;
              5. Chroot 每个用户到他/她自己的文件夹;
              6. 可恢复(也是可自定义的权限);
              7. 使用 SFV 文件进行文件完整性检查;
              8. Zip 完整性检查;

              唯一的缺点是下载客户端并进行设置,这并不是每个人都喜欢的。

              像 HTTP 一样,你需要某种浏览器来查看内容,你还需要 FTP 客户端来分别操作它。

              【讨论】:

                猜你喜欢
                • 2014-02-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-03-19
                相关资源
                最近更新 更多