0

PlayFramework2 나는 HTML 이스케이프를 올바르게 처리 할 수있는 방법을 찾을 수 없습니다.PlayFramework2를 사용하여 JSON에서 HTML을 이스케이프 처리합니다.

템플릿 시스템에서 HTML 엔티티는 기본적으로 필터링됩니다.
그러나 Backbone.js과 함께 REST 요청을 사용하면 JSON 개체가 필터링되지 않습니다.

은 내가 문자열 내로 객체를 변환하는 play.libs.Json.toJson(myModel)를 사용합니다.
내 컨트롤러에서 응답을 보내기 위해 return ok(Json.toJson(myModel));을 사용합니다 ...하지만 여기에서는 내 모델의 속성이 보호되지 않습니다.
나는 그것을 처리 할 수있는 방법을 찾을 수는 ...

두 번째 질문 : 기본적으로
템플릿 엔진 필터 HTML 엔티티, 이것은 우리가 우리의 데이터베이스에 원료 사용자 입력을 저장할 필요가 있다는 것을 의미한다.
저장 행동입니까?

셋째 questdion : 이스케이프 문자열을 수동으로 실시하는 기능이 PlayFramework에
있습니까? 새로운 의존성을 추가하는 데 필요한 모든 것을 찾을 수 있습니다.

감사합니다. <%= attr %> 거의 그대로 렌더링하지만 <%- attr %>가 렌더링 : 사용 myBackboneModel.escape('attr'); 대신 myBackboneModel.get('attr');
Underscore.js 템플릿 시스템의 또한 옵션 것을 포함 - : 편집

:은 내가 Backbone.js에 템플릿 수준을 방법을 발견 탈출과 함께!
효율성에주의를 기울여야 만 각 렌더링에서 문자열이 다시 이스케이프됩니다. 그래서 백본 .create()를 선호해야합니다. XSS-공격 예방에

답변

2

모범 사례는 일반적으로 출력보다는 당신의 입력 추론 할 것을 권장합니다. 그 뒤에는 여러 가지 이유가 있습니다. 제 생각에 가장 중요한 것은 다음과 같습니다.

  • 데이터를 출력/렌더링하는 방법을 정확히 알지 않는 한, 이스케이프 처리에 대한 이유가 없습니다. 렌더링 방식이 다르므로 서로 다른 이스케이프 전략이 필요합니다. 제대로 이스케이프 처리 된 HTML 문자열은 Javascript 블록에서 사용하기에 충분하지 않습니다. 요구 사항과 기술이 끊임없이 변하고, 오늘날 데이터를 한 방향으로 렌더링합니다. 내일 다른 것을 사용할 수도 있습니다. HTML을 사용하지 않기 때문에 모바일 클라이언트에서 HTML 이스 케이 핑을 필요로하지 않는다고 가정 해 봅시다. 데이터 렌더링) 데이터를 렌더링하는 동안 적절한 탈출 전략에 대해서만 확신 할 수 있습니다. 이것이 현대 프레임 워크가 템플릿 엔진에 이스케이프를 위임하는 이유입니다. XSS (Cross Site Scripting) Prevention Cheat Sheet
  • 사용자의 입력을 이스케이프 처리하는 것은 사실상 파괴적이거나 손실이 많은 작업입니다. 사용자 입력을 이스케이프 처리하여 저장 공간에 보관하면 원래 입력 내용을 알 수 없습니다. 위의 모바일 클라이언트 예제를 고려하면 HTML 이스케이프 문자열을 '이스케이프 해제'할 수있는 결정적인 방법은 없습니다.

올바른 방법은 템플릿 엔진 (예 : 백본에 사용중인 Play 및 JS 템플릿 엔진)으로 이스케이프를 위임하는 것입니다. JSON에 직렬화하는 HTML 이스케이프 문자열은 필요가 없습니다. 배후에서 JSON-serializer가 JSON으로 문자열을 이스케이프 처리합니다 (예 : 문자열에 따옴표가 있으면 결과 JSON이 올바른지 확인하기 위해 제대로 이스케이프 처리됩니다. 이유는 JSON serializer이므로 적절한 JSON 렌더링에만 신경을 쓰며 HTML에 대해서는 아무것도 모르기 때문입니다. 그러나 클라이언트 측에서 JSON 데이터를 렌더링 할 때 Backbone에 사용하는 JS 템플릿 엔진에서 제공하는 기능을 사용하여 올바르게 HTML 탈출해야합니다.

또 다른 질문을 응답 : 수동으로 원시 HTML 문자열 탈출 play.api.templates.HtmlFormat을 사용할 수 있습니다 : 당신이 정말 JSON 인코더 특정 HTML 문자열을 탈출해야 할 경우

import play.api.templates.HtmlFormat 
... 
HtmlFormat.escape("<b>hello</b>").toString() 
// -> &lt;b&gt;hello&lt;/b&gt; 

를, 좋은 아이디어는 래퍼를 만들 수 있습니다 그 (것)들을 위해 RawString를 말하고 주문 Format[RawString]를 제공하고 또한 writes 방법에있는 문자열을 HTML 탈출 할 것입니다. 자세한 내용은 다음을 참조하십시오. play.api.libs.json API documentation

관련 문제