2014-05-24 3 views
2

XSS (교차 사이트 스크립팅) 공격을 방지하기 위해 HTML 자리 표시 자 텍스트로 HTML 이스케이프 처리하는 것이 HTML 템플릿 엔진에서 매우 좋습니다. StringTemplate에서이 동작을 수행 할 수 있습니까?StringTemplate에서 HTML을 기본적으로 이스케이프 처리하는 방법은 무엇입니까?

내가 등록을 시도 정의 AttributeRendererformat"raw"가 아닌 HTML을 탈출하는 :

stg.registerRenderer(String.class, new AttributeRenderer() { 
    @Override 
    public String toString(Object o, String format, Locale locale) { 
     String s = (String)o; 
     return Objects.equals(format, "raw") ? s : StringEscapeUtils.escapeHtml4(s); 
    } 
}); 

그러나이 경우 StringTemlate뿐만 아니라 자리 표시 자 텍스트뿐만 아니라 템플릿 텍스트 자체를 빠져 있기 때문에 실패합니다. 예를 들어이 템플릿 :

<html> 
    <head> 
     <title>Example Title</title> 
    </head> 
    <body> 
     <p>Not escaped because of <code>format = "raw"</code>.</p> 
    &lt;/body&gt; 
&lt;/html&gt; 

아무도 도와 드릴까요 :

example(title, content) ::= << 
    <html> 
     <head> 
      <title>$title$</title> 
     </head> 
     <body> 
      $content; format = "raw"$ 
     </body> 
    </html> 
>> 

은 다음과 같이 표현되어 있습니까?

답변

0

답변은 StringTemplate v3으로 되돌려 야합니다.

0

기본적으로 인 을 인코딩하는 좋은 해결책은 없습니다. 템플리트는 문자열 데이터 유형에 대한 AttributeRenderer를 통해 전달되며 템플리트 또는 변수를 처리 중인지 여부를 감지 할 컨텍스트 정보가 없습니다. 따라서 템플리트에 "원시"를 지정할 수 없으므로 템플리트를 포함하여 모든 문자열이 기본적으로 인 코드됩니다.

대안 솔루션은 인코딩해야 할 변수에 format="xml-encode"을 사용하는 것입니다.

  • 낮은

    • 을 URL 인코딩
    • XML 인코딩

    그래서 예는 다음과 같습니다 내장 StringRenderer는 여러 가지 형식을 지원한다 :

    example(title, content) ::= << 
        <html> 
         <head> 
          <title>$title; format="xml-encode"$</title> 
         </head> 
         <body> 
          $content$ 
         </body> 
        </html> 
    >> 
    

    을 기본값으로으로 인코딩하려면 옵션이 제한되어 있습니다. 대안은 다음과 같습니다 : 사용자 정의 데이터 유형에 대한 귀하의 HtmlEscapeStringRenderer을 등록 할 수 있도록

    1. , 당신의 변수에 대한 사용자 정의 데이터 형식 (안 String)를 사용합니다. 복잡한 문자열을 이미 표준 문자열을 사용하는 변수로 사용하면이 작업이 어렵습니다.
    2. 모델에 원시 및 이스케이프 된 변수를 수동으로 추가합니다 (예 : title (이스케이프 됨) 및 title_raw (원시)을 추가하십시오. 이 경우 사용자 정의 AttributeRenderer가 필요하지 않습니다. StringTemplate에는 엄격한 뷰/모델 분리가 있으며 원시 및 이스케이프 값으로 렌더링되기 전에 모델을 채워야합니다.

    어느 옵션도 특히 바람직하지 않지만 StringTemplate4에서는 다른 대안이 표시되지 않습니다.

  • +0

    물론,'format = "xml-encode"'를 추가하는 것을 잊기 쉽습니다. 그래서 내 질문은 기본적으로 ** 인코딩을 가능하게하는 방법이었습니다 **. – dened

    관련 문제