当前位置:  编程技术>php

PHP临时文件的安全性分析

    来源: 互联网  发布时间:2014-08-26

    本文导语:  一、简介   临时文件,顾名思义是临时产生的文件,且文件的生命周期很短。   然而,很多应用的运行都离不开临时文件,临时文件在我们电脑上无处不在,主要有以下几种形式的临时文件: 1.文件或图形编辑程序,所...

一、简介
  临时文件,顾名思义是临时产生的文件,且文件的生命周期很短。

  然而,很多应用的运行都离不开临时文件,临时文件在我们电脑上无处不在,主要有以下几种形式的临时文件:

1.文件或图形编辑程序,所生成的中间文件
2.数据库查询时,生成的临时缓存文件,提供之前的结果数据而,以减少再次访问数据库的代价;通常用于远程数据库或远程xml的服务
3.文件被上传后在服务端的临时储存,其文件名为php的全局变量$_FILES['userfile']['tmp_name']的值
4.在http请求中,用于存放session的临时文件,这些文件名通常就是sessionid(如 sess_7483ae44d51fe21353afb671d13f7199)
5.在不同应用或相同应用传递数据,而对方要求基于文件的输入,此时用临时文件存放数据

二、临时文件的安全特征

  临时文件的最大特征就是它的非持久性,除此之外,从安全性的角度,可以从以下几个方面关注临时文件的其它特点或风险:

1.临时文件的位置

  临时文件通常被创建并存放在默认的路径,在一个典型的Linux系统中,至少有两个目录或分区保持着临时文件。其中之一是/tmp目录,再者是/var/tmp。在更新的Linux内核的系统中,还可能有/dev/shm,它是用tmpfs文件系统装载的。有时临时文件,也可能放在用户home目录下的隐藏子目录中。使用默认临时文件目录的好处在于,系统进程可以方便查找和读写。

  然而,默认临时文件的存放目录可能成为损害系统安全的僵尸和rootkit的温床。这是因为在多数情况下,任何人(或任何进程)都可以向这些目录写入东西,有不安全的许可问题。比如我们都知道sticky bit,该位可以理解为防删除位。如果希望用户能够添加文件但同时不能删除文件, 则可以对文件使用sticky bit位。设置该位后,就算用户对目录具有写权限,也不能删除该文件。多数Linux发行版本在临时目录上设置sticky位,这意味着用户A不能清除属于用户B的一个文件,反之亦然。但是,根据文件自身的许可,用户A有可能查看并修改那个文件的内容。

2.临时文件的持久性

  前面提到临时文件是非持久的,在程序结束时,会被删除,但有的时候临时文件也会被迫持久保存了,没有被删除,如:

2.1 应用程序在关闭前崩溃了,还没有机会删除临时文件
2.2 应用程序还跑着,但操作系统崩溃了
2.3 文件复制过程中由于空间问题而复制失败,导致中间文件没有删除
2.4 操作系统进程通常会定期清空的默认临时文件目录,但可能因为某些原因,而删除失败
2.5 写得不好的应用程序,可能忽略或者忘记了删除临时文件

3.临时文件的风险性

  无用的临时文件像幽灵一样存在你的服务器上,一方面占用硬盘,另一方面,可以被其它人非法使用,存着如下一些风险:

3.1 可见性

  众所周知,将私有数据公开很有风险。一旦用户通过某些手段(如shell或者ftp)窃取了你的临时文件,就可以获取到用户或企业的私有数据,从而对你造成影响。

  例如:临时文件2011_Confidential_Sales_Strategies.tmp,可能暴露你们公司2011年的商业策略,这对你的竞争对手来说,将很有用处;而对于session劫持者来说,存放用户session信息的临时文件sess_95971078f4822605e7a18c612054f658非常关键。

  除此之外,还有别的情况临时文件可能会被偷窥,如:一个拼写检查的服务,返回结果的url是:http://bad.example.com/spellcheck.php?tmp_file=spellcheck46 ,攻击者分析你的url参数后使用http://bad.example.com/spellcheck.php?tmp_file=spellcheck45 就可以访问到前一个用户的验证结果了。

3.2 可执行性

  通常临时文件是不可执行,但如果攻击者上传了一个php脚本到你的临时目录,而且通过某种方式执行了它,那可能造成悲剧了。

3.3 临时文件被劫持

  攻击者可能为了自己的目的,而劫持你的临时文件。他可能替换你的临时文件,也可能在你的临时文件后面追加一些信息。

  劫持临时文件的目的包括:

