php – 可以伪造$_FILES […] [‘size’]吗?
有一个众所周知的警告,即不相信通过
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()
文件大小可以是请求有效负载的一部分,因此是伪造的,还是总是从$_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大小的块写入 毫无疑问,唯一分配给$_FILES […] [‘size’]的变量是写入临时文件的实际字节数,其路径分配给$_FILES […] [‘tmp_name’] . 据我所知,没有办法伪造size属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |