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多文件上传,项目上文件上传是比不可少的,大家 ...
随机推荐
- Shell数组:shell数组的定义、数组长度
Shell在编程方面比Windows批处理强大很多,无论是在循环.运算. bash支持一维数组(不支持多维数组),并且没有限定数组的大小.类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利 ...
- jmeter控制器
1.仅一次控制器 这个控制器可以保证线程在多次循环跑得情况下只登陆一次 2.循环控制器(Loop Controller:设置循环次数 结果: 3. ForEach控制器(ForEach Contro ...
- EL表达式及其定义和使用 转
作者:http://blog.csdn.net/goskalrie/article/details/51315397 简介 EL(Expression Language)表达式语言实在JSP2.0版本 ...
- Java NIO使用及原理分析(二)
在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如 ...
- OGG-01224 Bad file number
今天在看OGG的日志时.发现例如以下OGG-01224 Bad file number错误.查阅资料才知道port不可用,看了一下mgr的參数,发现是设置的DYNAMICPORTLIST 动态port ...
- [WebGL入门]十四,绘制多边形
注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...
- HDU2024JAVA
C语言合法标识符 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- js中跨域请求原理及2种常见解决方案
一.同源策略: 说到跨域请求,首先得说说同源策略: 1995年,同源政策是由 Netscape 公司引入浏览器的.目前,所有浏览器都实行了这个政策. 同源策略是浏览器的一种安全策略,所谓同源是指,域名 ...
- Amazon S3 上传文件 SSL23_GET_SERVER_HELLO握手错误
题外话:今天偶尔来逛逛,发现我真是懒到家了.居然有半年前的留言我都没有来看过,真对不起留言的同学,希望他的问题已经解决了. 这两三天一直被亚马逊S3上传文件的问题困扰着,直到昨天晚上终于搞定了,工作群 ...