(1)让你的应用程序处理他的数据,而不是你自己的数据
(2)暴露隐私数据,比如系统的密码文件,或者其它php安全模式不能正常读的文件
(3)删除数据,阻碍请求的正常进行
(4)创建并输出虚假的数据,破坏请求的结果
(5)通过提供虚假的数据,对使用数据进行下一步处理的应用程序造成破坏
(6)将你的输出重定向到其它地方,可以方便攻击者访问或者覆盖系统文件

  劫持通常与竞争条件相关。当两个不同的进程操作同一个文件的时候,就可能产生竞争条件。例如,一个读进程和一个写进程同时操作一段数据,当写进程只完成了一部分的时候,读进程已经完成,这样读的到内容一部分是新的,一部分是旧的,也就是我们常说的读脏数据。

  临时文件的劫持,在一定程度上会造成竞争条件,除非劫持者准确的把握时间和位置,否则就会造成此类安全问题。

三、预防临时文件被恶意使用

  前面我们介绍了临时文件的概念,以及临时文件被恶用可能带来的危害,这个部分主要介绍一些策略来预防临时文件被恶意利用,以及减少其带来的危害。

1.调整存放位置

  防止临时文件被恶意利用的最重要,也是最简单的一步就是让你的临时文件目录以及名字不容易被猜到。任何对临时文件的恶意利用,攻击者都必须知道临时文件的名字和路径,因此你应该尽可能的让他难以猜到你的临时文件名字及路径。

  建议你在临时文件目录的选择时,还是将你的临时文件放在默认的目录下吧,这样系统进程可以方便找到以及读写。而把精力花费放在为文件名想个合适的难猜的名字。

  php的tempnam()函数,可以创建一个临时文件,并且其自动生成的文件名不会与当前目录下的其它文件名冲突,此函数创建的文件默认权限是600,即rw——-。

例如

$filename = tempnam( ‘..', ‘myTempfile');

  运行后可能生成一个名为myTempfile1af的文件,当第二次运行的时候就生成了名为myTempfile1b0的文件名。
也许一些编程实践指南会建议你在使用tempnam()生成文件的时候,用一些有意义的前缀来命名,这样能通过文件名看出文件中包含的数据或者需要此数据的应用,但从安全性的角度来看最好不要这样,这样等于为攻击者指明了方向。

  这里介绍一种方法,即能有一定意义的前缀同时也让攻击者不那么好猜,如下:


    
 
 

您可能感兴趣的文章:

  • 浅谈php安全性需要注意的几点事项
  • Session的工作机制详解和安全性问题(PHP实例讲解)
  • 修改配置真正解决php文件上传大小限制问题(nginx+php)
  • php是什么文件 php文件怎么打开
  • 修改配置真正解决php文件上传大小限制问题(apache+php)
  • PHP源文件加密工具 PHP Screw
  • PHP 'ext/soap/php_xml.c'不完整修复存在多个任意文件泄露漏洞
  • Linux下重编译PHP后Apache竟然不能解析.php文件?
  • 图解找出PHP配置文件php.ini的路径的方法
  • php解压文件代码实现php在线解压
  • PHP大文件上传问题解析 php大文件上传配置参考
  • 查找php配置文件php.ini所在路径的二种方法
  • linux下的php文件放在哪个文件夹下才能访问
  • php导入excel php使用phpexcel导入excel文件
  • php读取文件内容并清空文件
  • 在linux下配的apache的服务,但是读documeroot下的html文件可以,但是.php文件就不行,为什么呢?
  • PHP配置文件设置上传大文件
  • 请教一个linux下命令运行php文件的问题
  • 如何修改PHP+Apache上传文件大小限制
  • PHP读取文件内容后清空文件示例代码
  • 单文件PHP框架 SinglePHP
  • PHP include任意文件或URL介绍
  • mod_php.so文件被删除还有得救吗
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • PHP形态分析库 phpMorphy
  • php输入流php://input使用示例(php发送图片流到服务器) iis7站长之家
  • php的慢速日志引起的Mysql错误问题分析
  • php中数字0和空值的区别分析
  • PHP extract(数组拆分)作用分析
  • linux下使用crontab实现定时PHP计划任务失败的原因分析
  • php编码转换分析
  • PHP魔术引号所带来的安全问题分析
  • php浮点数精度用法分析
  • PHP框架Swoole定时器Timer特性分析
  • PHP匹配多行的正则表达式分析
  • PHP文件缓存内容保存格式实例分析
  • php构造函数与析构函数实例分析
  • PHP is_file与file_exists用法分析
  • php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
  • php魔术引号安全问题实例分析
  • Discuz7.2版的faq.php SQL注入漏洞分析
  • PHP中new static()与new self()的区别异同分析
  • PHP中array_map与array_column之间的关系分析
  • PHP中spl_autoload_register()和__autoload()区别分析
  • PHP 5.4.19 和 PHP 5.5.3 发布及下载地址
  • IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
  • PHP去除html标签,php标记及css样式代码参考
  • php输入流php://input使用示例(php发送图片流到服务器)
  • php通过socket_bind()设置IP地址代码示例
  • PHP转换器 HipHop for PHP
  • php安装完成后如何添加mysql扩展
  • PHP 框架 Pop php
  • PHP的substr() 函数用法
  • PHP的JavaScript框架 PHP.JS
  • PHP介绍及学习网站推荐




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3