Home  >  Article  >  Backend Development  >  【求助】关于is_uploaded_file()的使用

【求助】关于is_uploaded_file()的使用

WBOY
WBOYOriginal
2016-06-23 14:17:531052browse

各位大牛晚上好!小弟刚接触PHP,在看一些教材的时候有说到这样一段话:

通过is_uploaded_file()函数对上传的文件进行判断,可以确保恶意用户无法欺骗脚本去访问本不能访问的文件,例如/etc/password

小弟的问题来了:如果真的没有用is_uploaded_file()来检测的话,那么“恶意用户”如何做到欺骗脚本去访问本不能访问的内容呢?不解...望大牛可以略微解释得通俗易懂一些,谢谢!


回复讨论(解决方案)

对于 php5.4 及更高版本这个函数已经没有意义了

操作上传的文件,一般使用 move_uploaded_file 函数,它内部也会调用 is_uploaded_file
当然也不能排除你偏要用 copy 函数,所以才有了 is_uploaded_file
显然如果是
copy('/etc/password', './ps')
那么就可以将系统的口令文件复制了过来
当然,你的代码是不会这样写的,你可能会写作
copy($file_tmp, $target)
如果 $file_tmp 的值是 /etc/password 的话,仍然可以将系统的口令文件复制了过来的
所以要对这个 $file_tmp 做 is_uploaded_file 检查

那么你会说 $file_tmp 是程序中的变量,人家怎么能赋值呢?
问题就出在 php 的自动注册开关上
当 register_globals = on 的时候
传入的数据都会变成全局变量,比如 ?file_tmp=xxxx 就会有一个 $file_tmp 变量,值为 xxxx
而名为 file 的上传控件也会产生一个 $file_tmp 
到此,你已经看到可以通过 url 参数来骗过 php

正因为如此
php 5.3 默认 register_globals = off,并不建议打开
php 5.4 及更高版本 register_globals 开关已经取消

对于 php5.4 及更高版本这个函数已经没有意义了

操作上传的文件,一般使用 move_uploaded_file 函数,它内部也会调用 is_uploaded_file
当然也不能排除你偏要用 copy 函数,所以才有了 is_uploaded_file
显然如果是
copy('/etc/password', './ps')
那么就可以将系统的口令文件复制了过来
当然,你的代码是不会这样写的,你可能会写作
copy($file_tmp, $target)
如果 $file_tmp 的值是 /etc/password 的话,仍然可以将系统的口令文件复制了过来的
所以要对这个 $file_tmp 做 is_uploaded_file 检查

那么你会说 $file_tmp 是程序中的变量,人家怎么能赋值呢?
问题就出在 php 的自动注册开关上
当 register_globals = on 的时候
传入的数据都会变成全局变量,比如 ?file_tmp=xxxx 就会有一个 $file_tmp 变量,值为 xxxx
而名为 file 的上传控件也会产生一个 $file_tmp 
到此,你已经看到可以通过 url 参数来骗过 php

正因为如此
php 5.3 默认 register_globals = off,并不建议打开
php 5.4 及更高版本 register_globals 开关已经取消

谢谢~现在明白了~

默默收藏

知道怎么回事了,学习了

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn