php安全過濾類


/*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                   &#10

                   感嘆號   !                33             \x21         %21                  &#33

                   雙引號   "               34             \x22         %22                  &#34或&quot

                   美元符號 $             36             \x24         %24                  &#36

                   連接符   &              38             \x26         %26                  &#38或&#amp

                   單引號   '                39             \x27         %27                  &#39

                   左括號   (                40             \x28         %28                  &#40

                   右括號   )                41             \x29         %29                  &#41

                   星號        *               42             \x2a        %2a                   &#42

                   連字符號 -              45             \x2d         %2d                  &#45

                   分號        ;                59             \x3b        %3b                   &#59

                   左尖括號 <             60             \x3c         %3c                  &#60

                   右尖括號 >             62             \x3e         %3e                  &#62

                   問號        ?               63             \x3f         %3f                    &#63

                   左方括號 [              91             \x5b         %5b                  &#91

                   反斜線   \                92             \x5c         %5c                  &#92

                   右方括號 ]              93             \x5d         %5d                  &#93

                   插入符   ^               94             \x5e         %5e                  &#94

                   反引號   `                96             \x60         %60                  &#96

                   左花括號 {              123          \x7b         %7b                  &#123

                   管道符   |               124          \x7c         %7c                  &#124

                   右花括號 }              125          \x7d         %7d                  &#125

                   波浪號   ~               126          \x7e         %7e                  &#126

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

安全過濾函數代碼*/

 

/**

* 安全過濾輸入[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);

         return trim($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);

         return str_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("","","","","","","","","","","","");

         return str_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) {

                   return false;

         }

         return $fileName;

}

 

/**

* 過濾目錄

* @param string $path

* @return array

*/

public function filter_path($path) {

         $path = str_replace(array("'",'#','=','`','$','%','&',';'), '', $path);

         return rtrim(preg_replace('/(\/){2,}|(\\\){1,}/', '/', $path), '/');

}

 

/**

* 過濾PHP標簽

* @param string $string

* @return string

*/

public function filter_phptag($string) {

         return str_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);

         return stripslashes($value); //下划線

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM