php通用防注入類
更新時間:2012-03-28 | 發(fā)布人:本站 | 點(diǎn)擊率:297 次
<?php
/*************************
說明:
判斷傳遞的變量中是否含有非法字符
如$_POST、$_GET
功能:
防注入
注:請自行完善要過濾的非法字符
**************************/
//要過濾的非法字符
$ArrFiltrate=array("'",";","union");
//出錯后要跳轉(zhuǎn)的url,不填則默認(rèn)前一頁
$StrGoUrl="#";
//是否存在數(shù)組中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}
//合并$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($_POST,$_GET);
}else{
foreach($_POST as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($_GET as $key=>$value){
$ArrPostAndGet[]=$value;
}
}
//驗(yàn)證開始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo "<script language="javascript">alert("非法字符");</script>";
if (empty($StrGoUrl)){
echo "<script language="javascript">history.go(-1);</script>";
}else{
echo "<script language="javascript">window.location="".$StrGoUrl."";</script>";
}
exit;
}
}
/**
附注:$HTTP_POST_VARS與$_POST的區(qū)別
$HTTP_GET_VARS與$_GET $HTTP_POST_VARS與$_POST
$HTTP_POST_VARS可以用于3.0及以下版本,$HTTP_POST_VARS不是自動全局變量
$_POST只能用于4.0及以上版本中
為了你的代碼應(yīng)用可以更廣泛,請寫成$HTTP_POST_VARS
HTTP POST 變量:$_POST
注: 在 PHP 4.1.0 及以后版本使用。之前的版本,使用 $HTTP_POST_VARS。
通過 HTTP POST 方法傳遞的變量組成的數(shù)組。是自動全局變量。
這是一個“superglobal”,或者可以描述為自動全局變量。這只不過意味這它在所有的腳本中都有效。在函數(shù)或方法中您不需要使用 global $_POST; 來訪問它,就如同使用 $HTTP_POST_VARS 一樣。
$HTTP_POST_VARS 包含著同樣的信息,但是不是一個自動全局變量。(注意: HTTP_POST_VARS 和 $_POST 是不同的變量,PHP 處理它們的方式不同。)
**/
PHP防注入方法二(以下代碼未經(jīng)測試,請自行按需修改。
以下是一段copy來的代碼:
$_POST = sql_injection($_POST);
$_GET = sql_injection($_GET);
function sql_injection($content)
{
if (!get_magic_quotes_gpc()) {
if (is_array($content)) {
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
addslashes($content);
}
}
return $content;
}
做系統(tǒng)的話,可以用下面的代碼,也是copy來的。接下來做系統(tǒng)的時候,如果有問題,或者有修改的地方,我會補(bǔ)充說明:
/*
函數(shù)名稱:inject_check()
函數(shù)作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護(hù)服務(wù)器安全
參 數(shù):$sql_str: 提交的變量
返 回 值:返回檢測結(jié)果,ture or false
*/
function inject_check($sql_str) {
return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); // 進(jìn)行過濾
}
/*
函數(shù)名稱:verify_id()
函數(shù)作用:校驗(yàn)提交的ID類值是否合法
參 數(shù):$id: 提交的ID值
返 回 值:返回處理后的ID
*/
function verify_id($id=null) {
if (!$id) { exit('沒有提交參數(shù)!'); } // 是否為空判斷
elseif (inject_check($id)) { exit('提交的參數(shù)非法!'); } // 注射判斷
elseif (!is_numeric($id)) { exit('提交的參數(shù)非法!'); } // 數(shù)字判斷
$id = intval($id); // 整型化
return $id;
}
/*
函數(shù)名稱:str_check()
函數(shù)作用:對提交的字符串進(jìn)行過濾
參 數(shù):$var: 要處理的字符串
返 回 值:返回過濾后的字符串
*/
function str_check( $str ) {
if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否打開
$str = addslashes($str); // 進(jìn)行過濾
}
$str = str_replace("_", "\_", $str); // 把 '_'過濾掉
$str = str_replace("%", "\%", $str); // 把 '%'過濾掉
return $str;
}
/*
函數(shù)名稱:post_check()
函數(shù)作用:對提交的編輯內(nèi)容進(jìn)行處理
參 數(shù):$post: 要提交的內(nèi)容
返 回 值:$post: 返回過濾后的內(nèi)容
*/
function post_check($post) {
if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否為打開
$post = addslashes($post); // 進(jìn)行magic_quotes_gpc沒有打開的情況對提交數(shù)據(jù)的過濾
}
$post = str_replace("_", "\_", $post); // 把 '_'過濾掉
$post = str_replace("%", "\%", $post); // 把 '%'過濾掉
$post = nl2br($post); // 回車轉(zhuǎn)換
$post = htmlspecialchars($post); // html標(biāo)記轉(zhuǎn)換
return $post;
}
?>