7.1. 暴力攻擊
暴力攻擊是一種不使用任何特殊手段而去窮盡各種可能性的攻擊方式。它的更正式的叫法是窮舉攻擊——窮舉各種可能性的攻擊。
對於訪問控制,典型的暴力攻擊表現為攻擊者通過大量的嘗試去試圖登入系統。在多數情況下,使用者名稱是已知的,而只需要猜測密碼。
儘管暴力攻擊沒有技巧性可言,但詞典攻擊似乎有一定的技巧性。最大的區別是在進行猜測時的智慧型化。詞典攻擊只會最可能的情況列表中進行窮舉,而不像暴力攻擊一樣去窮舉所有的可能情況。
防止進行驗證嘗試或限制允許錯誤的次數還算是乙個比較有效的安全手段,但是這樣做的兩難之處在於如何在不影響合法使用者使用的情況下識別與阻止攻擊者。
在這種情況下,對一致性的判定可以幫助你區分二者。這個方法與第四章中所述的防止會話劫持的做法很相似,但區別是你要確定的是乙個攻擊者而不是乙個合法使用者。
考慮下面的html表單:
code:
攻擊者會察看這個表單並建立一段指令碼來post合法的資料給
使這段指令碼,攻擊者還可以簡單地加入乙個迴圈來繼續嘗試不同的密碼,並在每次嘗試後檢查$http_response變數。一旦$http_response變數有變化,就可以認為猜測到了正確的密碼。
你可以通過很多安全措施去防止此類攻擊。我們注意到,在暴力攻擊中每次的http請求除了密碼是不同的,其他部分完全相同,這一點是很有價值的。
儘管在超過一定數量的失敗嘗試後臨時凍結帳號是一種有效的防範手段,但你可能會去考慮採用更確定的方式去凍結帳號,以使攻擊者更少地影響合法使用者對你的應用的正常使用。
還有一些流程也可以增大暴力攻擊的難度,使它不太可能成功。乙個簡單的遏制機制就能有效地做到這一點:
code:
<?php
/* mysql_connect() */
/* mysql_select_db() */
$clean = array();
$mysql = array();
$now = time();
$max = $now - 15;
$salt = 'shiflett';
if (ctype_alnum($_post['username']))
else
$clean['password'] = md5($salt . md5($_post['password'] . $salt));
$mysql['username'] = mysql_real_escape_string($clean['username']);
$sql = "select last_failure, password
from users
where username = ''";
if ($result = mysql_query($sql))
elseif ($record['password'] == $clean['password'])
else
'";mysql_query($sql);}}
else
}else
?>
上例會限制在上次驗證失敗後對同一使用者再試嘗試的頻率。如果在一次嘗試失敗後的15秒內再次嘗試,不管密碼是否正確,驗證都會失敗。這就是這個方案的關鍵點。但簡單地在一次失敗嘗試後15秒內阻止訪問還是不夠的——在此時不管輸入是什麼,輸出也會是一致的,只有在登入成功後才會不同。否則,攻擊者只要簡單地檢查不一致的輸出即可確定登入是否成功。
php 安全基礎 第七章 驗證與授權
很多web應用被其糟糕的身份驗證與授權機制所困擾。本章主要討論相關這些機制的漏洞,傳授一些幫助你不犯通病的方法。我將通過一些例子進一步說明這些方法,但請注意不要把這些示例與其上下文割裂開來看,理解其中包含的原則和方法是很重要的。只有到那個時候你才能對它們進行正確運用。通過驗證我們可以確定乙個使用者的...
第七章 網路安全設計
第七章 網路安全設計 1.網路安全體系結構?結合分層模型,每一層結構 協議 威脅 三維圖 安全機制 設計原則 之間的關係 安全模型是什麼 設計原則 iatf 資訊保障技術框架 標準強調人 技術和操作三個核心原則,iatf模型最重要的設計思想是在網路中進行不同等級的區域劃分與網路邊界保護。安全模型 在...
第七章 巨集與列舉
規則7 1 1 用巨集定義表示式時,要使用完備的括號。說明 m為巨集只是簡單的 替換,不會像函式一樣先將引數計算後,再傳遞。示例 如下定義的巨集都存在一定的風險。反例 若有除法運算,c a b計算錯誤 define rectangle area a,b a b a 1 b 1計算錯誤 define ...