簡體   English   中英

安全地為JavaScript提供JSON和HTML

[英]Serving JSON and HTML securely to JavaScript

我正在考慮向JavaScript提供HTML和JSON的安全方法。 目前我只是輸出JSON,如:

 ajax.php?type=article&id=15 
{
 "name":    "something",
 "content": "some content"
}

但我確實意識到這是一個安全風險 - 因為文章是由用戶創建的。 因此,有人可以為內容插入腳本標記(只是一個示例),並直接在AJAX API中鏈接到他的文章。 因此,我現在想知道防止此類問題的最佳方法是什么。 一種方法是從輸入中編碼所有非字母數字字符,然后在JavaScript中解碼(並在放入某處時再次編碼)。

另一種選擇可能是發送一些強制瀏覽器永遠不會呈現AJAX API請求響應的標頭( Content-TypeX-Content-Type-Options )。

如果將Content-Type設置為application/json那么NO Browser將在該頁面上執行JavaScript。 這是RFC-4627的一部分 ,Google使用它來保護自己。 其他Application/內容類型遵循類似規則。

您仍然需要擔心基於DOM的XSS ,但這會對您的JavaScript造成問題,而不是json的內容。 Json的另一個更奇特的安全問題是像gmail中的這個漏洞一樣的信息泄漏。

確保始終測試您的代碼。 Sitewatch免費的xss掃描程序 ,或開源的Skipfish ,最后你可以用一個簡單的<script>alert(/xss/)</script>手動測試它。

您可能應該注意它甚至不會進入您的數據庫,而不是擔心如何在返回時對惡意代碼進行編碼。 有關阻止跨站點腳本和輸入驗證的快速谷歌搜索可能會對您有所幫助。 干杯

如果用戶必須登錄才能查看網頁,請使用相同的授權機制保護ajax.php。 然后,未登錄的客戶端無法直接訪問ajax.php來檢索數據。

我不認為你的問題是關於驗證用戶輸入,正如其他人指出的那樣。 你不想把你的JSON api提供給其他人......對嗎?

如果是這種情況那么你可以做的事情就不多了......事實上,即使你提供HTML而不是JSON,人們仍然會進行HTML抓取以從你的網站獲得他們想要的東西(這就是搜索方式引擎蜘蛛工作)。

防止抓取的一個好方法是只允許從IP地址下載特定數量的內容。 這樣,如果有人每天要求http://yoursite.com/somejson.json超過100次,你可能知道這是一個刮刀,而不是有人在一天內訪問你的頁面100次。

插入腳本標記(或SQL)只是一個問題,如果你不能確保它不是它可能是一個問題。

有人提交的評論中間的<script>標記不會損害您的服務器,也不會損害您的數據庫。 是什么傷害,如果不采取適當措施,將是一個頁面,其中包括當您隨后為它服務了評論,並達到客戶端瀏覽器。 為了防止這種情況發生,准備頁面的代碼必須確保在暴露給不知情的解釋器之前始終擦除用戶提供的內容。 在這種情況下,該無意識的解釋器是客戶端Web瀏覽器。 事實上,您的客戶端Web瀏覽器實際上涉及兩個不知情的解釋器:HTML解析器和布局引擎以及Javascript解釋器。

不知情的解釋器的另一個重要示例是您的數據庫服務器。 請注意, <script>標記(幾乎可以肯定)對數據庫無害,因為“”在SQL中沒有任何意義。 它是導致SQL出現問題的其他類型的輸入,比如字符串中的引號(對HTML頁面無害!)。

如果我不能在我的答案中加入<script>標簽,那么Stackoverflow會非常蹩腳,正如我現在所做的那樣。 SQL注入攻擊的示例也是如此。 最近有人聯系了一家美國着名銀行的一個頁面,其中一個大的<textarea>被警告包含在你輸入的任何內容中不包含字符“<”或“>”的腳注。 可以預見的是,該銀行對數百條Reddit評論進行了嘲諷,這是正確的。

具體如何“擦除”用戶提供的內容取決於您提供它的不知情的解釋器。 如果它將在HTML標記的中間被刪除,那么您必須確保“<”,“>”和“&”字符都被編碼為HTML權限。 (如果內容可能最終出現在HTML元素屬性值中,您可能也想引用字符。)但是,如果要將內容放入Javascript中,您可能不需要擔心HTML轉義,但您確實需要擔心引號,以及可能在7位范圍之外的Unicode字符。

為了從php輸出安全的html,我推薦http://htmlpurifier.org/

暫無
暫無

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

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