我用 $_POST 获取了一些变量,主要由用户在表单上输入。为了防止在表单中插入巨大的值,我可以检查这些变量并在它们太长时向用户返回错误。
但是,如果用户输入一个非常长的值,我就不能这样做,因为在这种情况下,整个脚本在我什至可以拒绝处理该变量之前就崩溃了。这是否对我的服务器安全构成威胁?
如何在不增加默认内存限制的情况下解决此问题?可能吗?
使用 javascript 限制用户输入可能是一种选择,但用户可以通过禁用 javascript 轻松克服该限制。
我用 $_POST 获取了一些变量,主要由用户在表单上输入。为了防止在表单中插入巨大的值,我可以检查这些变量并在它们太长时向用户返回错误。
但是,如果用户输入一个非常长的值,我就不能这样做,因为在这种情况下,整个脚本在我什至可以拒绝处理该变量之前就崩溃了。这是否对我的服务器安全构成威胁?
如何在不增加默认内存限制的情况下解决此问题?可能吗?
使用 javascript 限制用户输入可能是一种选择,但用户可以通过禁用 javascript 轻松克服该限制。
您可以使用 ini 指令限制帖子正文的最大大小post_max_size
。但是它的默认值为 8M。如果它没有改变应该没问题,因为默认memory_limit
是128M。(PHP 5.3)
但这当然取决于您将要对数据做什么以及 PHP 将为此消耗多少内存。极端地说,甚至可以创建一个示例脚本,以 1 字节输入达到内存限制。因此,您必须为您的应用程序找到合适的值。
从文档
设置允许的帖子数据的最大大小。此设置也会影响文件上传。要上传大文件,该值必须大于upload_max_filesize。如果您的配置脚本启用了内存限制,那么 memory_limit 也会影响文件上传。一般来说,memory_limit 应该大于 post_max_size。使用整数时,该值以字节为单位。也可以使用本常见问题解答中描述的速记符号。如果 post 数据的大小大于 post_max_size,则 $_POST 和 $_FILES 超全局变量为空。这可以通过多种方式进行跟踪,例如通过将$_GET 变量传递给处理数据的脚本,即,然后检查是否设置了$_GET['processed']。
您可以访问 php.ini 吗?您可以设置upload_max_filesize / post_max_size
有关详细信息,请参见此处:http: //php.net/manual/en/ini.core.php#ini.sect.file-uploads
(ps 在 HTML 表单中设置 maxlength 很容易被恶意用户绕过)
将客户端上的数据分割成部分,通过Ajax分块下载,然后将下载的部分保存到磁盘或数据库中。也许这样?