php上传文件很慢的原因_PHP编码安全:上传文件安全

一次性付费进群,长期免费索取教程,没有付费教程。

进微信群回复公众号:微信群;QQ群:460500587

 教程列表 见微信公众号底部菜单 |  本文底部有推荐书籍 

38321bfaa4a222248e1f3728097a8623.png

微信公众号:计算机与网络安全

ID:Computer-network

在Web系统中,允许用户上传文件作为一个基本功能是必不可少的,如论坛允许用户上传附件,多媒体网站允许用户上传图片,视频网站允许上传头像、视频等。但如果不能正确地认识到上传带来的风险,不加防范,会给整个系统带来毁灭性的灾难。

在PHP项目中,提供上传功能并在服务器端未对上传的文件格式进行合理的校验是存在巨大风险的。如果恶意攻击者利用上传漏洞上传一些webshell,则可能完全控制整个网站程序,执行系统命令,获取数据库链接字串进行操作数据库等危险操作。

1、文件上传漏洞

以下是一个不安全的上传代码示例,即文件上传PHP接收代码upload.php。

$upload_dir='uploads'; // 用户上传文件保存目录

$upload_file=$upload_dir.basename($_FILES['userfile']['name']);

if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

echo "恭喜您,文件上传成功";

} else {

echo "文件上传失败";

}

?>

以下是文件上传HTML代码upload.html。

请选择上传文件:

这是一个简单的上传文件功能,其中由用户上传文件,如果上传成功,保存文件的路径为http://服务器路径/uploads/文件名称。

如果攻击者上传一个如下内容的hacker.php脚本文件到服务器:

system($_GET['shell']);

?>

则攻击者就可以通过该文件进行URL请求http://服务器路径/uploads/hacker.php?shell=ls%20-al,从而可以执行任何shell命令。

图1所示是恶意脚本的执行结果,其中列出了该目录下的所有文件。

e0edb65e779b95ce76a54e50a8b554c3.png

图1  上传漏洞造成的webshell执行结果

2、检查文件类型防止上传漏洞

上面例子中的代码非常简单,并没有进行任何的上传限制。如果要限制,通常的做法是限制文件上传类型。

下面在PHP代码中增加了文件类型限制来防止上传漏洞。

if($_FILES['userfile']['type']!="image/gif") {

die("请上传正确的文件类型");

}

$uploaddir='uploads';

$uploadfile=$uploaddir.basename($_FILES['userfile']['name']);

if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

echo "恭喜您,文件上传成功";

} else {

echo "文件上传失败";

}

?>

在这种情况下,如果攻击者试图上传shell.php,则应用程序在上传请求中将检查文件MIME类型。以下是拒绝上传的HTTP请求返回数据包。

POST /upload.php HTTP/1.1

TE: deflate,gzip;q=0.3

Connection: TE,close

Host: localhost:8080

User-Agent: Mozilla/5.0(Macintosh: Inter Mac OS X10_13_2)

AppleWebKit/537.36(KHTML,like gecko) Chrome/65.0.3325.181

Safari/537.36

Content-Type: multipart/form-data;boundary=xYzzY

Content-Length:32

--s76f8a7sf8as9f8a9f80as8df--

Content-Disposition: form-data;name="userfile";filename="shell.php"

Content-Type: text/plain

system($_GET['shell']);

?>

--s76f8a7sf8as9f8a9f80as8df--

HTTP/1.1 200 OK

Date: Thu, 31 May 2019 22:00:01 GMT

Server: Apache

X-Powered-By: PHP/5.6

Content-Length: 30

Connection: close

Content-Type: text/html

请上传正确的文件类型

这里成功地通过检测类型防止了非授权类型文件的上传,服务器拒绝接收文件。

但是如果只进行上传文件类型的检查也是不够的,攻击者通过修改POST数据包中Content-Type:text/plain字段为Content-Type:image/gif,然后发送数据包,即可成功实现恶意脚本的上传。

3、检查文件扩展名称防止上传漏洞

