2012-07-09 91 views
4

爲了有一個URL友好的應用程序,我將它存儲的上下文在URL中的JSON,這給像:在URL中編碼JSON時是否存在任何XSS威脅?

http://mysite.dev/myapppage/target#?context={%22attr1%22%3A{%22target_id-0%22%3A{%22value%22%3A%223%22%2C%22label%22%3A%22Hello%22}}} 

編碼一個基本的背景:

{ 
"attr1": 
    { 
    "target_id-0": 
     { 
     "value": "3", 
     "label": "Hello" 
     } 
    } 
} 

我序列化我的對象有:

JSON.stringify(context) 

我與它反序列化

var hashParamsElements = window.location.toString().split('?'); 
hashParamsElements.shift(); // we just skip the first part of the url 
var hashParams = $.deparam(hashParamsElements.join('?')); 
var contextString = hashParams.context; 
var context = JSON.parse(contextString); 

只存儲上下文以讀取變量,其中沒有評估代碼。有人可以告訴我它是否是XSS安全的?

如果存在威脅:我該如何避免它?

+0

問題+1。我喜歡這個方法:) – Jashwant 2012-07-09 21:39:14

回答

4

這種威脅來自於使用不同的JSON解碼方法,即evalnew Function。這些代碼直接執行JS代碼,因此通過將代碼放入url中(並鏈接到它)來允許非永久性的XSS攻擊。

JSON.parse沒有這個問題,並且對這些類型的攻擊是安全的。

See also (json.org).

+0

讀者應該也看到@ josh3736的答案提出了一個有趣的觀點,可能涉及潛在的威脅! – AsTeR 2012-07-09 21:58:38

1

我沒有看到它的任何威脅。它完全安全。 JSON.parse不允許任何function運行。

另外,爲什麼使用?。如果你想給一個'真實'的網址,使用hashbang來代替。

+0

我正在使用'?'避免與真正的「hashtag」之間的所有錯誤 – AsTeR 2012-07-09 21:49:14

2

label最終會插入到DOM的某處嗎? (IE,$('#something').html(context.attr1.target_id-0.label)

然後我可以把<script>...</script>放在label,這裏有你的XSS。

+0

+1非常聰明的點,我接受@ copy的答案,嚴格來說,這是我的問題的答案。 – AsTeR 2012-07-09 22:00:18

相關問題