php過濾提交數據 防止sql注入***(6)

緩衝區溢出***

緩衝區溢出*** 試圖使 PHP 應用程序中(或者更精確地說,在 Apache 或底層操作系統中)的內存分配緩衝區發生溢出。請記住,您可能是使用 PHP 這樣的高級語言來編寫 Web 應用程序,但是最終還是要調用 C(在 Apache 的情況下)。與大多數低級語言一樣,C 對於內存分配有嚴格的規則。

緩衝區溢出***向緩衝區發送大量數據,使部分數據溢出到相鄰的內存緩衝區,從而破壞緩衝區或者重寫邏輯。這樣就能夠造成拒絕服務、破壞數據或者在遠程服務器上執行惡意代碼。

防止緩衝區溢出***的惟一方法是檢查所有用戶輸入的長度。例如,如果有一個表單元素要求輸入用戶的名字,那麼在這個域上添加值爲 40 的 maxlength 屬性,並在後端使用 substr() 進行檢查。清單 13 給出表單和 PHP 代碼的簡短示例。

清單 13. 檢查用戶輸入的長度

if ($_POST[’submit’] == “go”){

$name = substr($_POST[’name’],0,40);

}

?>

” method=”post”>

Name

爲 什麼既提供 maxlength 屬性,又在後端進行 substr() 檢查?因爲縱深防禦總是好的。瀏覽器防止用戶輸入 PHP 或 MySQL 不能安全地處理的超長字符串(想像一下有人試圖輸入長達 1,000 個字符的名稱),而後端 PHP 檢查會確保沒有人遠程地或者在瀏覽器中操縱表單數據。

正如您看到的,這種方式與前一節中使用 strlen() 檢查 GET 變量 pid 的長度相似。在這個示例中,忽略長度超過 5 位的任何輸入值,但是也可以很容易地將值截短到適當的長度,如下所示:

清單 14. 改變輸入的 GET 變量的長度

$pid = $_GET[’pid’];

if (strlen($pid)){

if (!ereg(”^[0-9]+$”,$pid)){

//if non numeric $pid, send them back to home page

}

}else{

//empty $pid, so send them back to the home page

}

//we have a numeric pid, but it may be too long, so let’s check

if (strlen($pid)>5){

$pid = substr($pid,0,5);

}

//we create an object of a fictional class Page, which is now

//even more protected from evil user input

$obj = new Page;

$content = $obj->fetchPage($pid);

//and now we have a bunch of PHP that displays the page

?>

注 意,緩衝區溢出***並不限於長的數字串或字母串。也可能會看到長的十六進制字符串(往往看起來像 \xA3 或 \xFF)。記住,任何緩衝區溢出***的目的都是淹沒特定的緩衝區,並將惡意代碼或指令放到下一個緩衝區中,從而破壞數據或執行惡意代碼。對付十六進制緩 衝區溢出最簡單的方法也是不允許輸入超過特定的長度。

如果您處理的是允許在數據庫中輸入較長條目的表單文本區,那麼無法在客戶端輕鬆地限制數據的長度。在數據到達 PHP 之後,可以使用正則表達式清除任何像十六進制的字符串。

清單 15. 防止十六進制字符串

if ($_POST[’submit’] == “go”){

$name = substr($_POST[’name’],0,40);

//clean out any potential hexadecimal characters

$name = cleanHex($name);

//continue processing….

}

function cleanHex($input){

$clean = preg_replace(”![\][xX]([A-Fa-f0-9]{1,3})!”, “”,$input);

return $clean;

}

?>

” method=”post”>

Name

您 可能會發現這一系列操作有點兒太嚴格了。畢竟,十六進制串有合法的用途,比如輸出外語中的字符。如何部署十六進制 regex 由您自己決定。比較好的策略是,只有在一行中包含過多十六進制串時,或者字符串的字符超過特定數量(比如 128 或 255)時,才刪除十六進制串。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章