php防注入过滤客户提交$_GET 和$_POST参数

 更新时间:2016年11月25日 15:24  点击:2260
下面一款防止php页面给sql注入的一个程序代码,有需要的朋友可参考。

以下代码实现过滤php的$_GET 和$_POST参数

 代码如下 复制代码

/**
* 安全防范
*/
function Add_S($array)
{
foreach($array as $key=>$value)
{
if(!is_array($value))
{
$value = get_magic_quotes_gpc()?$value:addslashes($value);
$array[$key]=filterHtml($value);
}
Else
{
Add_S($array[$key]);
}
}
return $array;
}
function glstr($var) {

if (is_array($var)) {
return Add_S($var);
}
elseif(strlen($var)){
$var = get_magic_quotes_gpc()?$var:addslashes($var);

$var = filterHtml($var);
}
return $var;
}
function filterHtml($html)
{
$farr = array(
"/<!DOCTYPE([^>]*?)>/eis",
"/<(/?)(html|body|head|link|meta|base|input)([^>]*?)>/eis",
"/<(script|i?frame|style|title|form)(.*?)</\1>/eis",
"/(<[^>]*?s+)on[a-z]+s*?=("|')([^\2]*)\2([^>]*?>)/isU",//过滤javascript的on事件
"/s+/",//过滤多余的空白
);
$tarr = array(
"",
"",
"",
"\1\4",
" ",
);
$html = preg_replace( $farr,$tarr,$html);
return $html;
}
if (sizeof($_GET)) {
foreach($_GET as $key => $value) {
$_GET[$key] = glstr($value); //
}

}
if (sizeof($_POST)) {
foreach($_POST as $key => $value) {
$_POST[$key] = glstr($value); //
}
}

我们在做留言系统时经常会想把一些不出现的敏感词过滤掉了,下面是一个简单的实现,其实我们可以利用数据库来保存这些信息,然后查出来再作判断即可。
 代码如下 复制代码
/用正则表达式(把脏话想替换成什么就替换成什么)
   $str = "aa=!!|bb=@@|cc=##|dd=$$|ee=%%|ff=^^|gg=&amp;&amp;";
    $arr = explode('|',$str);
    foreach($arr as $key=&gt;$val)
    {
        $array[] = explode('=',$val);
    }
    print_r($array);
 
    for($i=0;$i&lt;count($array);$i++)
    {
        $a1[] = &quot;/&quot;.$array[$i][0].&quot;/&quot;;
        $a2[] = $array[$i][1];
    }
 
    unset($arr);
    $message= &#039;呵呵 就是一个反社会的时代 WOCAO madE&#039;;
    echo $message.&#039;<br>';
    print preg_replace($a1,$a2,$message);  //支持参数个数组 但是参数区分大小写
  <strong></strong> print eregi_replace($arr1,array('!!','@@','##','$$','%%','^^','&amp;&amp;'),$message); //不支持数组  但是参数 不区分大小写
在php5的环境中我们的$_SERVER变量将不再受magic_quotes_gpc的保护,至于程序该如何加强自己的安全性,下面我们总结了怎么保护php中的cookie,get,post,files数据哦,有需要的朋友可参考一下。

<?php

 代码如下 复制代码
$magic_quotes_gpc = get_magic_quotes_gpc();
@extract(daddslashes($_COOKIE));
@extract(daddslashes($_POST));
@extract(daddslashes($_GET));
if(!$magic_quotes_gpc) {
 $_FILES = daddslashes($_FILES);
}


daddslashes函数

 代码如下 复制代码

 //转译字符函数
 function daddslashes($string) {
     if(!is_array($string)) return addslashes($string);
     foreach($string as $key => $val) $string[$key] = daddslashes($val);
     return $string;
 }

?>

这个函数我想很多朋友都知道,黑客用得最多的一句了,可以解析php 代码并且运行哦,eval是函数不可在php中禁止,以前我就以为可以在php.ini禁止此函数,结果失败了。

定义和用法
eval() 函数把字符串按照 PHP 代码来计算。

该字符串必须是合法的 PHP 代码,且必须以分号结尾。

如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

语法
?eval(phpcode)
  

参数 描述
phpcode 必需。规定要计算的 PHP 代码。

 
提示和注释
注释:返回语句会立即终止对字符串的计算。

注释:该函数对于在数据库文本字段中供日后计算而进行的代码存储很有用。

例子
?

 代码如下 复制代码
<?php
$string = "beautiful";
$time = "winter";
 
$str = 'This is a $string $time morning!';
echo $str. "<br />";
 
eval("$str = "$str";");
echo $str;
?>   

 
输出:

 代码如下 复制代码
This is a $string $time morning!
This is a beautiful winter morning!

 

--------------------------------------------------------------------------------

eval() 函数在CodeIgniter框架里也有用到。在 /system/database/DB.php 文件中,根据系统的配置动态的定义了一个类 CI_DB,具体代码片段如下:?

 代码如下 复制代码
if ( ! isset($active_record) OR $active_record == TRUE)
    {
        require_once(BASEPATH.'database/DB_active_rec.php');
 
        if ( ! class_exists('CI_DB'))
        {
            eval('class CI_DB extends CI_DB_active_record { }');
        }
    }
    else
    {
        if ( ! class_exists('CI_DB'))
        {
            eval('class CI_DB extends CI_DB_driver { }');
        }
    }
 
    require_once(BASEPATH.'database/drivers/'.$params['dbdriver'].'/'.$params['dbdriver'].'_driver.php');
 
    // Instantiate the DB adapter
    $driver = 'CI_DB_'.$params['dbdriver'].'_driver';
    $DB = new $driver($params);

  

本函式可将字符串之中的变量值代入,通常用在处理数据库的数据上。参数 code_str 为欲处理的字符串。值得注意的是待处理的字符串要符合 PHP 的字符串格式,同时在结尾处要有分号。使用本函式处理后的字符串会沿续到 PHP 程序结束。

本文章介绍了用户自定义的addslashes函数,他可以自动过滤,post,get过来的非法数据哦。
 代码如下 复制代码
@set_magic_quotes_runtime(0);
 $MQG = get_magic_quotes_gpc();
 
 if(!$MQG && $_POST) $_POST = daddslashes($_POST);
 if(!$MQG && $_GET) $_GET = daddslashes($_GET);
 
 //转译字符函数
 function daddslashes($string) {
     if(!is_array($string)) return addslashes($string);
     foreach($string as $key => $val) $string[$key] = daddslashes($val);
     return $string;
 }
[!--infotagslink--]

相关文章