* 당신은 보스턴의 코드 BOS인 MA 공항에서 시애틀의 코드 SEA인 WA 공항으로 여행 중 입니다.
* 당신이 공항의 3개의 코드를 입력한 후에, 티켓 가격을 요청하는AJAX 요청이 실행될 것 입니다.
* 당신은 환승이 없는 비싼 비행기와 두 번의 환승이 있는 더 싼 또 다른 비행기가 있다는 것을 알게 될 것입니다.
* 당신의 목표는 더 싼 가격으로 환승이 없는 비행기를 얻는 것 입니다.
풀이
처음 접근 방식은 앞의 문제와 같습니다.
이 번에도 입력 폼에서 개발자도구를 실행시키면 호출하는 함수와 그 함수가 있는 자바스크립트 파일이 보입니다.
(크롬으로 바꿨어요. 근데 저 js 파일 수정은 못 하네요…파이어폭스 때와 같은 이유로…왜지…)
마찬가지로 네트워크에서 확인해보면,
function getFlights(url) { var fromField = document.getElementById('travelFrom'); if (fromField.value.length < 3 || fromField.value != 'BOS') { return; } var toField = document.getElementById('travelTo'); if (toField.value.length < 3 || toField.value != 'SEA') { return; } url = url + '&from=ajax&TRAVEL_FROM=' + encodeURIComponent(fromField.value) + '&TRAVEL_TO=' + encodeURIComponent(toField.value); if (typeof XMLHttpRequest != 'undefined') { req = new XMLHttpRequest(); } else if (window.ActiveXObject) { req = new ActiveXObject('Microsoft.XMLHTTP'); } req.open('GET', url, true); req.onreadystatechange = callback; req.send(null); } function callback() { if (req.readyState == 4) { if (req.status == 200) { var card = eval('(' + req.responseText + ')'); var flightsDiv = document.getElementById('flightsDiv'); flightsDiv.innerHTML = ''; var strHTML = ''; strHTML = ' No of Stops'; strHTML = strHTML + 'StopsPrices'; for (var i = 0; i < card.flights.length; i++) { var node = card.flights[i]; strHTML = strHTML + ''; strHTML = strHTML + card.flights[i].stops + ''; strHTML = strHTML + card.flights[i].transit + ''; strHTML = strHTML + '' + card.flights[i].price + ''; } strHTML = '' + strHTML + '
좀 길어요…;;;
내용은 앞과 비슷하니 몇가지만 확인하면 됩니다.
getFlights 함수에서는 입력 값이 BOS, SEA인지 확인을 한 후, 전과 마찬가지로 url을 만들어 AJAX 요청을 합니다.
function getFlights(url) { var fromField = document.getElementById('travelFrom'); if (fromField.value.length < 3 || fromField.value != 'BOS') { return; } var toField = document.getElementById('travelTo'); if (toField.value.length < 3 || toField.value != 'SEA') { return; } url = url + '&from=ajax&TRAVEL_FROM=' + encodeURIComponent(fromField.value) + '&TRAVEL_TO=' + encodeURIComponent(toField.value); if (typeof XMLHttpRequest != 'undefined') { req = new XMLHttpRequest(); } else if (window.ActiveXObject) { req = new ActiveXObject('Microsoft.XMLHTTP'); } req.open('GET', url, true); req.onreadystatechange = callback; req.send(null); }
그 후 callback에서 eval 함수가 다시 등장 하네요. response를 eval 함수를 통해 실행하여 그 결과를 card 변수에 저장하고 있습니다.
그 밑에서는 card의 내용을 차례대로 출력합니다.
function check() { if (document.getElementById('radio0') && document.getElementById('radio0').checked) { document.getElementById('price2Submit').value = document.getElementById('priceID0').innerHTML; return true; } else if (document.getElementById('radio1') && document.getElementById('radio1').checked) { document.getElementById('price2Submit').value = document.getElementById('priceID1').innerHTML; return true; } else { alert('Please choose one flight'); return false; } }
그 아래에 있는 check 함수는 위에 form 태그를 보면 양식이 제출될 때 호출되도록 설정되어 있습니다.
기능은 선택한 티켓을 HTML에 price2Submit의 값으로 설정하도록 되있습니다.
function check() { if (document.getElementById('radio0') && document.getElementById('radio0').checked) { document.getElementById('price2Submit').value = document.getElementById('priceID0').innerHTML; return true; } else if (document.getElementById('radio1') && document.getElementById('radio1').checked) { document.getElementById('price2Submit').value = document.getElementById('priceID1').innerHTML; return true; } else { alert('Please choose one flight'); return false; } }
비행기 가격에 대한 정보가 Response에 담겨 있는 듯 하니, 프록시 툴로 중간에서 가로채어 그 값을 수정하면 목표를 달성할 수 있을 것 같습니다.
From과 To에 각각 BOS와 SEA를 입력하고 이에 대한 Response를 프록시 툴로 보면
JSON의 형태로 넘어오는 것을 확인할 수 있습니다.
여기서 두 가격을 바꾸고 계속 진행을 합니다.
그러면 두 비행기 편의 가격은 바뀌게 되고, 환승이 없는 비행기를 선택해서 Submit하면 문제는 풀리게 됩니다.
JSON???
JavaScript 에서 주로 사용하는 하나의 데이터 저장 형식이라 생각하면 받아들이기 쉬울 것 같습니다.
데이터 교환할 때 많이 쓰이며, 텍스트 형태로 사람과 컴퓨터 모두가 읽기 쉬운 형태라고 합니다.