php的XML文件解释类应用实例

因为这些缘故,好多拉萨钻探人士建议在php.ini配置中禁止使用指向allow_url_fopen。不幸的是,大多推荐介绍这种办法的人,并未察觉到,那样会破坏相当多的运用还要并不能够担保百分之百的减轻remote
U奥迪Q5L includes以及他带来的不安全性。

本文实例叙述了php的XML文件解释类及其用法,是极度实用的技巧。分享给我们供我们参照他事他说加以考察。具体如下:

一般,用户供给在他们选取别的的文件系统函数的时候,php允许禁止UPRADOL包罗和呼吁注脚帮衬。

XMLParser.class.php类文件如下:

因为那一个原因,安排在PHP6中提供allow_url_include。在这几个商讨之后,这几个特点在php5.2.0
中被backported。现在多数的安全研商人口已经济体更改了他们的建议,只建议大家禁止allow_url_include。

<?php 
/** XML 文件分析类 
*  Date:  2013-02-01 
*  Author: fdipzone 
*  Ver:  1.0 
* 
*  func: 
*  loadXmlFile($xmlfile)   读入xml文件输出Array 
*  loadXmlString($xmlstring) 读入xmlstring 输出Array 
*/ 

class XMLParser{ 

  /** 读取xml文件 
  * @param String $xmlfile 
  * @return Array 
  */ 
  public function loadXmlFile($xmlfile){ 
    // get xmlfile content 
    $xmlstring = file_exists($xmlfile)? file_get_contents($xmlfile) : ''; 
    // parser xml 
    list($flag, $data) = $this->parser($xmlstring); 
    return $this->response($flag, $data); 
  } 

  /** 读取xmlstring 
  * @param String $xmlstring 
  * @return Array 
  */ 
  public function loadXmlString($xmlstring){ 
    // parser xml 
    list($flag, $data) = $this->parser($xmlstring); 
    return $this->response($flag, $data); 
  } 

  /** 解释xml内容 
  * @param  String $xmlstring 
  * @return Array 
  */ 
  private function parser($xmlstring){ 
    $flag = false; 
    $data = array(); 
    // check xml format 
    if($this->checkXmlFormat($xmlstring)){ 
      $flag = true; 
      // xml to object 
      $data = simpleXML_load_string($xmlstring, 'SimpleXMLElement', LIBXML_NOCDATA); 
      // object to array 
      $this->objectToArray($data); 
    } 
    return array($flag, $data); 
  } 

  /** 检查xml格式是否正确 
  * @param String $xmlstring 
  * @return boolean 
  */ 
  private function checkXmlFormat($xmlstring){ 
    if($xmlstring==''){ 
      return false; 
    } 
    $xml_parser_obj = xml_parser_create(); 

    if(xml_parse_into_struct($xml_parser_obj, $xmlstring, $vals, $indexs)===1){ // 1:success 0:fail 
      return true; 
    }else{ 
      return false; 
    } 
  } 

  /** object 转 Array 
  * @param object $object 
  * @return Array 
  */ 
  private function objectToArray(&$object){ 

    $object = (array)$object; 

    foreach($object as $key => $value){ 
      if($value==''){ 
        $object[$key] = ""; 
      }else{ 
        if(is_object($value) || is_array($value)){ 
          $this->objectToArray($value); 
          $object[$key] = $value; 
        } 
      } 
    } 
  } 

  /** 输出返回 
  * @param boolean $flag true:false 
  * @param Array  $data 转换后的数据 
  * @return Array 
  */ 
  private function response($flag=false, $data=array()){ 
    return array($flag, $data); 
  } 
} 
?>

糟糕的是,allow_url_fopen和allow_url_include并非产生难题的因由。一方面来讲在应用中带有本和姑件还是是一件充裕惊险的事务,因为攻击者平常通过sessiondata,
fileupload, logfiles,…等方式获得php代码………

德姆o示例程序如下:

单向allow_url_fopen和allow_url_include只是珍视了against UPAJEROL
handles标识为UKugaL.那影响了http(s) and ftp(s)然则并不曾影响php或date(new
in php5.2.0) urls.这么些url情势,都足以特别简单的开始展览php代码注入。

<?php 
require "XMLParser.class.php"; 

$xmlfile = 'file.xml'; 
$xmlstring = '<?xml version="1.0" encoding="utf-8"?> 
<xmlroot> 
<status>1000</status> 
<info></info> 
<result><id>100</id> 
<name>fdipzone</name> 
<gender>1</gender> 
<age>28</age> 
</result> 
</xmlroot>'; 
echo '<pre>'; 
$xml_parser = new XMLParser(); 
echo "response xmlfile\r\n"; 
list($flag, $xmldata) = $xml_parser->loadXmlFile($xmlfile); 
if($flag){ 
  print_r($xmldata); 
} 
echo "response xmlstring\r\n"; 
list($flag, $xmldata) = $xml_parser->loadXmlString($xmlstring); 
if($flag){ 
  print_r($xmldata); 
} 
echo '</pre>'; 
?> 

Example 1: Use php://input to read the POST data 

至于PHP的XML预订义常量可参看官方文书档案:
http://www.php.net/manual/en/libxml.constants.php

<?php
// Insecure Include
// The following Include statement will
// include and execute everything POSTed
// to the server

include "php://input";
?>

可望本文所述对大家PHP程序设计的就学抱有帮忙。

Example 2: Use data: to Include arbitrary code

你可能感兴趣的篇章:

<?php
// Insecure Include
// The following Include statement will
// include and execute the base64 encoded
// payload. Here this is just phpinfo()

include "data:;base64,PD9waHAgcGhwaW5mbygpOz8+";
?>

把那一个放到大家的运算里面将会这些令人瞩指标觉察既不是url_allow_fopen也不是url_allor_include
被保证。这几个只是因为过滤器比较少对矢量进行过滤。能够百分百缓和这一个U福特ExplorerL
include vulnerabilities的情势是大家的Suhosin扩大.

你也许感兴趣的篇章:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图