簡體   English   中英

JSON安全最佳實踐?

[英]JSON security best practices?

在研究JSON與XML的問題時,我遇到了這個問題 現在,偏好JSON的原因之一被列為Javascript中的轉換易用性,即使用eval() 從安全角度來看,這立刻讓我感到有些問題。

所以我開始對JSON的安全方面進行一些研究,並在博客文章中討論JSON如何不像人們想象的那樣安全 這部分突出:

更新:如果您正確地執行JSON 100%,那么您將只有頂級對象。 數組,字符串,數字等都將被包裝。 然后,JSON對象將無法使用eval(),因為JavaScript解釋器會認為它正在查看塊而不是對象。 這對於防止這些攻擊有很長的路要走,但最好用不可預測的URL來保護您的安全數據。

好的,這是一個很好的規則:頂層的JSON對象應始終是對象,而不是數組,數字或字符串。 聽起來對我來說是一個很好的規則。

在涉及JSON和AJAX相關的安全性時還有什么可做的或避免的嗎?

上面引用的最后一部分提到了不可預測的URL。 有沒有人有更多的信息,特別是你如何在PHP中做到這一點? 我在Java方面比PHP更有經驗,在Java中它很容易(因為你可以將一系列URL映射到單個servlet),而我所做的所有PHP都已經將一個URL映射到PHP腳本。

另外,您如何使用不可預測的URL來提高安全性?

針對JSON的攻擊有很多,特別是XSRF。

當Web服務使用cookie進行身份驗證時,會發生此漏洞,並使用包含敏感數據的JSON數組進行響應以響應GET請求。

如果攻擊者可以欺騙登錄服務的用戶naive-webapp.com訪問他們的網站(或嵌入他們控制的IFRAME的任何網站,例如通過嵌入式廣告),那么他們可以插入一個<script>標簽一個SRC到naive-webapp.com,並可能竊取用戶的數據。 這取決於JavaScript Array構造函數的javascript怪癖,如下所示:

 <script>
   // Overload the Array constructor so we can intercept data
   var stolenArrays = [];
   var RealArray = Array;
   Array = function () {
     var arr = RealArray.apply(arguments);
     stolenArrays.push(arr);
     return arr;
   }
 </script>
 <!-- even though the attacker can't access the cookies,
   - he can cause the browser to send them to naive-webapp.com -->
 <script src="//naive-webapp.com/..."></script>
 <script>
   // now stolenArrays contains any data from the parsed JSON
 </script>

EcmaScript 5修復了導致[]在全局對象上查找Array的混亂行為,並且許多現代瀏覽器不再容易受到此攻擊。

順便提一下,Oil對於不可預測的URL是錯誤的。 URL中的密碼安全隨機標識符是保護資源的好方法。 基於身份的安全性不是石油所暗示的靈丹妙葯。 有關安全分布式應用程序方案的示例,請參閱http://waterken.sourceforge.net/ ,該方案基於URL中的加密安全標識符,不需要身份概念。

編輯:

在考慮JSON與XML時,您也應該了解XML特定的攻擊向量。

XXE ,XML外部實體攻擊,使用精心設計的XML通過防火牆訪問文件系統和網絡資源。

 <!DOCTYPE root [ <!ENTITY foo SYSTEM "file:///c:/winnt/win.ini"> ]> ... <in>&foo;</in> 

應用程序將輸入(參數“in”,其中包含win.ini文件)嵌入到Web服務響應中。

博客(CSRF)的主要安全漏洞不是JSON特有的。 使用XML代替它是一個很大的漏洞。 實際上,它完全沒有異步調用一樣糟糕; 常規鏈接同樣容易受到攻擊。

當人們談論唯一的URL時,他們通常不是指http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement 相反,在請求中使用其他獨特的東西更為常見; 即FORM帖子中的值或URL參數。

通常這涉及在服務器端插入FORM中的隨機令牌,然后在發出請求時進行檢查。

數組/對象對我來說是新聞:

腳本標簽:攻擊者可以嵌入一個指向遠程服務器的腳本標簽,瀏覽器將有效地為您回復eval(),但是它會丟棄響應,因為JSON都是響應,所以您是安全的。

在這種情況下,您的站點根本不需要使用JSON來容易受到攻擊。 但是,如果攻擊者可以將隨機HTML插入您的網站,那么您就是敬酒。

使用不可預測的URL保護您的安全數據仍然是最好的

強調我的。 胡說些什么! 最好通過一些適當的身份驗證來保護您的安全數據,並且可能還需要一些加密。 JSON交換仍然可以使用現有的身份驗證技術(例如,通過cookie的會話)和SSL。

當你使用JSON將數據導出到匿名第三方(例如Web服務)時,依賴於某人不猜猜URL(他們實際談論的內容)將只是一種合理的技術(當時只是這樣) 。 一個例子是谷歌的各種網絡服務API,其中匿名用戶通過其他網站訪問谷歌數據。 他們使用域名引薦來源和API密鑰來確保允許中間人網站提供Gooogle數據。

如果您只是使用JSON向直接的已知用戶代理發送私有數據,請使用一些真正的身份驗證和加密。 如果您正在嘗試提供Web服務,那么它實際上取決於此數據的“安全性” 如果它只是公共數據而您不介意誰可以閱讀它,我認為制作一個無效的URL沒有意義。


編輯:為了證明他們的意思,請考慮這一點。 想象一下,您的銀行提供了一個用於獲取語句的JSON API。 如果我可以輸入http://yourbank.com/json-api/your-name/statement ,您可能不會感到高興。

他們可以為您的帳戶生成任何JSON請求所需的唯一字符串,例如:http: http://yourbank.com/json-api/your-name/big-long-key-unique-to-you/statement

我的猜測能力要小得多。 但是你真的希望這是你真正安全的數據和潛在身份竊賊之間的唯一緩沖嗎? 沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM