一、PHP变量漏洞防范
1、所有变量进行初始化 2、在使用extract()分解由用户提交的数据组成的数组时,一定要设定第二个参数为:EXTR_SKIP 例如:extract($_REQUEST,EXTR_SKIP); 3、使用define函数定义常量 4、严格控制变量的数据类型
二、文件包含漏洞防范使用的文件名可以使用define函数定义的常量,或用户不能直接修改的变量。
三、SQL注入攻击防范对用户提交的数据进行转义和过滤:
<?php // @filename phpsafe.php // @version 1.0
// @comment PHP Safe Functions // ============================= function adm_escape_filter($str, $allowHtml = true) { static $func = ''; if (empty($func)) { if (function_exists('mysql_real_escape_string') && $GLOBALS['db']) { // 使用本函数之前,请确认已经进行过数据库连接。 $func = 'mysql_real_escape_string'; //转义字符有:\x00, \n, \r, \, ', " and \x1a } else { $func = 'addslashes'; //转义字符有:',",\, NULL } }
if (is_array($str)) { foreach($str AS $k => $v) { if($k!='GLOBALS'&&!ereg('^_[A-Z]+$',$k)) { $str[$k] = adm_escape_filter($v, $allowHtml); }else{ unset($str[$k]); } } } else { $str = $func($str); $str = adm_filter($str,$allowHtml); } return $str; }
function adm_filter($str, $allowHtml = true, $break = 0) { if (is_array($str)) { foreach($str AS $k => $v) { if($k!='GLOBALS'&&!ereg('^_[A-Z]+$',$k)) { $str[$k] = adm_filter($v, $allowHtml, $break); }else{ unset($str[$k]); } } } else { if(!$allowHtml) { $str = htmlspecialchars($str); } if ($break) { if (preg_match('{(select|insert|update|delete|/\*|union|into|load_file|outfile|0xbf)}is', $str, $fd)) { exit('<script type="text/javascript"> <!-- alert("\u60A8\u63D0\u4EA4\u7684\u6570\u636E\u4E2D\u5305\u542B\u975E\u6CD5\u5B57\u7B26\u300E' . $fd[1] .'\n('.$str.')'. '\u300F\uFF0C\u8BF7\u4FEE\u6539\u3002"); //--> </script>'); } } else { $str = preg_replace_callback('{(select|insert|update|delete|/\*|union|into|load_file|outfile|0xbf)}is', 'adm_preg_callback', $str); } } return $str; }
function adm_preg_callback($p) { if ($p[1]) { $len=strlen($p[1]); if($len>1) { $p[1] = substr($p[1], 0, $len-1) . ' ' . substr($p[1], -1); }else{ $p[1] = ''; } } return $p[1]; }
function adm_t($p,$t='i') { switch($t){ case 'i'://整数 $p = preg_replace('{[^0-9]+}is','',$p); $p = intval($p); break; case 'a'://字母 $p = preg_replace('{[^a-z]+}is','',$p); break; case 's'://字符串 $p = strval($p); break;
case 'aiu'://字母数字下划线 default: $p = preg_replace('{[^a-z0-9_]+}is','',$p); } return $p; }
if (!defined('ADM_GPC_QUOTES')) { define('ADM_GPC_QUOTES', get_magic_quotes_gpc()); } if ($_REQUEST) { if ($_COOKIE) { $_COOKIE = ADM_GPC_QUOTES ? adm_filter($_COOKIE, false) : adm_escape_filter($_COOKIE, false); } if ($_POST) { $_POST = ADM_GPC_QUOTES ? adm_filter($_POST) : adm_escape_filter($_POST); } if ($_GET) { $_GET = ADM_GPC_QUOTES ? adm_filter($_GET, false) : adm_escape_filter($_GET, false); } $_REQUEST = @array_merge($_COOKIE,$_POST,$_GET); extract($_REQUEST,EXTR_SKIP); } if($_FILES) { $_FILES = ADM_GPC_QUOTES ? adm_filter($_FILES, false) : adm_escape_filter($_FILES, false); } $_SERVER = adm_escape_filter($_SERVER, false); 将以上代码保存为phpsafe.php,并在所有脚本中包含本文件。