2011-05-04 3 views
12

jspx를 템플릿 엔진으로 사용합니다. 우리는 $ {user.firstName} 또는 "$ {mail.subject}"와 같은 수백 개의 엘 표현식을 가진 화면을 가지고 있습니다.JSP/JSPX에서 HTML 엔티티를 탈출하십시오 : 존재하지 않아야하는 문제에 대한 해결책이 없습니까?

그리고이 HTML 코드는 기본적으로 이스케이프되지 않습니다. . - 필드에 "이 < 뭔가를 할 수 또는 것입니다 경우 화면이 실패합니다 우리는 항상 FN 사용할 수 있습니다 : escapeXml하지만 정말 지루한 모든 장소에서 그렇게을

1) 합니까 기본적으로 탈출 할 수있는 방법이있다. ?

내가 아는 유일한 방법은 (바람둥이에 대한 벽옥 같은) JSP 컴파일러를 해킹하는 것입니다.하지만 갈 수있는 방법이 아니다.

누군가가 엘의 이스케이프 HTML을 이제까지 필요로 할 수 있습니다 왜

2) ? 보관 HTML 템플릿 외부 (예 : 데이터베이스)는 좋은 방법이 아닙니다.

3) 템플릿 엔진이 자동으로 처리해야한다고 확신합니다 (XSLT 에서처럼). 왜 사용자가 신경 써야합니까? 수동 이스케이프 (fn : escapeXml)는 SQL 매뉴얼 이스케이프 처리 (JDBC setParam 대신 사용)와 같은 냄새가납니다. 상용구 코드 및 SQL 삽입 (이 경우에는 사이트 간 스크립팅)을위한 좋은 장소입니다.

답변

10

1) 기본적으로 이스케이프를 수행 할 수있는 방법이 있습니까?

빈티지 JSP에는 없습니다. 그러나 Facelets의 후계자 인 Facelets는 기본적으로 이스케이프 처리됩니다. 이스케이프를 사용 중지하는 유일한 방법은 #{bean.foo} 대신 <h:outputText value="#{bean.foo}" escape="false" />을 사용하는 것입니다.


2) 왜 누군가가 이제까지 엘에서 이스케이프 HTML을해야 할 수 있습니다? (예를 들어, 데이터베이스에서) 템플릿 외부에 HTML을 저장하는 것은 좋은 습관이 아닙니다.

저장 sanitized HTML은 일반적으로 수행되는 것 이상입니다. 예 : <p>, <b>, <i> 등과 같은 무의미한 HTML 태그의 작은 하위 집합을 허용하기 위해 on* 속성이 이미 제거되었습니다.


3) 나는 그것이 XSLT에서 수행으로 템플릿 엔진 (자동으로 처리해야 확신), 그것에 대해 왜해야 사용자 관리? 수동 이스케이프 (fn : escapeXml)는 SQL 매뉴얼 이스케이프 (JDBC setParam 대신 사용됨)와 같은 냄새가납니다. 상용구 코드 및 SQL 삽입 (이 경우 사이트 간 스크립팅)을위한 좋은 장소입니다.

JSP는 고대의 뷰 기술입니다. 실제로 유연한 템플릿 엔진이 아닙니다.

SQL 주입은 일반적으로 Statement 대신 PreparedStatement (또는 원시 JDBC 대신 ORM 프레임 워크를 사용하는 것)을 사용하여 막을 수 있습니다. 예를 들어 "raw"대신 MVC 프레임 워크를 사용하여 XSS 문제를 방지 할 수 있습니다 JSP ").

  1. 총알을 물린 및 사용자 제어 입력을 다시 표시 모든 EL-의 템플릿 텍스트를 바꿉니다


    당신의 구체적인 문제에 관해서는, 잘, 당신은 기본적으로 4 가지 방법으로이 문제를 해결할 수 fn:escapeXml() 또는 <c:out>으로 작성하여 향후 자신과 팀에주의를 기울이십시오. 힌트, 이클립스처럼 비트 괜찮은 IDE는 정규식 기반의 모든 파일 찾기 및 바꾸기가 있습니다.

  2. DB에 삽입하기 전에 악성 HTML을 제거하는 일종의 DB 인터셉터가 있어야합니다. 필요한 경우 DB 스크립트를 실행하여 기존 데이터를 삭제합니다. 그러나 이것은 실제 솔루션보다 더 많은 해결 방법입니다.

  3. JSP EL 해결 프로그램을 모든 HTML을 이스케이프 처리하는 사용자 지정 프로그램으로 바꿉니다. 그러나 이것은 정말로 필요할 때 언제든지 EL에 의해 일반 HTML을 보여줄 수 없다는 단점이 있습니다.

  4. HTML 이스케이프가 내장 된 적절한 MVC 프레임 워크를 사용하십시오. 그러나 이것은 개별 EL 표현을 수정하는 것보다 더 효과적입니다.

+0

감사합니다! 우리는 struts + jspx를 사용합니다. 얼굴을 사용하고 싶지 않습니다. 다른 기술입니다. 1) 우리는 intellij 아이디어를 사용하고 모든 요소를 ​​대체 할 수 있지만 우리는 이렇게하지 않습니다. 2) 이스케이프는 VIEW 문제이므로 데이터베이스가 아닌 뷰 계층에서 해결해야합니다. 3) 그렇게하려면 컨테이너를 해킹해야합니다. 내 사용자 정의 ELResolver를 등록 할 수는 있지만 체인에서 사용됩니다. 다른 모든 해결자를 비활성화하거나 감쌀 수 없습니다 (심지어 포인터도 필요하지 않습니다 - JSP EL API는 매우 나쁨). 4) 스트럿을 사용합니다. ServletDispatcher를 사용하여 jsp 뷰를 해결합니다. 우리는 그것의 EL과 함께 놀 수 있지만 그것이 작동하는지 모르겠다 –

+1

그럼 총알을 물어. 그게 당신이 돈을받는 것입니다. 다음 번 공과를 배웁니다. – BalusC

+0

제 생각에는 JSP를 사용하지 않고 Scalate, Velocity, Freemaker와 같은 다른 뷰 기술을 추가 할 수있는 다섯 번째 옵션이 있다고 생각합니다. 이러한 템플릿 언어의 경우 교차 절단 작업을 더 쉽게 수행 할 수 있습니다. –

관련 문제