2013-05-17 3 views
1

이 질문은 여러 번 질문되었습니다. here, here 나는 몇 가지 테스트를하고 나는 대답 없음으로 다시 같은 질문을 강제하고있어 그 질문에 대한 답을 바탕으로PHP json_encode 및 XSS

here는 (에서 - 적어도 나에게) 올바른 것으로 보인다 참조하십시오. 피사체에 대한 나의 이해가 나쁘면 나를 교정하십시오.

JSON 응답을 출력하는 웹 앱용 API를 개발 중입니다. 서버 측 응답은 PHP에서 json_encode에 의해 처리됩니다. 이후 공개 API가 될 것이므로 API를 사용하는 개발자가 잘못된 클라이언트 측 구현으로 인해 XSS를 방지하려고합니다.

header("Content-Type: application/json", true); 
$bad = array('bad_key' => 'alert("hi");'); 
echo json_encode($bad); 

클라이언트 측에서 내가 자동으로 JSON을 받았다 구문 분석 jQuery를 AJAX를 사용하고 있습니다 : 내 테스트에 대한

나는 서버 측에서 다음을했다. 처음에는 XSS 문제가없는 것으로 보였습니다. 그 다음 나는 response.bad_keyeval()에 건네 줬다.

eval(response.bad_key); 

이 즉시 bad_key에서 문자열의 실행 결과. eval의 사용이 좋지 않으므로 피해야한다는 것을 알고 있습니다. 그러나, 그것은 내가 알고 있고 다른 개발자가 동일한 관행을 따르도록 보장 할 수는 없습니다. 이러한 시나리오를 피하려면 서버 쪽 인코딩을 수행하는 것이 좋습니다. 이를 위해 htmlspecialchars을 사용한다고 가정 해 보겠습니다.

header("Content-Type: application/json", true); 
$bad = array('bad_key' => htmlspecialchars('alert("hi");')); 
echo json_encode($bad); 

이것 그것이 alert("hi"); 클라이언트 측을 실행하지만 인해 &의 존재에 JS 코드를 분해하지 않지만. here과 같이 JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS 옵션을 사용하는 json_encode도 도움이되지 않습니다.

그런 시나리오에서 어떻게 XSS를 방지 할 수 있습니까?

답변

9

이 시나리오에서는 "XSS"를 막을 필요가 없습니다. 누군가 당신이 그를 JavaScript로 보내는 무작위 데이터를 실행할 정도로 어리 석다면, 당신이 그것에 대해 할 수있는 것은 아무것도 없다. 실제로, 당신이 그것을 막기 위해 뭔가를 벗어난다면 아마 그것을 다시 이스케이프 처리하여 다시 작동하게 만들 것입니다. 네이티브의 JSON.parse()이있는 현대적인 브라우저에서 좌절에도 불구하고 - json으로 문자열이 다소 안전 eval 구문 분석에 사용 (유효한 JSON을 보내 가정)

하는 것으로. 그러나 예제에서는 JSON을 구문 분석하는 데 사용하지 않고 임의의 데이터 문자열을 실행합니다. 누구든지 그렇게하면 코드로 실행될 수 있다는 것을 의미합니다. 따라서 XSS가 아니라 "의도 한대로 작동"합니다!

+1

+1 자신의 어리 석음에서 사람들을 보호 할 수는 없습니다. 잠재적으로 * "위험한"문자열을 모두 살균하는 것은 기본적으로 전혀 내용을 남기지 않습니다. – deceze

+0

@thiefmaster 예, 이것은 다른 사람들의 잘못된 구현으로 인해 잘못 될 수 없도록 방지하기 위해 무언가를 할 수없는 회색 영역입니다. 내가 뭔가를 놓친 것 같아. 명확성을 가져 주셔서 감사합니다. – John

+1

다른 사용자가 JavaScript 코드로 일부 데이터를 적극적으로 실행해야하는 경우에도 "잘못된 구현"이되지는 않습니다. – ThiefMaster