這不是一個好主意,只是抓住頁面的代碼副本,做這個。
請考慮:由於您試圖從遠程服務器執行一段代碼,因此會出現內容安全策略錯誤。雖然您可以放寬政策,但讓我先解釋一下爲什麼這是一個安全問題。
目前,您的代碼加載http://dota2.cyborgmatt.com/prizetracker/data/ti4.json
和執行內容,未經覈實它們是什麼。現在它看起來是這樣的:
populatePrizePool({"dollars":3129676});
但是:這是一個網站,你不用管。
想象一下:你寫你的擴展,它變得受歡迎,該網站通知管理員的異常流量,改變他們的代碼加載http://dota2.cyborgmatt.com/prizetracker/data/ti4_.json
代替,有點谷歌搜索後,用此代替原來的鏈接的內容:
alert("By the way, Ramana Venkata is stealing our data. Sincerely, cyborgmatt.com");
突然,你的分機不起作用,你有一羣憤怒的用戶,並且有點尷尬。
你看到問題了嗎?它可能更糟糕,因爲替換代碼可能和JS允許的一樣邪惡。由於HTTP流量攔截微不足道,它甚至不會讓cyborgmatt.com管理員在您的擴展中注入任意代碼,這就是爲什麼以這種方式放鬆策略是不可能的。
現在來解決問題。代替AJAX加載代碼,您應該加載此文件,解析它以獲取JSON數據(即{"dollars":3129676}
),安全地解析並驗證該數據,然後才能使用它。這樣,如果上述情況發生,至少沒有什麼邪惡來臨。
第1步:獲取數據。
與XHR更換$.ajax
呼叫:
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
if (xhr.readyState == 4) {
parseAndValidate(xhr.responseText);
}
};
xhr.open("GET", "http://dota2.cyborgmatt.com/prizetracker/data/ti4.json", true);
xhr.send();
步驟2:分析和驗證。
您有一個字符串,您期望具有以下格式:populatePrizePool(SOME_JSON);
,並且您希望JSON數據包含非負數dollars
。
function parseAndValidate(str){
var some_json;
// First, extract `SOME_JSON` with a regular expression:
if(str.match(/populatePrizePool\((.*)\);/)) {
some_json = str.match(/populatePrizePool\((.*)\);/)[1];
} else {
throw Error("Unexpected format for ti4.json");
}
// Second, _safely_ parse `some_json`:
var data = JSON.parse(some_json); // Will throw an exception if something's not right
// Third, ensure that the JSON has the required data:
if(!data.dollars || typeof data.dollars !== "number" || data.dollars < 0) {
throw Error("Unexpected data format for ti4.json");
}
// Finally, call the function:
populatePrizePool(data);
}
這對您的小項目可能有點矯枉過正,但這是一種學習體驗。不要盲目信任你無法控制的數據,甚至更少的代碼不能控制。
來源
2014-05-11 12:26:11
Xan
有沒有其他方法可以使這項工作? –
@RamanaVenkata在這種情況下,是的:只需使用HTTPS版本的資源。我已經添加了關於此的新信息。 – apsillers
實際上該網站的https版本目前無法正常工作。有沒有什麼不同的方法來注入腳本? –