2016-10-06 6 views
-1

XSS 공격을 막기 위해 아래 코드를 사용했습니다.htmlspecialchars json_decode가 깨졌습니다.

get, post 요청을 모두 정리합니다. 괜찮 았어.

하지만 지금은 문제가 발생합니다. 코드에는 json_decode를 사용하는 곳이 많이 있습니다.
예 : 하나 개의 위치에 난 json_encoded 후 변수를 가지고, 그것을 디코딩하기 전 코드 아래 사용해야 : 단순히 json_decode($_POST['fields'],true);를 사용하는 경우 $_POST['fields'] 데이터가 반드시 htmlspecialchars을 사용하여 암호화되기 때문에

$objclass->fields = json_decode(html_entity_decode($_POST['fields'], ENT_QUOTES, 'UTF-8'),true); 

다음은 실패 할 것이다.

그래서 은 html_entity_decode을 구현하지 않고도 직접 작동 할 수 있습니까?

+1

HTML 태그로 포장 된 JSON 데이터를 어떤 이유로 전송하고 있습니까? 그렇지 않으면 그것을 보낼 때 그것을 벗어나지 마십시오. 또한, 거기에가는 길에 '청소'데이터가 필요가 없습니다. –

+0

예, 나는 HTML을 반환 yii에 확장을 만들었습니다. – DS9

+0

들어오는 모든 요청에 ​​대해 "htmlspecialchars"를 자동으로 실행하면 안됩니다. 특정 경우 (HTML 인쇄시)에만 데이터를 "정리"할 것이지만 다른 경우에는 그것을 망칠 것입니다. 관련성이있는 순간에 데이터를 이스케이프 처리해야합니다 (HTML로 인쇄하기 전에, SQL 쿼리 전에 등). –

답변

0

아니요, 방법이 없습니다. 모든 요청 데이터에 htmlspecialchars()을 적용하는 경우 원시 양식으로 되돌리려면 html_entity_decode()을 사용해야합니다.

이 기술은 같은 방식으로 나쁘다 magic quotes 나쁘다. 나는 그것을 사용하지 않는 것이 좋습니다. 대신 템플릿 엔진을 사용하고 필요할 때 개별 변수를 이스케이프 처리하십시오.

+0

실제로 프로젝트는 거대합니다. 각 변수에 대해 프로젝트를 추가합니다. 그것이 우리가 모든 요청 데이터에 대해 추가 한 이유입니다. – DS9

+0

템플릿 엔진을 사용하면이 문제가 사라집니다. 이스케이프 처리없이 렌더링하기 때문에 수동으로 이스케이프 처리하거나 HTML을 데이터베이스에 저장할 필요가 없습니다. 어떤 이유로 든 처리 할 수 ​​없다면 나는 당신이 멍청한 코드에 빠져 있을까 봐 걱정됩니다. – ShiraNai7

+0

빌드 된 json_decode 함수에서 무엇을 재정의합니까? – DS9