在 PHP 中允许上传大文件时是否需要考虑任何安全和/或性能影响?例如,这些是我当前设置的 PHP ini 设置。
memory_limit = 950M
upload_max_filesize = 950M
post_max_size = 950M
max_execution_time = 0
这些设置可能会出现什么问题(如果有的话)?
更改这些设置不会改变安全考虑。然而,对于性能而言,以下内容是有效的:
以高效的方式服务用户的艺术是为用户的总体需求提供足够的资源。根据您的设置将其转换为示例将类似于:
10 个用户上传 950 MB 的数据需要您提供 9.5 GB 的带宽和 I/O 吞吐量(例如,受磁盘速度的影响)。作为用户,我可能可以忍受在 1 分钟内上传 950 MB,但如果我花了一个小时就会不满意。
100 个用户上传 950 MB 需要您提供 95 GB...
1000 个用户上传 950 MB 需要您提供 950 GB 的服务... ...
当然,并非所有用户都始终追求最大,甚至并发上传也可能受到限制。然而,这些最大设置会增加您的风险堆栈。因此,根据您的使用特征和您的资源填充,这些设置可能是有效的。
但是我假设您给出了极端的例子并想了解其含义。
当我用谷歌搜索“optimize php memory_limit”时,我得到这个: https://softwareengineering.stackexchange.com/questions/207935/benefits-of-setting-php-memory-limit-to-lower-value-for-specific-php-script
显然您可以对其他设置执行相同的操作。
在论坛中,您可以发现很多人反对将这些配置值设置得这么高。然而,在其他访问层上仔细管理资源利用率的环境中(例如,通过应用程序内权限限制上传用户的数量),在过去对我来说确实非常有效。
更改
post_max_size
设置时需要考虑一些安全因素。
请参阅下面的示例和解决方案。
但是与其他答案中所说的不同, 您的服务器或客户端的带宽不需要增加, 至少如果它已经足够满足您的目标用户数量的话就不会。
服务器的存储容量是
100 GB
,只是为了简单,否则这个数字将是Tera-Bytes之大。
服务器的
php.ini
允许950M
,就像OP提到的那样。
服务器的 PHP 脚本限制每个用户拥有 1 GB 的可用存储空间,并且一旦用户数量达到 90% 容量,计划购买更多存储空间。
单个攻击者尝试上传 100 个文件,每个文件的大小为
950 MB
。
第一个文件已完成上传。
哪一端/填充允许 1 GB。
因为 PHP 脚本仅在整个文件发布(上传)后运行。
8M
值
post_max_size
已经足够了,
实际上,也许可以将其降低到3M
;因为,在上传完成之前检查post_max_size
限制,
每当达到该限制时,您的 PHP 脚本就会立即运行,
这允许您的脚本处理限制错误。
,不要增加post_max_size
,而是尝试以下操作:
JavaScript
(甚至
WebAssembly
)实现“块上传”。
对于任何超出您 post_max_size
限制的事情。
因为每个块仅包含文件的
8 MB
或
左右。3 MB
他们重试太多次。
注意另见:,较低的
基本上,可以像上面那样防止拒绝服务攻击。upload_max_filesize
并不会带来相同的好处, 因为只有在整个文件完成上传后才会检查该限制。
Laravel-chunk-upload