이 질문은 여러 번 질문되었습니다. 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_key
를 eval()
에 건네 줬다.
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를 방지 할 수 있습니까?
+1 자신의 어리 석음에서 사람들을 보호 할 수는 없습니다. 잠재적으로 * "위험한"문자열을 모두 살균하는 것은 기본적으로 전혀 내용을 남기지 않습니다. – deceze
@thiefmaster 예, 이것은 다른 사람들의 잘못된 구현으로 인해 잘못 될 수 없도록 방지하기 위해 무언가를 할 수없는 회색 영역입니다. 내가 뭔가를 놓친 것 같아. 명확성을 가져 주셔서 감사합니다. – John
다른 사용자가 JavaScript 코드로 일부 데이터를 적극적으로 실행해야하는 경우에도 "잘못된 구현"이되지는 않습니다. – ThiefMaster