2011-05-20 74 views
14

我正在使用的項目,使用AJAX調用頁面上的每個鏈接,更具體地說,除了登錄以外,提交的每個表單都通過AJAX提交,並且在那裏有點json和xml,我的問題是,這有什麼安全風險?所有的服務器端代碼都是PHP,並且所有內容都正確轉義。Ajax安全問題和可能的攻擊

+0

數據使用GET或POST發送? – Tadeck 2011-05-20 01:22:39

+0

如何檢查ajax請求是否來自經過身份驗證的用戶? (並沒有欺騙) – Mel 2011-05-20 01:24:48

+0

@Tadeck:這有什麼關係嗎? – zerkms 2011-05-20 01:25:11

回答

13

AJAX中沒有特定的東西。這只是您的瀏覽器執行的請求。這只是一般的HTTP請求,應該像其他任何HTTP請求一樣保護,無論其XHR性質如何。

+2

AJAX請求攜帶證件,因此向Ajax開放服務可能也會向XSRF開放它們。 – 2011-05-20 02:46:25

+5

@Mike Samuel:呃,什麼?! Ajax請求不比「正常」請求更脆弱,僅僅是因爲**它是相同的事情**。順便說一句,感謝downvote。等待你的證明。 – zerkms 2011-05-20 02:47:28

+0

@zerkms,https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project列出XSRF爲5號的OP的環境是PHP的服務器上,JS在客戶端通過Ajax提交的所有數據上。 OP規定,他們妥善逃生,防止客戶遭到破壞。那是什麼留下的?服務器權限被濫用。因此,直到/除非服務器需要XSRF令牌並且所有承擔AJAX呼叫的權限都提供這些令牌,否則它們仍然容易受到XSS的影響。 – 2011-05-20 04:14:41

2

人們普遍認爲,沒有必要使用XSRF標記來保護僅通過GET公開數據並通過cookie授權用戶的服務。

這是不正確的。當輸出是JSON數組時,這些漏洞通常具有AJAX特定的XSSI漏洞。

考慮一個服務/getfriends,返回數據如[ { "name": "Alice" }, { "name": "Bob" } ]

一個攻擊頁面可以做

<script> 
    var stolenData; 
    var RealArray = Array; 
    Array = function() { 
    return stolenData = new RealArray(); 
    }; 
</script> 
<script src="https://naivedomain.com/getfriends" type="text/javascript"></script> 

和第二<script>標籤加載的JSON跨域與用戶的cookie 因爲ECMAScript中3怪癖(固定的EcmaScript 5.0和現代ES 3口譯)該頁面可能會讀取被盜數據,因爲JavaScript解析器在解析JSON響應中的[...]時調用了重寫的Array構造函數。

除了普通的基於cookie的方法之外,通過XSRF令牌保護這些服務解決了問題,如不允許GET,通過自定義頭進行授權以及包含解析斷言器。解析斷言者通過使響應無效的JSON工作,例如返回throw 0; [{ "name": "Alice" }, { "name": "Bob" }],因此XHR客戶端可以剝離throw 0;前綴,但通過<script>加載的客戶端不能。

最後,由於JavaScript解析器將加載的腳本解析爲程序,因此這僅影響返回JSON數組的服務。返回{ "names": ["Alice", "Bob"] }/getfriend服務將不會受到攻擊,因爲該內容不是有效的程序 - 它被解析爲具有無效標籤的塊。但是像{ names: [ "Alice", "Bob" ] }這樣的無效JSON很脆弱,因爲這是一個有效的程序。

+0

哦,酷,從來不知道,甚至不相信它會工作:-S – zerkms 2011-05-21 01:10:15

+0

@zerkms,允許這種規範語言是在11.1節。4讀取「生產ArrayLiteral:[Elisionopt ]」的數組初始化程序的計算方法如下: 1.讓數組成爲創建新對象的結果,就像通過表達式new Array()一樣,但是在EcmaScript 5讀取「讓數組成爲創建一個新對象的結果,就好像使用'new Array()'表達式一樣,其中'Array'是具有該名稱的標準內置構造函數。 – 2011-05-21 02:27:36

+0

@zerkms,請參閱http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx以獲得更好的文章。 – 2011-05-21 02:33:21

0

Ajax違反有關POST數據中保留字符轉義百分比的安全規則。純粹而簡單,這允許將敵對代碼直接注入到SQL模式中,這可以是諸如PHP代碼之類的東西,用於稍後在主機上檢索和執行。直到AJAX開始轉義所有保留的GET和POST字符,正如普通瀏覽器對錶單所做的那樣,在沒有完全掃描每個惡意代碼段的通信的情況下,它不會被信任。