php 文件上传

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 文件上传相关的知识,希望对你有一定的参考价值。

文件上传表单
<html>
<body>
<form method="post" action="two.php" enctype="multipart/form-data">
<table border=1>
<tr>
<td>
<input type="hidden" name="MAX_FILE_SIZE" value="200000">文件:</td>
<td>
<input name="file" type="file" value="浏览" > </td>
<td>
<input type="submit" value="上传" name="B1"> </td>
</tr>
</table>
</form>
</body>
</html>
two.php页面代码
<?php
$uploaddir = "D:My Documents/phpnow/htdocs/mysite/_notes/upload/";//设置文件保存目录 注意包含/
$type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型
$patch="http://127.0.0.1/mysite/untitled.php/";//程序所在路径
function fileext($filename)

return substr(strrchr($filename, '.'), 1);
//获取文件后缀名函数
function random($length)

$hash = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for($i = 0; $i < $length; $i++)

$hash .= $chars[mt_rand(0, $max)];

return $hash;

$a=strtolower(fileext(@$_FILES['file']['name']));//生成随机文件名函数
if(!in_array(strtolower(fileext(@$_FILES['file']['name'])),$type))

$text=implode(",",$type);
echo "您只能上传以下类型文件: ",$text,"<br>";
//判断文件类型
else

$filename=explode(".",$_FILES['file']['name']);
do

$filename[0]=random(6); //设置随机数长度
$name=implode(".",$filename); //$name1=$name.".Mcncc";
$uploadfile=$uploaddir.$name;

while(file_exists($uploadfile));
if (move_uploaded_file(@$_FILES['file']['tmp_name'],$uploadfile))
if(is_uploaded_file(@$_FILES['file']['tmp_name']))
//输出图片预览
echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center><img src='$uploadfile'></center>";
echo"<br><center><a href='javascript:history.go(-1)'>继续上传</a></center>";
//生成目标文件的文件名
else
echo "上传失败!";



?>
问:文件上传失败,为什么它(文件)还能保存到我所指定的文件夹里?
问:为什么文件上传会失败?看一看代码有什么问题,还是我的路径写的有问题
$patch="http://127.0.0.1/mysite/untitled.php/";//程序所在路径 这一句代码不是很了解 解释一下吧
问:改成$uploaddir = "./upload/";上传的时候,页面会显示以下的内容:
Warning: move_uploaded_file(./upload/CR-fxIgzY.jpg) [function.move-uploaded-file]: failed to open stream: No such file or directory in D:\My Documents\phpnow\htdocs\mysite\two.php on line 44 但文件不能保存了
烦人啊

<?php
//$uploaddir = "D:My Documents/phpnow/htdocs/mysite/_notes/upload/";原代码,路径少了个斜杠,按道理是错误的.
$uploaddir = "D:/My Documents/phpnow/htdocs/mysite/_notes/upload/";//设置文件保存目录 注意包含/
$type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型
// 下面这句,程序中都没有用到,估计是用来做预览图片的浏览路径的.
//因为,如果是在服务器上面,使用$uploaddir这种本地路径(相对于http://这种网络路径)的地址来
//访问是访问不到的,所以应该改成这样如下,相应的图片的预览路径也有一点改动
$patch="http://127.0.0.1/mysite/_notes/upload/";//程序所在路径
function fileext($filename)

return substr(strrchr($filename, '.'), 1);
//获取文件后缀名函数
function random($length)

$hash = 'CR-';
$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
$max = strlen($chars) - 1;
mt_srand((double)microtime() * 1000000);
for($i = 0; $i < $length; $i++)

$hash .= $chars[mt_rand(0, $max)];

return $hash;

$a=strtolower(fileext(@$_FILES['file']['name']));//生成随机文件名函数
if(!in_array(strtolower(fileext(@$_FILES['file']['name'])),$type))

$text=implode(",",$type);
echo "您只能上传以下类型文件: ",$text,"<br>";
//判断文件类型
else

$filename=explode(".",$_FILES['file']['name']);
do

$filename[0]=random(6); //设置随机数长度
$name=implode(".",$filename); //$name1=$name.".Mcncc";
$uploadfile=$uploaddir.$name;

