10

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

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

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

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

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

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

  3. 使用 .htaccess 禁用 CGI 执行

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

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

  6. 最初,所有这些用户都将进行身份验证才能访问该网站——这是我在第一个问题中还必须考虑的问题——他们可以保持登录状态多久,我该如何控制?

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

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

附加信息:

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

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

4

7 回答 7

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

于 2013-03-18T14:21:52.453 回答
2

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

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

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

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

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

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

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

于 2013-03-14T19:40:20.313 回答
1

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

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

使用这样的程序的优点如下:

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

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

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

ps:

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

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

于 2013-03-20T03:11:06.647 回答
0

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

于 2013-03-20T20:07:22.467 回答
0

是的,您可以在没有 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-使用-php-streams/

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

于 2013-03-20T21:59:50.093 回答
0

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

于 2013-03-20T22:38:15.370 回答
0

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

周围有一些高级 ftpd,它们支持:

  1. 允许用户上传大文件(大部分是这样做的);
  2. 在普通密码认证之前拒绝用户连接;
  3. 允许用户在其特定 IP 范围内登录;
  4. 自定义权限,如上传/下载/删除/列表等;
  5. chroot 每个用户到他/她自己的文件夹;
  6. 可恢复(这也是一个可自定义的权限);
  7. 使用 SFV 文件进行文件完整性检查;
  8. 邮编完整性检查;

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

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

于 2013-03-21T00:25:40.307 回答