このようにして、JSPに文字列を表示します。
${someString}
もちろん、この文字列には特別なhtml文字を含めることができます。現在、悪意のあるコードをHTML挿入することが可能です(たとえば、someStringがJavaScriptの場合、include <script src...>
)。
印刷前にすべての文字列がエスケープされていることを確認するにはどうすればよいですか?
Spring MVCとJSPを使用しています。
JSTL core を使用できます:
_<%@ taglib prefix="c" uri="http://Java.Sun.com/jsp/jstl/core" %>
_
文字列を表示するには、 _<c:out value="${someString}"/>
_ タグを使用します。 _<c:out>
_はHTML文字をエスケープするので、クロスサイトスクリプティングを回避でき、属性_escapeXml=true
_を設定することで指定できます。もう1つの利点は、value
がnull
に評価される場合に備えて、デフォルト値を提供できることです。
fn:escapeXml()
EL関数を使用することもできます。 JSTL functions を含める必要があります。
_<%@ taglib prefix="fn" uri="http://Java.Sun.com/jsp/jstl/functions" %>
_
別の可能な方法は、カスタム ELResolver を構築することです。
EL式評価のための変数およびプロパティ解決動作のカスタマイズを有効にします。
このブログ は、それを行う方法の実用的な例を提供します。
Spring MVCアプリ全体では、web.xmlでエスケープを指定できます。
_<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
_
ただし、エスケープはspring
タグにのみ適用されます。
_<form:input path="formField" htmlEscape="true" />
_
最後に、サードパーティのライブラリ XSSFilter を試すことができます。
<spring:htmlEscape defaultHtmlEscape="true" />
を使用して、ページレベルでこの動作を制御することもできます
JSP/Javaでは、次のコードを使用する必要があります。
JSP/HTMLの場合:
<c:out value="TR tag </tr> Script Tag <script>alert("hello Rahul")</script>" escapeXml="true" />