while(file_exists($uploadfile));
//原代码是先移动文件(已经移动,原文件不存在了),后判断是否是通过上传的文件(当然了,文件都没了,怎么还会是true呢.),
if(is_uploaded_file(@$_FILES['file']['tmp_name'])&&move_uploaded_file(@$_FILES['file']['tmp_name'],$uploadfile))
//输出图片预览,注意img标签的src,有改动
echo "<center>您的文件已经上传完毕 上传图片预览: </center><br><center><img src='$patch$name'></center>";
echo"<br><center><a href='javascript:history.go(-1)'>继续上传</a></center>";
else
echo "上传失败!";


?>
参考技术A $uploaddir = "./upload/";
if(!file_exists($uploaddir))//检查上传文件目录是否存在
mkdir($uploaddir);//创建目录

if(is_uploaded_file(@$_FILES['file']['tmp_name'])) //检查上传文件是否存在
move_uploaded_file($_FILES['file']['tmp_name'],$uploaddir);//移至指定目录
参考技术B is_uploaded_file要在move_uploaded_file之前运行,是用来判断文件来源是否正确合法,是否通过HTTP POST上传 而你的上传函数move_uploaded_file是运行成功的先,所以文件已保存
$patch 是你的untitled.php文件地址,127.0.0.1是你本地主机名,也可换成localhost

$uploaddir变成相对路径的话那么上传目录一定要在站点以内,在站点外要用绝对路径才行
我看你的应该是在站点内,还是有问题的话肯定是你的路径有误,与你执行文件位置不相对应追问

我是在虚拟主机上测试的 upload空文件夹在:D:My Documents/phpnow/htdocs/mysite/_notes/的目录下 在站点内 帮忙测试一下 成功了我在加20分 谢谢

来自:求助得到的回答
参考技术B move_uploaded_file($img["tmp_name"], $destination); 注意你传的参数 参考技术C 你把upload前面的斜杠去掉看看行吗??

文件上传漏洞与利用

1 文件上传过程分析

1.1 PHP文件上传

关于PHP中$_files数组的使用方法

技术图片

 

1.2 PHP文件上传源代码

  前端上传页面:upfile.php

技术图片

   上传处理程序:upload.php

技术图片

 

1.3 PHP文件上传过程分析

技术图片

 技术图片

2 文件上传风险:

  • 允许用户上传文件是一个巨大的安全风险。攻击者可以通过上传文件位置,上传可执行的网页木马、一句话以及.exe 可执行文件。
  • 上传程序需要严格限制上传文件的类型,一般原则上只允许上传图片、音乐、文档等不可执行的文件。

2.1 文件上传检测控制方法

1 、通过前端JavaScript 检测文件扩展名
2 、服务器端检测文件传输类型content_type

  MIME类型检测是客户端在上传文件到服务端的时候,服务端对客户端上传的文件的content_type类型进行检测,如果是白名单所允许的,则可以正常上传, 否则上失败。

3 、服务器端检测文件扩展名

  当客户端将文件提交到服务端的时候, 服务端会根据自己设定的黑白名单对客户端提交上来的文件扩展名进行判断, 如果上传的文件扩展名是黑名单里面所限制的,则不予上传, 否则正常上传。

  strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置, 并返回从该位置到字符串结尾的所有字符。

4 、服务器端文件内容检测

  服务器端文件扩展名检测,主要利用黑名单或白名单机制的不足或者利用解析洞,00 截断实现上传。

    - 黑名单: 只要未在黑名单重定义的, 均可以上传。例如特殊的可执行文件.asa .cer 等可以在iiis 执行

    - 白名单: 相对黑名单安全

5 、00 截断的应用

  正常传递符合检测的图片文件

  通过burp拦截请求,在hex中更改字符为00

6、getimagesize() 读取文件的格式

  一般文件内容的检测使用getimagesize() 函数检测, 会判断文件是否是一个有效的图片文件, 如果是, 则允许上传, 否则的话, 不允许上传。

 

2.2 绕过方法:

  • 将webshell扩展名更改为允许类型,如.jpg
  • 利用burp拦截请求,拦截请求后修改文件名为.php文件
  • 将一句话代码嵌入到图片中, 构造图片马, 上传图片
  • 通过解析漏洞或其他方法还原gif 为可执行文件

 

以上是关于php 文件上传的主要内容,如果未能解决你的问题,请参考以下文章

php文件上传,提示移动文件失败

PHP文件上传代码用法

php上传文件(上传后显示图片)

php如何实现文件上传啊

php 上传大文件 插件 都有哪些

求php怎么实现web端上传超大文件