让用户将巨大的文件上传到网站

时间:2012-06-13 14:58:15

标签: php security upload

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

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

1)我是否需要以某种方式找出维护网站与用户之间连接的方法,以避免连接超时等问题?如果是这样,是否足以在服务器端执行此操作?或者这些使用者将使用的Web浏览器也存在问题(Web浏览器会超时连接)吗? ---我问这个是因为这些上传需要花费大量时间。

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

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

  2. 将要上传到网站的文件是一种特殊格式,由唯一标头组成) - 从而检查这些标头。

  3. 使用.htaccess

  4. 禁用CGI exectuions
  5. 将所有上传内容移至www根文件夹

  6. 之外
  7. 可能会发现反病毒检查这些文件

  8. 最初所有这些用户都会进行身份验证以访问此网站 - 这也是我必须考虑的第一个问题 - 他们可以保持多长时间登录以及如何控制

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

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

    有条件的信息:

    • 截至目前,这些用户使用scp将文件上传到此服务器
    • 这些用户非常信任我的社区,但安全性是这个社区的头号座右铭 - 很少有东西对公众开放,而且这些服务器上存储的一些信息无法被压缩
    • 要上传到服务器的文件基本上是关于真人的机密数据 - 所以我必须考虑诸如数据包嗅探之类的事情

    谢谢你们,我知道这是很多东西,但任何帮助都会非常感激。

7 个答案:

答案 0 :(得分:10)

您无法通过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文件运行。并且服务器病毒扫描程序定期运行也不是坏事:)

答案 1 :(得分:2)

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

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

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

使用防病毒检查文件是好的,但请注意检测率很差。我已经看到过一个文件受到严重感染并被35个AV程序中的30个发音干净的情况。假设所有文件都被感染并适当地限制其权限。

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

如果用户值得信任,您可以允许他们自己设置权限,以便谁可以读/写文件。这样可以控制个人的敏感信息,如果有人将权限设置为松散,则存在一些责任。

这是一个很难解决的问题,我知道我只是触及了表面。我希望它至少有一点帮助。

答案 2 :(得分:1)

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

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

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

  1. 更好,更安全的用户身份验证
  2. 在客户端和服务器端验证用户IP子网
  3. 您可以选择拆分文件以方便传输
  4. 您可以同时上传多个文件部分
  5. 您可以使用用户的Internet连接最高速度
  6. 您可以确保最小化以及纠正上传过程中可能发生的错误。
  7. 上传后的校验和验证,以确保真实性和正确上传
  8. 由于您甚至可以对上传进行加密,因此可以获得更多安全优势。
  9. 我可以继续,但你得到了要点。但是,如果您不是程序员,这个选项的明显缺点是财务成本和时间。

    然而,一个已经具备拆分和上传基本功能的程序是GSplit。在基于Unix的系统上,他们也可以在上传之前拆分文件,或者使用HJSplit等程序。

    PS:

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

是的,你可以在没有flash或java的情况下使用HTML5。您可以通过FileReader对象创建文件的读片,然后通过ajax将原始块发送到服务器,然后您可以读取它们并在PHP中组装它们。好的想法是,当你将文件发布到PHP时,你可以在ajax post请求中传递开始字节和结束字节等附加属性,这样你就可以跟踪哪些部分被上传,你可以构建一些排序如果需要,暂停/恢复逻辑有关更多信息,请查看:

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的数据文件可能会相当慢。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

有一些提前的ftpds,支持:

  1. 允许用户上传大文件(主要是);
  2. 在普通密码验证之前拒绝用户连接;
  3. 允许用户在他/她的特定IP范围内登录;
  4. 自定义权限,例如上传/下载/删除/列表等;
  5. 将每个用户chroot到他/她自己的文件夹;
  6. 可恢复(这也是一项惯常的许可);
  7. 使用SFV文件检查文件完整性;
  8. Zip完整性检查;
  9. 唯一的缺点是下载客户端并设置它,这不是每个人的最爱。

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