PHP文件上传与安全
文件上传的流程
上传必须由POST方式的file类型表单提交,被提交的地方 一定是一个php程序,用户在表单使用file类型的域。选在一个自己电脑上的文件,提交到php程序以后 其实就已经完成了一个上传过程,即使这个php代码什么都不写上传依然有效,所谓上传指的是从用户计算机发送一个文件到网站 严格来说是发送到服务器,而且是装有支持上传的解释器的服务器,才支持使用表单上传,我们的php解释器就是其中之一 既然如此 文件的上传到哪儿呢 这个是由php配置决定的,默认情况下 php允许每次上传的2M大小的文件会上传到系统的临时文件夹中,上传的位置和上传的大小配置 我们可以在php.in配置文件找到分别是upload_max_filesize upload_tmp_dir 这两项分别决定了每次上传的最大文件和上传位置,默认情况下上传的路径不需要设置 他会上传到系统的临时文件夹里 win系统在c:\windows\temp 如果我们指定了位置 他就会上传到指定的位置,之前提到上传必须由POST方式的file类型表单提交 ,HTML 代码是这样的
<form enctype="multipart/form-data" method="post" action="upload.php">
<input type="file" name="upload" />
<input type="submit" value="上传" />
</form>
method一定是post 另外 光这样是不够的 还要指定编码enctype 告诉服务器 这次提交由文件需要上传。enctype="multipart/form-data" 如果制作文件上传表单上面一定要加上这个,php才知道 此次提交含有文件上传 只要表单写成这样指定的action的php程序存在 这次提交 就一定会产生一个上传的过程。上传文件的表单 必须是file类型
UPLOAD_ERR_OK
其值为 0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE
其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE
其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL
其值为 3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE
其值为 4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR
其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。
UPLOAD_ERR_CANT_WRITE
其值为 7,文件写入失败。PHP 5.1.0 引进。
错误5现在已经被抛弃 如果我们要判断文件是否成功上传 可以去error的值来判断 因为是二维数组 我们需要这么写$_FILES['upload']['error']
tmp_name 是已经上传的文件当前的位置和文件名 我们需要制定一个新的位置 要完整的包含文件名的 如果我们需要保持用户上传的文件名我们可以我们可以通过 $_FILES['upload']['name'] 得到。要上传的路径就是我们自定义的了
<?PHP if($_FILES['upload']['error'] == 0) {
//当前目录下
$path = "./" . $_FILES['upload']['name']; //把上传的文件复制到当前目录
copy($_FILES['upload']['tmp_name'], $path);
}
上传最基本的两个过程。。
第一个过程,就是用户使用带有 file 和声明了数据的表单,选择一个文件,并提交给 PHP ,这个过程我们干预不了。
第二个过程,我们把上传好的文件,复制到我们想保存的地方。
上传文件。
会员系统需要上传头像
相册功能上传照片
文档要允许上传各种文档类文件不如做成 允许上传什么类型的文件 代码写的更简单一些
文档也就是:doc,docx,xls,xlsx,ppt,pdf
<img src="图片路径" />
<a href="文件路径">下载</a>
PHP 代码
$id = (int)$_GET['id'];
$sql = "select * from 表名 where id = '$id'";
通常是这样子
$key = $_GET['key'];
$sql = "select * from 表名 where id = '$key'";
或者身份验证时。
$sql = "select * from 表名 where user = '$user'";
如果有人在这个时候,恶意提交一个单引号上来会是什么结果。假设,我提交是:test' or 1='1
select * from 表名 where user = 'test' or 1='1'
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
这个函数,可以用来读取 PHP 配置中的自动引号转义功能是否开启。
test.php?a=123;
echo $a; //123
if(empty($_SESSION['username']))die("没有登录");
if(empty($username)) die("没有登录");
test.php?username=1 ;GET 变量也会被注册成普通变量。于是,这里的身份验证通过了。。。
?sql=select……
直接影响我们的
mysql_query($sql);
foreach($_GET as $k=>$v) {
if(isset($$k) and $$k == $v) unset($$k);
}
取索引,组成一个变量名。如果这个变量事先存在,并且值和当前 GET 值相同。就灭了它。。
代码一开始就写上这个代码。。这个时候前面跟本没有任何的代码。又何来的 $a ,如果偏偏它这个时候存在了。。那就一定不是我们定义的。。灭了它。
比如有一种写法是这样的。
index.php
<?php
$file = $_GET['file'];
include $file . ".php";
?>这样的写法,有个好处。就可以在一个程序里,运行几个不同的程序。 index.php?file=news对于 PHP 来说就是include "news.php"; 直接使用来自外部的变量,后果就是这样index.php?file=http://我的网址/hack 结果对于我们的代码就变成了include "http://我的网址/hack.php";
最后总结一下:
文件上传,一定是 POST 表单,要声明是数据上传。一定是 file 选择文件。
文件会上传到服务器的临时文件夹,文件夹必须可以访问。
我们需要把上传的文件复制出来。不然它马上会消失。
复制上传过来的文件,应当使用 move_uploaded_file 函数,以确保安全。
PHP文件上传与安全的更多相关文章
- jquery.uploadify文件上传组件
1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- Java FtpClient 实现文件上传服务
一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...
- 小兔Java教程 - 三分钟学会Java文件上传
今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...
- ,net core mvc 文件上传
工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...
- Web开发安全之文件上传安全
很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...
- AutoIt实现Webdriver自动化测试文件上传
在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- .JavaWeb文件上传和FileUpload组件使用
.JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]
系列目录 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家 ...
随机推荐
- c#+ArcEngine中的IGroupLayer的用法
转自羊子雄起原文c#+ArcEngine中的IGroupLayer的用法 在AE开发中,我们知道axMapControl.LayerCount能获取图层的数量,但是这种方法不能获取到图层组里面的图层, ...
- uva-10487 - Closest Sums
暴力枚举后去重最后二分加推断找答案 #include<iostream> #include<map> #include<string> #include<cs ...
- swift Array 数组
// // main.Swift // swift数组 // // Created by zhangbiao on 14-6-15. // Copyright (c) 2014年 理想. Al ...
- binary heap
In computer science, a heap is a specialized tree-based data structure that satisfies the heap prope ...
- iOS网络层架构设计分享
前言 前些天帮公司做了网络层的重构,当时就想做好了就分享给大家,后来接着做了新版本的需求,现在才有时间整理一下. 之前的网络层使用的是直接拖拽导入项目的方式导入了AF,然后还修改了大量的源码,时隔2年 ...
- 使用API在DigitalOcean上创建VPS
1.生成Personal Access Token(API-Token) 密钥类似如下格式: 81d58e36224b63fc2gedac14342d0cfb16vf5451c798b2a38f976 ...
- C#将DataTable导出Execl、Word、Xml
/// <summary> /// 将DT转换为Execl的方法 /// </summary> /// <param name=" ...
- Java根据ip地址获取Mac地址,Java获取Mac地址
Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...
- 删除mysql重复记录的办法
网上有很多的办法,但是大多数都是通过临时表的办法,其实你是可以用一句简单的sql就可以做到: alter ignore table SOMETABLE add primary key(fields n ...
- 爆牙齿的 Web 标准面试题 【转藏】
<!DOCTYPE html> <html lang="zh-CN"><head> <meta http-equiv="cont ...