除了检查文件类型外,研发人员最常用的防范方法之一,就是基于白名单或者黑名单,验证所传文件的扩展名称是否符合。以下代码通过黑名单方式对文件类型进行限制。

$blacklist=array(".php","phtml",".php3",".php4"); // 黑名单

$uploaddir='uploads/';

$uploadfile=$uploaddir.basename($_FILES['userfile']['name']);

$item==substr($_FILES['userfile']['name'],-4);

if(in_array($item,$whitelist)) {

die("请上传正确的文件类型");

}

if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

echo "恭喜您,文件上传成功";

} else {

echo "上传失败";

}

?>

以下是白名单模式限制文件类型的代码示例。

$whitelist=array(".jpg",".gif","png"); //白名单

$uploaddir='uploads/';

$uploadfile=$uploaddir.basename($_FILES['userfile']['name']);

$item==substr($_FILES['userfile']['name'],-4);

if(!in_array($item,$whitelist)) {

die("请上传正确的文件类型");

}

if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

echo "恭喜您,文件上传成功";

} else {

echo "上传文件失败";

}

?>

从黑名单和白名单两种不同的验证方法来看,白名单方式绝对要比黑名单安全得多。但是,并不是说采用白名单方式验证就足够安全了。

IIS服务存在一个漏洞(Microsoft Internet Infomation Server 6.0 ISAPI Filename Analytic Vulnerability),如上传一个名为hacker.php;.gif的文件到服务器,PHP脚本文件因限制最后4个字符,所以本文件是合法的,但是当上传后浏览该文件——http://服务器路径/uploads/hacker.php;.gif时,就可以绕过Web程序的逻辑检查,从而能导致服务器以IIS进程权限执行任意恶意用户定义的脚本。此漏洞只针对于IIS特定版本。

在Apache程序中,同样存在一个由扩展名解析的漏洞。当恶意攻击上传一个有多个扩展名的PHP脚本文件时,如果最后的扩展名未定义,就会解析前一个扩展,比如hacker.php.2018文件。当将该文件上传时,如果是以白名单、黑名单方式进行验证,就可以绕过验证,上传非法文件到服务器,当浏览http://服务器路径/uploads/hacker.php.2018时,就会被当成PHP脚本执行。

4、文件上传漏洞的综合防护

以上例子说明,不可以只通过一种安全手段来阻止攻击者进行非法文件上传,应该同时综合应用检测文件类型、检查文件后缀、黑白名单、使用随机文件名称等多种方法进行防范。下面的代码是综合应用示例。

/**

* 生成随机字符串

* @param int $len

* $return string

*/

function genRandomString($len) {

$chars=array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9");

$charsLen=count($chars)-1;

shuffle($chars); // 将精妙绝伦打乱

$output="";

for($i=0;$i<=$len;$i++) {

$output.=$chars[mt_rand(0,$charsLen)];

}

return $output;

}

$whitelist=array(".jpg",".gif","png"); //白名单

$item==substr($_FILES['userfile']['name'],-4);

if(!in_array($item,$whitelist)) {

die("请上传正确的文件类型");

}

if($_FILES['userfile']['type']!="image/gif") { // 校验文件MIME类型

die("请上传正确的文件类型");

}

$uploaddir='/tmp/uploads'; // 将用户上传的文件放到项目目录之外

$uploadfile=$uploaddir.genRandomString(20).$item; // 使用随机文件名

if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)) {

echo "恭喜您,文件上传成功";

} else {

echo "上传文件失败";

}

?>

验证上传文件的扩展名,以白名单、黑名单方式为主,但最好使用白名单。

除了在代码逻辑中防止上传漏洞外,同时也可以在项目部署时将上传目录放到项目工程目录之外,当作静态资源文件处理,并且对文件的权限进行设定,禁止文件的执行权限。

当用户上传文件到服务器保存时,一定要使用随机文件名进行存储,并保证所存储的扩展名合法。保证文件名的唯一性,也保证了存储的安全性,可以防止上传文件非法扩展进行解析。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 入门:2. Exchange 和 Queue

