최신 브라우저에서 JSON 하이재킹이 여전히 문제가됩니까?
Backbone.js와 Tornado 웹 서버를 사용하고 있습니다. Backbone에서 컬렉션 데이터를 수신하는 표준 동작은 JSON 배열로 전송하는 것입니다.
반면 토네이도의 표준 동작은 다음과 같은 취약점으로 인해 JSON 어레이를 허용하지 않는 것입니다.
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
관련있는 것은 : http://haacked.com/archive/2009/06/25/json-hijacking.aspx
JSON이 실제로 객체 목록 일 때 객체를 묶을 필요가없는 것이 더 자연스러운 느낌입니다.
최신 브라우저 (예 : 현재 Chrome, Firefox, Safari 및 IE9)에서 이러한 공격을 재현 할 수 없었습니다. 동시에 현대 브라우저가 이러한 문제를 해결했다는 것을 어디에서나 확인할 수 없었습니다.
가능한 프로그래밍 기술이나 인터넷 검색 기술에 의해 오도되지 않도록하려면 :
오늘날 JSON 브라우저에서 이러한 JSON 하이재킹 공격이 여전히 문제가됩니까?
(참고 : 중복 가능성에 대해 죄송합니다 : 최신 브라우저에서 'JSON 하이재킹'을 수행 할 수 있습니까? 하지만 허용 된 답변이 질문에 대답하지 않는 것 같습니다. 다시 질문하고 더 명확한 설명을 얻을 시간이라고 생각했습니다. .)
아니요, 더 이상 Firefox 21, Chrome 27 또는 IE 10에서 []
또는 {}
생성자에 전달 된 값을 캡처 할 수 없습니다 . http://www.thespanner.co.uk에 설명 된 주요 공격을 기반으로 한 약간의 테스트 페이지가 있습니다 . / 2011 / 05 / 30 / json-hijacking / :
( http://jsfiddle.net/ph3Uv/2/ )
var capture = function() {
var ta = document.querySelector('textarea')
ta.innerHTML = '';
ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments)));
return arguments;
}
var original = Array;
var toggle = document.body.querySelector('input[type="checkbox"]');
var toggleCapture = function() {
var isOn = toggle.checked;
window.Array = isOn ? capture : original;
if (isOn) {
Object.defineProperty(Object.prototype, 'foo', {set: capture});
} else {
delete Object.prototype.foo;
}
};
toggle.addEventListener('click', toggleCapture);
toggleCapture();
[].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) {
el.addEventListener('click', function() {
document.querySelector('textarea').innerHTML = 'Safe.';
eval(this.value);
});
});
<div><label><input type="checkbox" checked="checked"> Capture</label></div>
<div><input type="button" value="[1, 2]" /> <input type="button" value="Array(1, 2);" /> <input type="button" value="{foo: 'bar'}" /> <input type="button" value="({}).foo = 'bar';" /></div>
<div><textarea></textarea></div>
짧은 형식과 긴 형식을 통해 배열과 객체를 초기화 window.Array
하고 setter를 재정의 하고 추가 Object.prototype.foo
합니다.
ES4 사양은 , 섹션 1.5에서 구현 전례와 노트 "새로운 객체와 배열 초기화에 대한 객체를 구성하는 데 사용되는 객체와 배열의 글로벌 표준 바인딩을 필요로"인터넷 익스플로러 6, 오페라 9.20 및 Safari 3 할 일 "그 "Object 및 Array의 로컬 또는 전역 리 바인딩을 존중하지 않고 원래 Object 및 Array 생성자를 사용하십시오." 이것은 ES5 섹션 11.1.4 에서 유지됩니다 .
Allen Wirfs-Brock 은 ES5는 DefineOwnProperty를 사용하기 때문에 객체 초기화가 setter를 트리거하지 않아야한다고 명시하고 있다고 설명 했다. MDN : Objects를 사용한 작업 은 "JavaScript 1.8.1부터는 객체 및 배열 이니셜 라이저에서 속성을 설정할 때 setter가 더 이상 호출되지 않습니다"라고 말합니다. 이것은 V8 문제 1015 에서 해결되었습니다 .
참고 URL : https://stackoverflow.com/questions/16289894/is-json-hijacking-still-an-issue-in-modern-browsers
'development' 카테고리의 다른 글
Objective-C 용 JSON 구문 분석기 (JSON 프레임 워크, YAJL, TouchJSON 등) 비교 (0) | 2020.06.20 |
---|---|
감사 로깅을위한 데이터베이스 디자인 (0) | 2020.06.20 |
로그인 양식에 CSRF 공격에 대한 토큰이 필요합니까? (0) | 2020.06.20 |
잘못된 MIME 유형으로 인해 Chrome에서 AJAX 스크립트 실행을 거부합니다. (0) | 2020.06.20 |
iPad Web App : Safari에서 JavaScript를 사용하여 가상 키보드 감지? (0) | 2020.06.20 |