使用 mysql_real_escape_string() 防止 SQL 注入問題。
使用正則表達式和 strlen() 來確保 GET 數據未被篡改。
使用正則表達式和 strlen() 來確保用戶提交的數據不會使內存緩衝區溢出。
使用 strip_tags() 和 htmlspecialchars() 防止用戶提交可能有害的 HTML 標記。
避免系統被 Tamper Data 這樣的工具突破。
使用唯一的令牌防止用戶向服務器遠程提交表單。
規則1:毫不相信外部數據或者輸入數據php
好比:GET變量,表單POST,數據庫,配置文件,會話變量或者是cookid
解決方法:對用戶輸入進行清理的簡單方法,使用正則表達式來處理,只但願接收字母,字符串限制爲特定數量的字符,或者全部的字母都是小寫的
$myUsername = cleanInput($_POST['username']); //clean!
$arrayUsers = array($myUsername, ‘tom’, ‘tommy’); //clean!
define(」GREETING」, ‘hello there’ . $myUsername); //clean!
function cleanInput($input){
$clean = strtolower($input);
$clean = preg_replace(」/[^a-z]/」, 「」, $clean);
$clean = substr($clean,0,12);
return $clean;
}
規則2:禁用那些使安全性難以實施的PHP設置
例如:要確保禁用register_globals.在項目上線是要確保已經關閉了錯誤報告級別
規則3:SQL注入
在URL地址欄中,一般會有將連接指向template.php?pid = 33或者 template.php?pid = 456 這樣的位置,URL中問號後面的部分稱之爲查詢字符串,也稱之爲GET查詢字符串
$pid = $_GET['pid'];
$obj = new Page();
$content = $obj ->fetchPaget($pid);
代碼看起來沒什麼問題,可是用戶能夠在地址欄上隨意輸入值了。咱們應該確保pid 應該是數字,可使用 is_numeric(),但還不夠,若是是10.2,+0234.34e5,0xff339988f又該如何呢,咱們可使用正則來顯示GET變量 preg_match('/^[0-9+$]/',$pid).還要檢查變量的長度是否爲0,顯示變量的長度,防止緩衝區溢出
$pid = $_GET['pid'];
if (strlen($pid)){
if (!ereg(」^[0-9]+$」,$pid) && strlen($pid) > 5){
}
}else{
}
$obj = new Page;
$content = $obj->fetchPage($pid);
?> [/php]
緩衝區溢出攻擊向緩衝區發送大量數據,使部分數據溢出到相鄰的內存緩衝區,從而破壞緩衝區或者重寫邏輯。這樣就可以形成拒絕服務、破壞數據或者在遠程服務器上執行惡意代碼。
防止緩衝區溢出攻擊的唯一方法是
檢查全部用戶輸入的長度
if ($_POST['submit'] == 「go」){
$name = substr($_POST['name'],0,40);
}
?>
$_SERVER['PHP_SELF'];?>」 method=」post」>
Name
「name」 id=」name」 size=」20″ maxlength=」40″/>
if ($_POST['submit'] == 「go」){
$name = substr($_POST['name'],0,40);
$name = cleanHex($name);
}
function cleanHex($input){
$clean = preg_replace(」![\][xX]([A-Fa-f0-9]{1,3})!」, 「」,$input);
return $clean;
}
PHP 提供了 strip_tags() 函數,這個函數能夠清除任何包圍在 HTML 標記中的內容。strip_tags() 函數還容許提供容許標記的列表,好比
if ($_POST['submit'] == 「go」){
$name = strip_tags($_POST['name']);
$name = substr($name,0,40);
$name = cleanHex($name);
}
function cleanHex($input){
$clean = preg_replace\
(」![\][xX]([A-Fa-f0-9]{1,3})!」, 「」,$input);
return $clean;
}
從安全的角度來看,對公共用戶輸入使用 strip_tags() 是必要的。若是表單在受保護區域(好比內容管理系統)中,並且您相信用戶會正確地執行他們的任務(好比爲 Web 站點建立 HTML 內容),那麼使用 strip_tags() 多是沒必要要的,會影響工做效率。
Web 的好處是能夠分享信息和服務。壞處也是能夠分享信息和服務,由於有些人作事毫無顧忌。 以表單爲例。任何人都可以訪問一個 Web 站點,並使用瀏覽器上的 File > Save As 創建表單的本地副本。而後,他能夠修改 action 參數來指向一個徹底限定的 URL(不指向 formHandler.php,而是指向http://www.yoursite.com/formHandler.php,由於表單在這個站點上),作他但願的任何修改,點擊 Submit,服務器會把這個表單數據做爲合法通訊流接收。 首先可能考慮檢查 $_SERVER['HTTP_REFERER'],從而判斷請求是否來自本身的服務器,這種方法能夠擋住大多數惡意用戶,可是擋不住最高明的黑客。這些人足夠聰明,可以篡改頭部中的引用者信息,使表單的遠程副本看起來像是從您的服務器提交的。 處理遠程表單提交更好的方式是,根據一個唯一的字符串或時間戳生成一個令牌,並將這個令牌放在會話變量和表單中。提交表單以後,檢查兩個令牌是否匹配。若是不匹配,就知道有人試圖從表單的遠程副本發送數據。 要建立隨機的令牌,可使用 PHP 內置的 md5()、uniqid() 和 rand() 函數,以下所示: 清單 18. 防護遠程表單提交 [php] session_start(); if ($_POST['submit'] == 「go」){ //check token if ($_POST['token'] == $_SESSION['token']){ $name = strip_tags($_POST['name']); $name = substr($name,0,40); $name = cleanHex($name); }else{ } } $token = md5(uniqid(rand(), true)); $_SESSION['token']= $token; function cleanHex($input){ $clean = preg_replace(」![\][xX]([A-Fa-f0-9]{1,3})!」, 「」,$input); return $clean; } ?>