1. Encryption - escapeHtml
선택 - Input Text 입력란에 입력 후,
<p>MyName<p>
2. Encrypt Text 버튼을 클릭 시 Input Text 입력란에 입력되어 있던 상기 코드가 아래와 같이 변경되는 이유는
<p>MyName<p>
2.1 - 이때 Encryption - Input Text 입력란은 아래와 같이 코딩되어 있었고,
<input id="encryptInptText" class="encryptInptFld" name="encryptInptFld" type="text" placeholder="Please input ID or Password" value="<c:out value="${inputParam.encryptInptFld}" />"/>
2.2 - jsp에서 JSTL로 아래와 같이 처리하면,
<c:out value="값" />
2.3 - 상기 코드에서 escapeXml=“true”
로 default 설정되기 때문에 캐릭터 <
, >
, &
, '
, “
들을
각각 캐릭터 엔티티 <
, >
, &
, '
, "
로 변경하여 jsp에 표시되기 때문입니다.
2.4 - Ref Site
jstl 사용할 때 tag가 jsp 화면에 그대로 출력될 경우, escapeXml
2.5 - 아래와 같이 escapeXml=“false”
를 입력하면,
<input id="encryptInptText" class="encryptInptFld" name="encryptInptFld" type="text" placeholder="Please input ID or Password" value="<c:out value="${inputParam.encryptInptFld}" escapeXml="false" />"/>
2.6 - Encrypt Text 버튼을 클릭하여도 jsp의 Input Text 입력란은 아래와 같이 그대로 유지됩니다.
<p>MyName<p>
2.7 - 하지만 내부에서 Encrypted Result에 전달되는 값은 아래와 같으며,
<p>MyName<p>
2.8 - 상기의 값을 escapeHtml 처리를 하여 최종적으로 Encrypted Result 입력란에 표시되는 값은 아래와 같습니다.
&lt;p&gt;MyName&lt;p&gt;
2.9 - 정리 : 입력값, JSTL 처리값, escapeHtml 처리값은 아래와 같습니다.
2.9.1 - 입력값, jsp에 표시되는 값
<p>MyName<p>
2.9.2 - JSTL 처리값(내부에서만 존재)
<p>MyName<p> // <P></p> 태그에서 "<" ⇒ "<", ">" ⇒ ">"로 변경되어 표시됩니다.
2.9.3 - escapeHtml 처리 완료 후 표시되는 값
&lt;p&gt;MyName&lt;p&gt; // "<" ⇒ "&lt;", ">" ⇒ "&gt;"로 변경되어 표시됩니다.
Crypto-unescapeHtml에서 Decrypt Text 실행 시 에러 발생
Decrypt Text 버튼 클릭 전
Decrypt Text 버튼 클릭 후
결과값이 출력되면서 동시에 input Text란에 입력했던 값이 <p>MyName</p>
→ &lt;p&gt;MyName&lt;/p&gt;
으로 변경됨.
코드 수정 전
<!-- Input Encrypted ID or Password field --> <label for="decryptInptText" class="decryptInptTtl">Input Text</label> <input id="decryptInptText" class="decryptInptFld" name="decryptInptFld" type="text" placeholder="암호화된 ID 또는 Password를 입력하세요" value="<c:out value="${inputParam.decryptInptFld}" />"/>
코드 수정 후
<!-- Input Encrypted ID or Password field --> <label for="decryptInptText" class="decryptInptTtl">Input Text</label> <input id="decryptInptText" class="decryptInptFld" name="decryptInptFld" type="text" placeholder="암호화된 ID 또는 Password를 입력하세요" value="<c:out value="${inputParam.decryptInptFld}" escapeXml="false"/>"/>
코드 수정 후 Decrypt Text 버튼 클릭 후의 캡쳐
결과값이 출력되면서 동시에 input Text란에 입력했던 값 <p>MyName</p>
이 변하지 않고 그대로 표시됨을 확인.
[JSTL] Tag가 jsp화면에 그대로 노출될 경우, escapeXml
JSTL Core - Tag out
JSTL Core - Tag out에서 escapeXml
에 대한 설명은 아래와 같습니다.
Determines whether characters <,>,&,',” in the resulting string should be converted to their corresponding character entity codes. Default value is true.
결과 문자열의 문자<
,>
,&
,'
,"
를 해당 문자 엔티티 코드로 변환해야 하는지 여부를 결정합니다. 기본값은 true입니다.
String unescapeHtml1stRslt = resultData.setDecryptRsltFld(StringEscapeUtils.unescapeHtml(cryptoVO.getDecryptInptFld().replaceAll("&", "&"))); String unescapeHtml2ndRslt = (StringEscapeUtils.unescapeHtml(unescapeHtml1stRslt.replaceAll("&", "&"))); String unescapeHtml3ndRslt = (StringEscapeUtils.unescapeHtml(unescapeHtml2ndRslt.replaceAll("'", "'"))); String unescapeHtml4thRslt = (StringEscapeUtils.unescapeHtml(unescapeHtml3ndRslt.replaceAll("<", "<").replaceAll(">", ">")));
String unescapedHtmlRslt = resultData.setDecryptRsltFld(StringEscapeUtils.unescapeHtml(cryptoVO.getDecryptInptFld().replaceAll("&", "&"))); unescapedHtmlRslt = (StringEscapeUtils.unescapeHtml(unescapedHtmlRslt.replaceAll("&", "&"))); unescapedHtmlRslt = (StringEscapeUtils.unescapeHtml(unescapedHtmlRslt.replaceAll("'", "'"))); unescapedHtmlRslt = (StringEscapeUtils.unescapeHtml(unescapedHtmlRslt.replaceAll("<", "<").replaceAll(">", ">")));
String unescapedHtmlRslt = resultData.setDecryptRsltFld(StringEscapeUtils.unescapeHtml(cryptoVO.getDecryptInptFld().replaceAll("&", "&"))); unescapedHtmlRslt = (StringEscapeUtils.unescapeHtml(unescapedHtmlRslt.replaceAll("&", "&").replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">")));
String unescapedHtmlRslt = resultData.setDecryptRsltFld(StringEscapeUtils.unescapeHtml(cryptoVO.getDecryptInptFld().replaceAll("&", "&").replaceAll("&", "&").replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">")));
HtmlTagFilterRequestWrapper.class 확인 및 학습 필요
삽질 금지…