大型开机自检传输仅适用于登录用户


Large POST transfer only for logged-in users?

在我的主页上,"登录"(通过PHP会话(的用户应该被允许上传非常大的文件(通过标准的HTML5/PHP/XMLHttpRequest/POST-formular(。因此,我将"post_max_size"设置为0以消除对文件大小的任何限制。

但是,我想避免现在每个人都可以将任意大的 POST 数据发送到我的服务器并阻止它。我想首先验证登录,然后接受非常大的 POST 传输以启动。

如何实现这一点?

受到 Jari 评论的启发,我实施了以下策略,这对我来说效果很好。由于我使用HTTPS进行网站和文件上传,因此此策略甚至可以防止网络嗅探攻击。

我的网站基于 php,登录用户在其中检索 php-session(-id(。

php.ini的默认值为 post_max_size = 8M back,因此我的服务器通常不接受大的 POST 传输。

登录时,我在客户端设置了一个临时 cookie secret=XXXXXXXX,其中 X 表示一个随机字符串,该字符串也保存在服务器端的 $_SESSION["secret"] 中。

在服务器端,我为每个会话创建一个可访问的 Web "用户目录"tmp-YYYYYYYY,其中 Y 只是另一个随机字符串。在这个目录中,我放置了一个指向我的全局upload.php脚本的符号链接,该脚本通过 POST 从上传表单接收文件上传(您也可以将upload.php复制到用户目录(。现在,为了允许 POST 传输到tmp-YYYYYYYY/upload.php可能具有无限大小,我还创建了包含行php_value post_max_size 0的文件tmp-YYYYYYYY/.htaccess。这样就可以将无限大小的 POST 数据传递给链接的上传脚本。但是,这是不安全的,因为每个知道/嗅探 URL tmp-YYYYYYYY/upload.php的人都能够向该文件发送任意大型 POST 数据,这可能会淹没服务器的 tmp 目录。为了避免这种情况,我的完整.htaccess文件如下所示:

重写引擎打开RewriteCond %{HTTP_COOKIE} !secret=XXXXXXXXX;?重写规则 ^ https://www.myserver.com/secreterror.php [L]php_value post_max_size 0

也就是说,每当发送大型 POST 数据的客户端没有带有密钥值的 cookie 时,我都会将他定向(因为目标是绝对 url(到某个错误通知脚本。此重定向不会转发 POST 数据,因此在这种情况下,我的服务器上不会存储任何 POST 数据。如果客户端设置了正确的秘密 cookie,则用户目录允许的最大 POST 数据大小设置为无限制,因此对于 upload.php

结语:

  • 您还可以使用post_max_size 4G,以便不允许"真正"任意的大数据
  • 您还可以在此处覆盖其他 PHP 值,所有在此列表中标记为PHP_INI_PERDIR
  • 的值
  • 为了能够在.htaccess中覆盖post_max_size,Apache不能在CGI模式下运行PHP,而是作为Apache模块运行。您可以通过phpinfo()"服务器API"字段中进行检查。看这里和这里
  • 必须启用 mod_rewrite Apache 模块,例如通过 sudo a2enmod rewrite 加上重新启动 Apache service apache2 restart
  • 可能必须修改虚拟主机配置,以便允许.htaccess启用重写,例如通过AllowOverride All
  • 如果没有HTTPS,cookie的传输是不安全的,因此该方法容易受到网络嗅探器的攻击,就像通常通过HTTP的php会话一样。
  • 与其为每个会话创建一个目录,为单个密钥包含自己的.htaccess -file,不如为所有用户使用相同的上传文件(在其自己的单个目录中(,并在数据库中存储/更新所有临时密钥,然后使用修改后的RewriteCond检查该数据库以查找在cookie中传递的密钥