그냥이 작업을 수행하는 페이지의 코드의 사본을 잡기 위해 좋은 생각이 아니다.
고려 : 원격 서버에서 코드를 실행하려고하기 때문에 콘텐츠 보안 정책 오류가 발생합니다. 정책을 완화 할 수는 있지만, 먼저이 문제가 보안 문제 인 이유를 설명하겠습니다.
현재, 코드로드
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);
}
이것은 작은 프로젝트에 약간 과잉이 될 수 있지만 학습 경험입니다. 통제하지 못하는 데이터를 맹목적으로 신뢰하지 말고, 제어하지 않는 코드도 적게 신뢰하십시오.
다른 방법으로도이 작업을 수행 할 수 있습니까? –
@RamanaVenkata이 경우 yes : 자원의 HTTPS 버전 만 사용하십시오. 이에 대한 새로운 정보를 추가했습니다. – apsillers
실제로 사이트의 https 버전이 현재 작동하지 않습니다. 스크립트를 삽입하는 다른 방법이 있습니까? –