仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1076|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之PHP中uploaded

[复制链接]
爱飞 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:39:04 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
看到好的帖子最好up一下,以使得更多的人得到分享。   对PHP言语有些懂得的伴侣们都晓得,它包括有功效壮大的函数库。咱们明天就一同来懂得一下PHP uploaded_files函数的详细功效。
在初期的PHP版本中,上传文件极可能是经由过程以下的代码完成的:
复制代码 代码以下:
……
if (isset($_FILES['file'])) {
$tmp_name = $_FILES['file']['tmp_name'];
}
if (file_exists($tmp_name)) {
copy($tmp_name,$destfile);
}
……

然而极可能会被捏造一个$_FILES['file']数组出来,假如tmp_name的内容会被指定为/etc/passwd等敏感信息的内容,那末很容 易呈现平安成绩。PHP在后来的版本顶用is_uploaded_file() 和 move_uploaded_file()处理了这个成绩,用PHP uploaded_files函数不但会反省$_FILES['file'] ['tmp_name']是不是存在,并且会反省$_FILES['file']['tmp_name']是不是是上传的文件,如许就使得捏造$_FILES 变质变得不成能,由于剧本会在反省到$_FILES['file']['tmp_name']不是PHP上传的时分终止履行。
捏造变得不成能了么?在良多的剧本外面我看到初试化局部就有@extract($_POST)之类的操作,以包管法式在register globals为off的情况下能持续运转,如许的情况下咱们很轻松可以捏造$_FILES数组,乃至将本来的$_FILES数组掩盖,然而想完整的捏造 一个$_FILES数组仍是很坚苦的,由于你没法饶过is_uploaded_file() 和 move_uploaded_file()。
然而在windows下的PHP情况下测试时,咱们发明PHP的一时文件很有纪律,是C:\WINDOWS \TEMP\PHP93.tmp这类格局,上传的时分文件名字会是C:\WINDOWS\TEMP\PHPXXXXXX.tmp这类格局变更,个中 XXXXXX是十六进制的数字,而且是依照按次增添的,也就是说假如此次上传的一时文件名是C:\WINDOWS\TEMP\PHP93.tmp,那末下 次就会是C:\WINDOWS\TEMP\PHP94.tmp,一时文件名变得有纪律。
然而咱们能够不晓得以后的文件名是甚么,这可以经由过程PHP本身的错 误机制泄漏出来,比如咱们将一时文件拷贝到一个没有权限的目次或在方针文件里包括文件体系制止的字符就能够将以后的一时文件名字给泄漏出来,固然条件是 没有毛病克制处置。
那末究竟若何饶过is_uploaded_file() 和 move_uploaded_file()呢?看看PHP uploaded_files函数局部的代码:
复制代码 代码以下:
PHP_FUNCTION(is_uploaded_file)
{
zval **path;
if (!SG(rfc1867_uploaded_files)) {
RETURN_FALSE;
}
if (ZEND_NUM_ARGS() != 1 zend_get_parameters_ex(1, &path) != SUCCESS) {
ZEND_WRONG_PARAM_COUNT();
}
convert_to_string_ex(path);
if (zend_hash_exists(SG(rfc1867_uploaded_files), Z_STRVAL_PP(path), Z_STRLEN_PP(path)+1)) {
RETURN_TRUE;
} else {
RETURN_FALSE;
}
}

它 是从以后的rfc1867_uploaded_files哈希表中查找看是不是以后的文件名是不是存在。个中rfc1867_uploaded_files保 存了以后PHP剧本运转过程当中由体系和PHP发生的有关文件上传的变量和内容。假如存在,就申明指定的文件名切实其实是本次上传的,不然为否。
PHP 有个很奇异的特征就是,当你提交一个上传表单时,PHP在做处置之前这个文件就已被上传光临时目次上面,一向到PHP剧本运转停止的时分才会烧毁失落。也 就是说,你即便向一个不承受$_FILSE变量的PHP剧本提交如许一个表单,$_FILSE变量仍然会发生,文件仍然会被先上传光临时目次。成绩就发生 了。上面的剧本能够能申明这个成绩:
复制代码 代码以下:
< ?
$a=$_FILES['attach']['tmp_name'];
echo $a.”………….”;
$file='C:\\WINDOWS\\TEMP\\PHP95.tmp';
echo $file;
if(is_uploaded_file($file)) echo ‘………………Yes';
?>

其 中C:\\WINDOWS\\TEMP\\PHP95.tmp是我猜想的一时文件名字,事先,测试这个剧本的时分咱们需求向它上传一个文件或是100个 文件,使得个中一个一时文件名为C:\\WINDOWS\\TEMP\\PHP95.tmp。假如此刻剧本有extract操作,咱们就能够很便利的捏造 出一个$_FILES变量了。
不是么?能够要问捏造$_FILES变量有甚么感化,咱们就能够发生本来法式不答应的文件名了,PHP在处置上传的时分会对 本来的文件名有一个相似于basename()的操作,然而一旦可以捏造以后咱们就能够等闲的在文件名以内加\啊../啊等等你所喜好的任何器材
PHP uploaded_files函数的实践使用能够有点刻薄,然而也总算是PHP一点瑕疵吧,呵呵。根据功能来进行封装等。很多的不懂,在使用搜索引擎查找,或者请教老师和在老师详细的讲解、指导下,都能顺利解决。
爱飞 该用户已被删除
沙发
 楼主| 发表于 2015-4-4 17:05:47 | 显示全部楼层
实践是检验自己会不会的真理。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-1 07:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表