一、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,并在所有脚本中包含本文件。
|