上文RabbitMQ 入门&#xff1a;1. Message Broker&#xff08;消息代理&#xff09;提到过 RabbitMQ 实现了 AMQP 这个协议&#xff08;RabbitMQ 所支持的 AMQP 的版本是 0.9.1&#xff09;&#xff0c;这个协议的内容很多&#xff0c;但为了构建入门级的分布式应用&#xff0c…

【组图】地震前线归来--心中的震撼

5.12号获悉家乡发生大地震&#xff0c;不放心在成都的家人朋友&#xff0c;于13日从北京赶回成都&#xff0c;再了解事态严重性&#xff0c;并确定家人情况后&#xff0c;14日与众多志愿者一起从成都出发&#xff0c;取道彭州市&#xff0c;通济镇&#xff0c;白水河镇&#xf…

前端 input怎么显示null_小猿圈WEB前端之HTML5+CSS3面试题(一)

学习是一件非常充实的过程&#xff0c;特别是把自己的乐趣变成工作的时候&#xff0c;很多朋友就喜欢学习web前端&#xff0c;所以学习前端&#xff0c;也希望从事前端的工作&#xff0c;但是因为缺少实战经验&#xff0c;所以很多都是卡在面试这关上&#xff0c;下面小猿圈总结…

聊聊Interlocked.CompareExchange吧?

【导读】私下空余时间一直在研究开源框架&#xff0c;当然也就少不了学习优秀源码&#xff0c;本文也是我查看有关源码时&#xff0c;触碰到我个人知识盲区&#xff0c;做此记录&#xff0c;分享下Interlocked.CompareExchange这玩意用法被讲的很烂了&#xff0c;为何再次被提及…

winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...

本文将简单总结下一些处理海量数据问题的常见方法。当然这些方法可能并不能完全覆盖所有的问题&#xff0c;但是这样的一些方法也基本可以处理绝大多数遇到的问题。下面的一些问题基本直接来源于公司的面试笔试题目&#xff0c;方法不一定最优&#xff0c;如果你有更好的处理方…

java 堆栈_Java中线程与堆栈的关系

栈是线程私有的&#xff0c;每个线程都是自己的栈&#xff0c;每个线程中的每个方法在执行的同时会创建一个栈帧用于存局部变量表、操作数栈、动态链接、方法返回地址等信息。每一个方法从调用到执行完毕的过程&#xff0c;就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。其…

java怎么将前端的数据存到关联的表中_Java程序员最可能被考到的14个面试题

1. 如何只扫描一遍就找到位于一个链表正中间的元素&#xff1f; 这是最受欢迎的算法题之一&#xff0c;经常在电话面试中被问到。很多程序员会想&#xff0c;要知道链表的长度&#xff0c;就要先扫描一遍链表&#xff0c;然后在第二遍中取其正中的元素。所以被要求只扫描一遍就…

常见的几种最优化方法

阅读目录1. 梯度下降法&#xff08;Gradient Descent&#xff09;2. 牛顿法和拟牛顿法&#xff08;Newtons method & Quasi-Newton Methods&#xff09;3. 共轭梯度法&#xff08;Conjugate Gradient&#xff09;4. 启发式优化方法我们每个人都会在我们的生活或者工作中遇到…

专业的软件安装包可以这样做!

C/S客户端开发完成&#xff0c;需要将程序交付给用户&#xff0c;直接压缩发给用户是可以的&#xff08;只是有点不专业&#xff09;&#xff0c;如果能有一个比较好看的安装界面&#xff0c;那档次就不一样了。本文介绍怎么使用Adanced Installer 17.9 制作专业的Windows 客户…

IT人喝酒,不同岗位不同姿势

