漏洞無非這麼幾類,XSS、sql注入、命令執行、上傳漏洞、本地包含、遠程包含、權限繞過、信息泄露、cookie僞造、CSRF(跨站請求)等。這些漏洞不單單是針對PHP語言的,本文只是簡單介紹PHP如何有效防止這些漏洞。 php
1.xss + sql注入(關於xss攻擊詳細介紹) html
其中佔大頭的天然是XSS與SQL注入,對於框架類型或者有公共文件的,建議在公共文件中統一作一次XSS和SQL注入的過濾。用PHP寫個過濾函數,可由以下所示: 前端
$_REQUEST = filter_xss($_REQUEST); mysql
$_GET = filter_xss($_GET); sql
$_POST = filter_xss($_POST); shell
$_COOKIE = filter_xss($_COOKIE); 數組
$_POST = filter_sql($_POST); cookie
$_GET = filter_sql($_GET); session
$_COOKIE = filter_sql($_COOKIE); 框架
$_REQUEST = filter_sql($_REQUEST);
最簡單的filter_xss函數是htmlspecialchars()
最簡單的filter_sql函數是mysql_real_escape_string()
固然,誰都知道這種過濾filter_sql(詳細防止sql注入)只能過濾字符型和搜索型的注入,對於數字型是沒有辦法的,但也說明作了這層過濾後,只需在後面注意數字型的SQL語句就能夠了,遇到了加intval過濾就能夠了,這就變得容易多了。
2. 命令執行
對於命令執行,能夠從關鍵字入手,總共可分爲3類
(1) php代碼執行 :eval等
(2)shell命令執行:exec、passthru、system、shell_exec等
(3) 文件處理:fwrite、fopen、mkdir等
對於這幾類須要注意其參數是否用戶可控。
3.上傳漏洞
對於上傳漏洞,也是重點關注的地方,要仔細分析它的處理流程,針對上傳的繞過方式是不少的,最保險的方式:在保存文件是採用文件名隨機命名和後綴白名單方式。其次要注意的一點是上傳文件的地方可能不止一處,不要有遺漏,可能會碰到這樣的狀況,忽然在某個目錄裏面包含了一個第三方的編輯器在裏面。
文件包含漏洞涉及的函數如include() 、include_once()、require()、require_once()、file_get_contents()等
最多見的仍是出在下載文件功能函數,例如download.php?file=../../../etc/passwd 這種類型中。
4. 權限繞過
權限繞過可分爲兩類吧
(1)後臺文件的未受權訪問。後臺的文件沒有包含對session的驗證,就容易出現這樣的問題
(2)未做用戶隔離,例如mail.php?id=23顯示了你的信件,那麼換個ID, mail.php?id=24就查看到了別人的信件,編寫代碼是方便,把信件都存在一個數據表裏,id統一編號,前端展示時只需按id取出便可,但未做用戶隔離,斷定歸屬,容易形成越權訪問。
這樣的例子是很常見的,給某銀行作評估是就常常發現這種漏洞。
5. 信息泄露
信息泄露算是比較低危的漏洞了,好比列目錄這種就屬於部署問題,而與代碼審計無關了,而像暴路徑、暴源碼這種是須要防止的。曾經遇到這樣的代碼
<?php if(empty($_GET['a'])) {…} ?>
表面上彷佛沒問題,但是當請求變爲 xx.php?a[]=1時,即參數變爲數組的時候,就會發生錯誤以至路徑泄露,而用isset判斷則不會,固然一個個防太麻煩,建議在配置文件中關閉錯誤提示,或者在公共文件中加入以下代碼以關閉錯誤顯示功能:
<?php error_reporting(0);?>
以前PHP點點通(phpddt.com)就有一篇文章:關於PHP防止漏洞策略 ,介紹了register_globals 的危害以及魔術引用Magic Quotes使用說明。
註明:本文部份內容摘自PHPCHINA