搜索
首页后端开发php教程PHP安全-文件上传攻击

PHP安全-文件上传攻击

Feb 22, 2017 am 09:26 AM



文件上传攻击

  有时在除了标准的表单数据外,你还需要让用户进行文件上传。由于文件在表单中传送时与其它的表单数据不同,你必须指定一个特别的编码方式multipart/form-data:

CODE:

 

<form action="upload.php" method="POST"
enctype="multipart/form-data">

一个同时有普通表单数据和文件的表单是一个特殊的格式,而指定编码方式可以使浏览器能按该可格式的要求去处理。

  允许用户进行选择文件并上传的表单元素是很简单的:

CODE:

 

<input type="file" name="attachment" />

该元素在各种浏览器中的外观表现形式各有不同。传统上,界面上包括一个标准的文本框及一个浏览按钮,以使用户能直接手工录入文件的路径或通过浏览选择。在Safari浏览器中只有浏览按钮。幸运的是,它们的作用与行为是相同的。

  为了更好地演示文件上传机制,下面是一个允许用户上传附件的例子:

CODE:

 

<form action="upload.php" method="POST"
enctype="multipart/form-data">
  

Please choose a file to upload:


隐藏的表单变量MAX_FILE_SIZE告诉了浏览器最大允许上传的文件大小。与很多客户端限制相同,这一限制很容易被攻击者绕开,但它可以为合法用户提供向导。在服务器上进行该限制才是可靠的。

  PHP的配置变量中,upload_max_filesize控制最大允许上传的文件大小。同时post_max_size(POST表单的最大提交数据的大小)也能潜在地进行控制,因为文件是通过表单数据进行上传的。

  接收程序upload.php显示了超级全局数组$_FILES的内容:

CODE:

 

<?php
 
  header(&#39;Content-Type: text/plain&#39;);
  print_r($_FILES);
 
  ?>


为了理解上传的过程,我们使用一个名为author.txt的文件进行测试,下面是它的内容:

CODE:

 

  Chris Shiflett
  http://www.php.cn/


当你上传该文件到upload.php程序时,你可以在浏览器中看到类似下面的输出:

CODE:

 

 Array
  (
      [attachment] => Array
          (
              [name] => author.txt
              [type] => text/plain
              [tmp_name] => /tmp/phpShfltt
              [error] => 0
              [size] => 36
          )
 
  )


 虽然从上面可以看出PHP实际在超级全局数组$_FILES中提供的内容,但是它无法给出表单数据的原始信息。作为一个关注安全的开发者,需要识别输入以知道浏览器实际发送了什么,看一下下面的HTTP请求信息是很有必要的:

CODE:

 

POST /upload.php HTTP/1.1
  Host: example.org
  Content-Type: multipart/form-data;
boundary=----------12345
  Content-Length: 245
 
  ----------12345
  Content-Disposition: form-data; name="attachment";
filename="author.txt"
  Content-Type: text/plain
 
  Chris Shiflett
  http://www.php.cn/
 
  ----------12345
  Content-Disposition: form-data;
name="MAX_FILE_SIZE"
 
  1024
  ----------12345--


虽然你没有必要理解请求的格式,但是你要能识别出文件及相关的元数据。用户只提供了名称与类型,因此tmp_name,error及size都是PHP所提供的。

  由于PHP在文件系统的临时文件区保存上传的文件(本例中是/tmp/phpShfltt),所以通常进行的操作是把它移到其它地方进行保存及读取到内存。如果你不对tmp_name作检查以确保它是一个上传的文件(而不是/etc/passwd之类的东西),存在一个理论上的风险。之所以叫理论上的风险,是因为没有一种已知的攻击手段允许攻击者去修改tmp_name的值。但是,没有攻击手段并不意味着你不需要做一些简单的安全措施。新的攻击手段每天在出现,而简单的一个步骤能保护你的系统。

  PHP提供了两个方便的函数以减轻这些理论上的风险:is_uploaded_file( ) and move_uploaded_file( )。如果你需要确保tmp_name中的文件是一个上传的文件,你可以用is_uploaded_file( ):

CODE:

 

 <?php
 
  $filename = $_FILES[&#39;attachment&#39;][&#39;tmp_name&#39;];
 
  if (is_uploaded_file($filename))
  {
    /* $_FILES[&#39;attachment&#39;][&#39;tmp_name&#39;] is an
uploaded file. */
  }
 
  ?>


如果你希望只把上传的文件移到一个固定位置,你可以使用move_uploaded_file( ):

CODE:

 

 <?php
 
  $old_filename =
$_FILES[&#39;attachment&#39;][&#39;tmp_name&#39;];
  $new_filename = &#39;/path/to/attachment.txt&#39;;
 
  if (move_uploaded_file($old_filename,
$new_filename))
  {
    /* $old_filename is an uploaded file, and the
move was successful. */
  }
 
  ?>


最后你可以用 filesize( ) 来校验文件的大小:

CODE:

 

 <?php
 
  $filename = $_FILES[&#39;attachment&#39;][&#39;tmp_name&#39;];
 
  if (is_uploaded_file($filename))
  {
    $size = filesize($filename);
  }
 
  ?>


这些安全措施的目的是加上一层额外的安全保护层。最佳的方法是永远尽可能少地去信任。 

以上就是PHP安全-文件上传攻击的内容,更多相关内容请关注PHP中文网(www.php.cn)!


声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP和Python:解释了不同的范例PHP和Python:解释了不同的范例Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:深入了解他们的历史PHP和Python:深入了解他们的历史Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

在PHP和Python之间进行选择:指南在PHP和Python之间进行选择:指南Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP和框架:现代化语言PHP和框架:现代化语言Apr 18, 2025 am 12:14 AM

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHP的影响:网络开发及以后PHP的影响:网络开发及以后Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?PHP如何处理对象克隆(克隆关键字)和__clone魔法方法?Apr 17, 2025 am 12:24 AM

PHP中使用clone关键字创建对象副本,并通过\_\_clone魔法方法定制克隆行为。1.使用clone关键字进行浅拷贝,克隆对象的属性但不克隆对象属性内的对象。2.通过\_\_clone方法可以深拷贝嵌套对象,避免浅拷贝问题。3.注意避免克隆中的循环引用和性能问题,优化克隆操作以提高效率。

PHP与Python:用例和应用程序PHP与Python:用例和应用程序Apr 17, 2025 am 12:23 AM

PHP适用于Web开发和内容管理系统,Python适合数据科学、机器学习和自动化脚本。1.PHP在构建快速、可扩展的网站和应用程序方面表现出色,常用于WordPress等CMS。2.Python在数据科学和机器学习领域表现卓越,拥有丰富的库如NumPy和TensorFlow。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用