漏洞無(wú)非這么幾類(lèi),XSS、sql注入、命令執行、上傳漏洞、本地包含、遠程包含、權限繞過(guò)、信息泄露、cookie偽造、CSRF(跨站請求)等。這些漏洞不僅僅是針對PHP語(yǔ)言的,本文只是簡(jiǎn)單介紹PHP如何有效防止這些漏洞。

  1.xss + sql注入(關(guān)于xss攻擊詳細介紹)

  其中占大頭的自然是XSS與SQL注入,對于框架類(lèi)型或者有公共文件的,建議在公共文件中統一做一次XSS和SQL注入的過(guò)濾。用PHP寫(xiě)個(gè)過(guò)濾函數,可由如下所示:

  $_REQUEST = filter_xss($_REQUEST);

  $_GET = filter_xss($_GET);

  $_POST = filter_xss($_POST);

  $_COOKIE = filter_xss($_COOKIE);

  $_POST = filter_sql($_POST);

  $_GET = filter_sql($_GET);

  $_COOKIE = filter_sql($_COOKIE);

  $_REQUEST = filter_sql($_REQUEST);

  最簡(jiǎn)單的filter_xss函數是htmlspecialchars()

  最簡(jiǎn)單的filter_sql函數是mysql_real_escape_string()

  當然,誰(shuí)都知道這種過(guò)濾filter_sql(詳細防止sql注入)只能過(guò)濾字符型和搜索型的注入,對于數字型是沒(méi)有辦法的,但也說(shuō)明做了這層過(guò)濾后,只需在后面注意數字型的SQL語(yǔ)句就可以了,遇到了加intval過(guò)濾就可以了,這就變得容易多了。

  2. 命令執行

  對于命令執行,可以從關(guān)鍵字入手,總共可分為3類(lèi)

  (1) php代碼執行 :eval等

  (2)shell命令執行:exec、passthru、system、shell_exec等

  (3) 文件處理:fwrite、fopen、mkdir等

  對于這幾類(lèi)需要注意其參數是否用戶(hù)可控。

  3.上傳漏洞

  對于上傳漏洞,也是重點(diǎn)關(guān)注的地方,要仔細分析它的處理流程,針對上傳的繞過(guò)方式是很多的,最保險的方式:在保存文件是采用文件名隨機命名和后綴白名單方式。其次要注意的一點(diǎn)是上傳文件的地方可能不止一處,不要有遺漏,可能會(huì )碰到這樣的情況,突然在某個(gè)目錄里面包含了一個(gè)第三方的編輯器在里面。

  文件包含漏洞涉及的函數如include() 、include_once()、require()、require_once()、file_get_contents()等

  最常見(jiàn)的還是出在下載文件功能函數,例如download.php?file=../../../etc/passwd 這種類(lèi)型中。

  4. 權限繞過(guò)

  權限繞過(guò)可分為兩類(lèi)吧

  (1)后臺文件的未授權訪(fǎng)問(wèn)。后臺的文件沒(méi)有包含對session的驗證,就容易出現這樣的問(wèn)題

  (2)未作用戶(hù)隔離,例如mail.php?id=23顯示了你的信件,那么換個(gè)ID, mail.php?id=24就查看到了別人的信件,編寫(xiě)代碼是方便,把信件都存在一個(gè)數據表里,id統一編號,前端展現時(shí)只需按id取出即可,但未作用戶(hù)隔離,判定歸屬,容易造成越權訪(fǎng)問(wèn)。

  這樣的例子是很常見(jiàn)的,給某銀行做評估是就經(jīng)常發(fā)現這種漏洞。

  5. 信息泄露

  信息泄露算是比較低危的漏洞了,比如列目錄這種就屬于部署問(wèn)題,而與代碼審計無(wú)關(guān)了,而像暴路徑、暴源碼這種是需要防止的。曾經(jīng)遇到這樣的代碼

  

  表面上似乎沒(méi)問(wèn)題,可是當請求變?yōu)?xx.php?a[]=1時(shí),即參數變?yōu)閿到M的時(shí)候,就會(huì )發(fā)生錯誤以致路徑泄露,而用isset判斷則不會(huì ),當然一個(gè)個(gè)防太麻煩,建議在配置文件中關(guān)閉錯誤提示,或者在公共文件中加入如下代碼以關(guān)閉錯誤顯示功能.