2017-08-10 78 views
1

比方說,我有我的HTML文檔中下面的腳本標籤:安全的方式

<script type="application/json" id="stuff"> 
    { 
     "unicorns": "awesome", 
     "abc": [1, 2, 3] 
    } 
</script> 

和我解析此JSON在我的應用程序。有人告訴我......

這種將json嵌入到腳本標記中的方法存在潛在的安全問題。假設json數據來源於用戶輸入,可以創建一個數據成員,該成員將實際上脫離腳本標記並允許直接注入dom。在這裏看到:

<script type="application/json" id="stuff"> 
{ 
    "unicorns": "awesome", 
    "abc": [1, 2, 3], 
    "badentry": "blah </script><div id='baddiv'>I should not exist.</div><script type="application/json" id='stuff'> ", 
} 
</script> 

我需要在腳本標籤使嵌入一個JSON,但我不知道我應該怎麼做,如果沒有泄漏安全vulnerables。

感謝您的幫助。

+0

當你在客戶端使用JavaScript時,我認爲沒有辦法阻止數據。嘗試使用後端移動安全信息,如用戶標識 – PabloWeb18

回答

2

要將JSON包含在腳本元素中,則需要確保數據不能包含結束標記。檢查任何鍵或值中的'<'是否編碼爲'\ u003c'。然後使用JSON.parse解析內容。

您還需要確保單個字符串值的數據不會轉義字符串,因此也要避免使用引號和反斜槓。

周圍的上下文也會引起問題,因爲正確的編碼可能取決於外部元素的嵌套。引號,html實體,unicode行和段落分隔符以及CDATA關閉標籤可能需要編碼。爲了安全起見,您可以將這些十六進制轉義用於任何非字母字符。

你的服務器端語言應該有這樣的JSON編碼功能。但它們並不都是爲了安全而設計的,所以請確保它編碼所有這些字符。

1

因爲JavaScript固有地在客戶端運行,所以您永遠不能相信客戶端用它做的任何事情。

所以這聽起來像用戶輸入或可能用戶輸入,就像你在服務器上做的所有事情一樣,這意味着你將不得不對任何發送給你的用戶輸入進行適當的審查。據我所知JSON.parse被認爲是體面安全的。所以發送到你的服務的任何對象都應該使用它來解析。

之後,你可能不得不做一些更多的輸入清洗。確保您在打印到瀏覽器時總是轉義HTML。