加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 可以伪造$_FILES […] [‘size’]吗?

发布时间:2020-12-13 17:30:55 所属栏目:PHP教程 来源:网络整理
导读:有一个众所周知的警告,即不相信通过 PHP上的文件上传发送的MIME类型($_FILES […] [‘type’]),因为这是由HTTP客户端发送的,因此可以伪造. 对于文件名($_FILES […] [‘name’])有一个类似的警告,它由HTTP客户端发送,可能包含潜在危险的字符. 但是,我看不出
有一个众所周知的警告,即不相信通过 PHP上的文件上传发送的MIME类型($_FILES […] [‘type’]),因为这是由HTTP客户端发送的,因此可以伪造.

对于文件名($_FILES […] [‘name’])有一个类似的警告,它由HTTP客户端发送,可能包含潜在危险的字符.

但是,我看不出文件大小($_FILES […] [‘size’])是如何伪造的,因为它似乎不是请求有效载荷的一部分,至少我看不到它在Chrome中的开发工具中,有效负载如下所示:

------WebKitFormBoundarytYAQ3ap4cmAB46Ek
Content-Disposition: form-data; name="picture"; filename="picture.jpg"
Content-Type: image/jpeg

原始文件名和MIME类型在此处按预期方式,但没有大小参数的符号.

尽管如此,我还是偶然发现了Symfony的UploadedFile实现,它认为文件大小是客户端的,因此不可信:

UploadedFile::getClientSize()

Returns the file size.
It is extracted from the request from which the file has been uploaded. Then is should not be considered as a safe value.

文件大小可以是请求有效负载的一部分,因此是伪造的,还是总是从$_FILES […] [‘tmp_name’]指向的实际文件中推断出来,因此始终可信?

解决方法

正如 @Dagon in the comments所建议的,我在 rfc1867.c检查了PHP源代码.

定义[size]属性所涉及的行是:

[1042] wlen = write(fd,buff,blen);
       ...
[1056] total_bytes += wlen;
       ....
[1242] ZVAL_LONG(&file_size,total_bytes);
       ...
[1270] snprintf(lbuf,llen,"%s[size]",param);
       ...
[1275] register_http_post_files_variable_ex(lbuf,&file_size,...

我翻译为:

> 1042临时文件以wlen大小的块写入
> 1056在每次迭代中,wlen被添加到total_bytes
> 1242 total_bytes被分配给file_size zval
> 1270目标变量名称… [size]分配给lbuf
> 1275 file_size以lbuf中包含的名称注册,… [size]

毫无疑问,唯一分配给$_FILES […] [‘size’]的变量是写入临时文件的实际字节数,其路径分配给$_FILES […] [‘tmp_name’] .

据我所知,没有办法伪造size属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读