php文件上传开发安全

本文探讨了PHP文件上传的安全问题,包括表单提交的两种方式、服务器接收数据的三种方式,重点在于PHP文件上传的安全配置和优化措施。提到了更改文件名以避免冲突,验证文件格式以防止伪装,并推荐使用fileinfo扩展来增强安全性。同时概述了优化文件上传的五个关键步骤。
摘要由CSDN通过智能技术生成

一、 表单提交数据的两种方式

1.0 两种方式
<form method="post" action=""></form>
<form method="get" action=""></form>
1.1区别

1、外观上看

get提交在地址上可以看到参数post提交在地址上看不到参数

2、安全性 get不安全post安全

3、提交原理

get提交是参数一个一个的提交 post提交是所有参数作为一个整体一起提交

4、提交数据大小

get提交一般不超过255个字节 post提交的大小取决于服务器

// 在php.ini中,可以配置post提交的大小
post_max_size = 4M

5、灵活性

get很灵活,只要有页面的跳转就可以传递参数  post不灵活,post提交需要有表单的参与

小结:

GET

POST

外观上

在地址上看到传递的参数和值

地址栏上看不到数据

提交数据大小

提交少量数据,不同的浏览器最大值不一样,IE是255个字符

提交大量数据,可以通过更改php.ini配置文件来设置post提交数据的最大值

安全性

提交原理

提交的数据和数据之间在独立的

将提交的数据变成XML格式提交

灵活性

很灵活,只要有页面的跳转就可以get传递数据

不灵活

二、服务器接受数据的三种方式

通过名字获取名字对应的值

$_POST:数组类型,保存的POST提交的值
$_GET:数组类型,保存的GET提交的值
$_REQUEST:数组类型,保存的GET和POST提交的值
$_POST:数组类型,保存的POST提交的值
$_GET:数组类型,保存的GET提交的值
$_REQUEST:数组类型,保存的GET和POST提交的值

在一个请求中,既有get又有post,get和post传递的名字是一样的,这时候通过$_REQUET获取的数据是什么?

结果取决于配置文件

 request_order = "GP"  # 先获取GET,在获取POST值request_order = "GP"  # 先获取GET,在获取POST值

三、php文件上传开发安全

3.0与文件上传有关的配置

post_max_size = 4M:表单允许的最大值

upload_max_filesize = 1M:允许上传的文件大小

upload_tmp_dir =c:\root\tmp:指定临时文件地址

file_uploads = On:是否允许文件上传

max_file_uploads = 100:允许同时上传100个文件

3.1优化文件上传

3.1.1 更改文件名

[1]:通过时间戳做文件名

[2]:通过uniqid()实现

3.1.2 验证文件格式

[1]:判断文件的扩展名

<body>
<?php
if(!empty($_POST)) {
	$allow=array('.jpg','.png','.gif');	//允许的扩展名
	$ext=strrchr($_FILES['face']['name'],'.');  //上传文件扩展名
	if(in_array($ext,$allow))
		echo '允许上传';
	else
		echo '文件不合法';
}
?>
<form method="post" action="" enctype='multipart/form-data'>
	<input type="file" name="face">
	<input type="submit" name="button" value="上传">
</form>
</body>

注意:比较扩展名不能防止文件伪装。

[2]:通过$_FIELS[]['type']类型(不能识别文件伪装)

<body>
<?php
if(!empty($_POST)) {
	$allow=array('image/jpeg','image/png','image/gif');	//允许的类别
	$mime=$_FILES['face']['type'];  //上传文件类型
	if(in_array($mime,$allow))
		echo '允许上传';
	else
		echo '文件不合法';
}
?>
<form method="post" action="" enctype='multipart/form-data'>
	<input type="file" name="face">
	<input type="submit" name="button" value="上传">
</form>
</body>

注意:比较$_FIELS[]['type']不能防止文件伪装。

