### 客户端检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <html> <head> <meta charset="UTF-8"> <title>图片上传</title> <script type = "text/javascript"> function checkFile(){ var flag = false; var str = document.getElementById("file").value; str = str.substring(str.lastIndexOf('.') + 1); var arr = new Array('png','jpg','gif','bmp'); for(var i = 0; i < arr.length; i++){ if(str == arr[i]){ flag = true; } } if (!flag) { alert('文件不合法!!'); } else{ alert('文件上传成功'); } return flag; } </script> </head> <body> <form action = "upload.php" method = "post" onsubmit="return checkFile()" enctype = "multipart/form-data"> <input type = "file" name = "file" id = "file" />
<input type = "submit" value = "提交" name = "submit" /> </form> </body> </html>
|
客户端验证代码如上所示,在测试的过程中,需要注意的问题是,在
表单事件onsubmit中,需要写上
return,此时当在JS代码中验证文件后缀名失败以后,可以阻止表单继续上传,否则无论JS代码如何验证,文件都会成功上传到服务器。
*
### 服务器端接收
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <? if(isset($_POST["submit"])){ $name = $_FILES['file']['name']; $name = md5(date('Y-m-d h:m:s')).strstr($name, "."); $size = $_FILES['file']['size']; if ($size == 0) {
echo "文件不能为空"."\n"; }else{ $tmp = $_FILES['file']['tmp_name']; copy($tmp,$name); echo "文件上传成功 path :".$name." "; echo "文件上传路径为:".$tmp.""; } } ?>; `
|
服务器端的接收代码如上所示
这里补充一下有关于PHP中
$_FILES数组的使用方法
> $_FILES[‘file’][‘name’] 客户端文件名称
>
> $_FILES[‘file’][‘type’] 文件的MIME类型
>
> $_FILES[‘file’][‘size’] 文件大小 单位字节
>
> $_FILES[‘file’][‘tmp_name’] 文件被上传后再服务器端临时文件名,可以在php.ini中指定
需要注意的是在文件上传结束后,默认的被储存在临时文件夹中,这时必须把他从临时目录中删除或移动到其他地方,否则,脚本运行完毕后,自动删除临时文件,可以使用
copy或者
move_uploaded_file两个函数
### 前端验证绕过方法
#### 方法一
使用firebug等开发者工具,修改HTML代码,将表单中的onsubmit事件删除,从而绕过JS的验证过程
#### 方法二 中间人攻击
使用Burp等抓包工具,先将木马文件扩展名更改为一张正常图片的扩展名,在上传时,使用工具进行抓包,更改扩展名为PHP,就可以绕过前端的验证。
> 再修改了扩展名后,可能导致文件的正文长度减少了,此时应该将数据包中的字段Content_Length长度改正,否则上传可能会失败。