这是Boss们的常用套路&#xff0c;频频举杯&#xff0c;给大家鼓劲加油&#xff0c;但是自己不喝。有的销售&#xff0c;业绩好&#xff0c;酒品也好&#xff0c;不管和自己人喝酒&#xff0c;还是和客户喝酒&#xff0c;都是一副舍我其谁的霸气&#xff01;这是某些销售的写照…

国产CPU群雄逐鹿谁主沉浮

当下&#xff0c;国内&#xff08;桌面、服务器&#xff09;CPU与外商有较大差距&#xff0c;除了海光在性能上可能具有一拼之力外&#xff0c;其它国产CPU在商业市场上面对英特尔、AMD基本不具备竞争力&#xff0c;因而只能在篱笆墙内的市场角逐。而为了能够进入篱笆墙内的市场…

蒙特卡罗方法入门

本文通过五个例子&#xff0c;介绍蒙特卡罗方法&#xff08;Monte Carlo Method&#xff09;。一、概述蒙特卡罗方法是一种计算方法。原理是通过大量随机样本&#xff0c;去了解一个系统&#xff0c;进而得到所要计算的值。它非常强大和灵活&#xff0c;又相当简单易懂&#xf…

面向业务的微服务消息总线

源宝导读&#xff1a;移动PaaS项目的异步场景中&#xff0c;随着订阅主题数的增加&#xff0c;会出现开发维护成本高、管理难度大等问题&#xff0c;本文将分享如何通过构建面向业务的微服务消息总线应对这些问题。一、背景面向业务的消息总线本质上是对消息队列进行二次封装&a…

模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序_操作系统基础6-支持操作系统的最基本的硬件-中断...

无论是桌面PC操作系统还是嵌入式都是多任务的操作系统&#xff0c;而很遗憾&#xff0c;处理器往往是单个的&#xff0c;即便在硬件成本逐渐下降&#xff0c;而硬件配置直线上升的今天&#xff0c;PC机的核心可能已经达到&#xff14;核心&#xff0c;&#xff18;核心&#xf…

XMLhttp学习应用

Client.htm页面代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><head><title>客…

机器学习没有想象中的那么难

文末彩蛋&#xff0c;不容错过&#xff01;背景从去年的AlphaGo到今年人工智能首次写进政府工作报告&#xff0c;人工智能正在席卷全球&#xff0c;引发第4次工业革命&#xff0c;而AI的核心技术是机器学习和深度学习。目前&#xff0c;机器学习已广泛应用于数据挖掘、计算机视…

Docker查看应用的实际内存

前言 我们把应用部署到Docker里面之后&#xff0c;有什么办法查看这个应用占用了多少内存呢&#xff1f;docker本身提供了一个命令让我们可以直接看到当前时间所有容易占用的情况。docker stats --no-stream从上面来看&#xff0c;这几个应用用的内存加起来已经是将近12G了。但…

如何动态的生成某种类型的集合呢_知乎画报」的移动端动态化工程实践

本文基于移动端动态化方案在知乎原生推广落地页「知乎画报」上的实践经验&#xff0c;对该方案技术升级过程中的思考以及技术关键细节做了详尽的解读。商业化是互联网公司发展的重要阶段&#xff0c;App 端的商业广告业务对移动端动态化能力的需求很强烈&#xff0c;一方面需要…

任正非致歉华为前程序员:回来吧,公司错了

近几日&#xff0c;因着任正非连续签发邮件&#xff0c;无处不在热议华为&#xff0c;其中与所有的技术人可谓密切相关。除了一员工因说真话&#xff0c;被晋升两级&#xff0c;根据其自愿选择工作岗位及地点&#xff0c;并由无线网络产品线总裁邓泰华保护其不受打击报复之外&a…

Asp.Net Core之Identity应用(下篇)

一、前言在上篇中简单介绍了 Asp.Net Core 自带的 Identity,一个负责对用户的身份进行认证的框架&#xff0c;当我们按需选择这个框架作为管理和存储我们应用中的用户账号数据的时候&#xff0c;就会添加到自己的项目当中去。这个时候&#xff0c;默认情况我们会使用自带的数据…