[3]:php_fileinfo扩展(可以防止文件伪装)

在php.ini中开启fileinfo扩展

extension=php_fileinfo.dll

注意:开启fileinfo扩展以后,就可以使用finfo_*的函数了

<body>
<?php
if(!empty($_POST)) {
	//第一步:创建finfo资源
	$info=finfo_open(FILEINFO_MIME_TYPE);
	//var_dump($info);		//resource(2) of type (file_info) 
	//第二步:将finfo资源和文件做比较
	$mime=finfo_file($info,$_FILES['face']['tmp_name']);
	//第三步,比较是否合法
	$allow=array('image/jpeg','image/png','image/gif');	//允许的类别
	echo in_array($mime,$allow)?'合法':'不合法';
}
?>
<form method="post" action="" enctype='multipart/form-data'>
	<input type="file" name="face">
	<input type="submit" name="button" value="上传">
</form>
</body>

小结:验证文件格式有三种方法

1、可以验证扩展名(不可以防止文件伪装)

2、通过$_FILES[]['type']验证(不可以防止文件伪装)

3、通过file_info扩展(可以防止文件伪装)

四、优化文件上传步骤

第一步:验证是否有误

第二步:验证格式

第三步:验证大小

第四步:验证是否是http上传

第五步:上传实现

<body>
<?php
/**
*验证错误
*如果有错,就返回错误,如果没错,就返回null
*/
function check($file) {
	//1:验证是否有误
	if($file['error']!=0){
		switch($file['error']) {
			case 1:
				return '文件大小超过了php.ini中允许的最大值,最大值是:'.ini_get('upload_max_filesize');
			case 2:
				return '文件大小超过了表单允许的最大值';
			case 3:
				return '只有部分文件上传';
			case 4:
				return '没有文件上传';
			case 6:
				return '找不到临时文件';
			case 7:
				return '文件写入失败';
			default:
				return '未知错误';
		}
	}
	//2、验证格式
	$info=finfo_open(FILEINFO_MIME_TYPE);
	$mime=finfo_file($info,$file['tmp_name']);
	$allow=array('image/jpeg','image/png','image/gif');	//允许的类别
	if(!in_array($mime,$allow)){
		return '只能上传'.implode(',',$allow).'格式';
	}
	//3、验证大小
	$size=123456789;
	if($file['size']>$size){
		return '文件大小不能超过'.number_format($size/1024,1).'K';
	}
	//4、验证是否是http上传
	if(!is_uploaded_file($file['tmp_name']))
		return '文件不是HTTP POST上传的<br>';
	return null;  //没有错误
}
//表单提交
if(!empty($_POST)) {
	//上传文件过程中有错误就显示错误
	if($error=check($_FILES['face'])){
		echo $error;
	}else{
		//文件上传,上传的文件保存到当天的文件夹中
		$foldername=date('Y-m-d');		//文件夹名称
		$folderpath="./uploads/{$foldername}";	//文件夹路径
		if(!is_dir($folderpath))
			mkdir($folderpath);
		$filename=uniqid('',true).strrchr($_FILES['face']['name'],'.');	//文件名
		$filepath="$folderpath/$filename";	//文件路径
		if(move_uploaded_file($_FILES['face']['tmp_name'],$filepath))
			echo "上传成功,路径是:{$foldername}/{$filename}";
		else
			echo '上传失败<br>';
	}
}
?>
<form method="post" action="" enctype='multipart/form-data'>
	<input type="file" name="face">
	<input type="submit" name="button" value="上传">
</form>
</body>

1、将时间戳转换格式

echo date('Y-m-d H:i:s',123456),'<br>';		//将时间戳转成年-月-日 小时:分钟:秒
echo date('Y-m-d H:i:s'),'<br>';	//将当前的时间转成年-月-日 小时:分钟:秒

2、设置时区(php.ini)

date.timrzone =PRC:中华人民共和国--设置时区

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下山吃土豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值