/*ansic碼-Url碼表: http://www.w3school.com.cn/tags/html_ref_urlencode.html
-----------------------------------------------------------------------------------------------------------------
1、驗證過濾用戶的輸入
即使是最普通的字母數字輸入也可能是危險的,列舉幾個容易引起安全問題的字符:
!$ ^ & * ( ) ~ [ ] \ | { } ' " ; < > ? - `
在數據庫中可能有特殊意義的字符:
'" ; \
還有一些非打印字符:
字符\x00或者說ASCII 0,NULL或FALSE
字符\x10和\x13,或者說ASCII 10和13,\n \r
字符\x1a或者說ASCII 26,表示文件的結束
輸入錯誤的參數類型,也可能導致程序出現意想不到的錯誤。
輸入過多的參數值,可能導致溢出等錯誤。
2、對於文件的路徑與名稱的過濾
文件名中不能包含二進制數據,否則可能引起問題。
一些系統允許Unicode多字節編碼的文件名,但是盡量避免,應當使用ASCII的字符。
雖然Unix系統幾乎可以在文件名設定中使用任何符號,但是應當盡量使用 - 和 _ 避免使用其他字符。
同時需要限定文件名的長度。
3、防止SQL注入
檢查用戶輸入的類型,當用戶輸入的為數字時可以使用如下方式:
使用is_int()函數(或is_integer()或is_long()函數)
使用gettype()函數
使用intval()函數
使用settype()函數
檢查用戶輸入字符串的長度使用strlen()函數。
檢查日期或時間是否是有效的,可以使用strtotime()函數
4、防止XSS攻擊
xss攻擊一個常用的方法就是注入HTML元素執行js腳本,php中已經內置了一些防御的函數(如htmlentities或者htmlspecialchars)
5、過濾用戶提交的URL
如果允許用戶輸入一個URL用來調用一個圖片或者鏈接,你需要保證他不傳入javascript:或者vbscript:或data:等非http協議。
可以使用php的內置函數parse_url()函數來分割URL,然後做判斷。
6、防止遠程執行--下表列出了跟Shell相關的一些字符:
遠程執行通常是使用了php代碼執行如eval()函數,或者是調用了命令執行如exec(),passthru(),proc_open(),shell_exec(),system()或popen()。
注入php代碼:php為開發者提供了非常多的方法可以來調用允許php腳本,我們就需要注意對用戶可控的數據進行過濾。
7、Shell命令執行
PHP提供了一些可以直接執行系統命令的函數,如exec()函數或者 `(反引號)。
PHP的安全模式會提供一些保護,但是也有一些方式可以繞過安全模式:
1、上傳一個Perl腳本,或者Python或Ruby等,服務器支持的環境,來執行其他語言的腳本可繞過PHP的安全模式。
2、利用系統的緩沖溢出漏洞,繞過安全模式。
跟Shell相關的一些字符:
名稱 字符 ASCII 16進制 URL編碼 HTML編碼
換行 10 \x0a %0a 

感歎號 ! 33 \x21 %21 !
雙引號 " 34 \x22 %22 "或"
美元符號 $ 36 \x24 %24 $
連接符 & 38 \x26 %26 &或&#amp
單引號 ' 39 \x27 %27 '
左括號 ( 40 \x28 %28 (
右括號 ) 41 \x29 %29 )
星號 * 42 \x2a %2a *
連字符號 - 45 \x2d %2d -
分號 ; 59 \x3b %3b ;
左尖括號 < 60 \x3c %3c <
右尖括號 > 62 \x3e %3e >
問號 ? 63 \x3f %3f ?
左方括號 [ 91 \x5b %5b [
反斜線 \ 92 \x5c %5c \
右方括號 ] 93 \x5d %5d ]
插入符 ^ 94 \x5e %5e ^
反引號 ` 96 \x60 %60 `
左花括號 { 123 \x7b %7b {
管道符 | 124 \x7c %7c |
右花括號 } 125 \x7d %7d }
波浪號 ~ 126 \x7e %7e ~
-----------------------------------------------------------------------------------------------------------------
安全過濾函數代碼*/
/**
* 安全過濾輸入[jb]
*/
function check_str($string, $isurl = false)
{
$string= preg_replace('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/','',$string); //去掉控制字符
$string= str_replace(array("\0","%00","\r"),'',$string);//\0表示ASCII 0x00的字符,通常作為字符串結束標志;這三個都是可能有害字符
empty($isurl)&& $string =preg_replace("/&(?!(#[0-9]+|[a-z]+);)/si",'&',$string);//HTML裡面可以用&#xxx;來對一些字符進行編碼,比如 (空格), ? Unicode字符等,A(?!B) 表示的是A後面不是B,所以作者想保留 ?類似的 HTML編碼字符,去掉其他的問題字符
$string= str_replace(array("%3C",'<'),'<',$string); //ascii的'<'轉成'<';
$string= str_replace(array("%3E",'>'),'>',$string);
$string= str_replace(array('"',"'","\t",' '),array('“','‘','',' '),$string);
returntrim($string);
}
/**
* 安全過濾類-過濾javascript,css,iframes,object等不安全參數 過濾級別高
* @param string $value 需要過濾的值
* @return string
*/
function fliter_script($value) {
$value=preg_replace("/(javascript:)?on(click|load|key|mouse|error|abort|move|unload|change|dblclick|move|reset|resize|submit)/i","&111n\\2",$value);
$value= preg_replace("/(.*?)<\/script>/si","",$value);
$value= preg_replace("/(.*?)<\/iframe>/si","",$value);
$value= preg_replace ("//iesU", '', $value);
return$value;
}
/**
* 安全過濾類-過濾HTML標簽
* @param string $value 需要過濾的值
* @return string
*/
function fliter_html($value) {
if(function_exists('htmlspecialchars')) return htmlspecialchars($value);
returnstr_replace(array("&", '"', "'", "<",">"), array("&", "\"", "'","<", ">"), $value);
}
/**
* 安全過濾類-對進入的數據加下劃線 防止SQL注入
* @param string $value 需要過濾的值
* @return string
*/
function fliter_sql($value) {
$sql= array("select", 'insert', "update", "delete","\'", "\/\*","\.\.\/", "\.\/","union", "into", "load_file","outfile");
$sql_re=array("","","","","","","","","","","","");
returnstr_replace($sql, $sql_re, $value);
}
/**
* 安全過濾類-通用數據過濾
* @param string $value 需要過濾的變量
* @return string|array
*/
function fliter_escape($value) {
if(is_array($value)) {
foreach($value as $k => $v) {
$value[$k]= self::fliter_str($v);
}
}else {
$value= self::fliter_str($value);
}
return$value;
}
/**
* 安全過濾類-字符串過濾 過濾特殊有危害字符
* @param string $value 需要過濾的值
* @return string
*/
function fliter_str($value) {
$badstr= array("\0", "%00", "\r", '&', ' ','"', "'", "<", ">", " ", "%3C", "%3E");
$newstr= array('', '', '', '&', ' ', '"', ''', "<",">", " ","<", ">");
$value = str_replace($badstr, $newstr, $value);
$value =preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $value);
return$value;
}
/**
* 私有路勁安全轉化
* @param string $fileName
* @return string
*/
function filter_dir($fileName) {
$tmpname= strtolower($fileName);
$temp= array(':/',"\0", "..");
if(str_replace($temp, '', $tmpname) !== $tmpname) {
returnfalse;
}
return$fileName;
}
/**
* 過濾目錄
* @param string $path
* @return array
*/
public function filter_path($path) {
$path= str_replace(array("'",'#','=','`','$','%','&',';'), '', $path);
returnrtrim(preg_replace('/(\/){2,}|(\\\){1,}/', '/', $path), '/');
}
/**
* 過濾PHP標簽
* @param string $string
* @return string
*/
public function filter_phptag($string) {
returnstr_replace(array(''), array('<?', '?>'), $string);
}
/**
* 安全過濾類-返回函數
* @param string $value 需要過濾的值
* @return string
*/
public function str_out($value) {
$badstr= array("<", ">", "%3C", "%3E");
$newstr= array("<", ">", "<",">");
$value = str_replace($newstr, $badstr, $value);
returnstripslashes($value); //下劃線
}