1

XSS 攻撃を避けるために、Jackson Mapper を使用して Spring MVC で HTML をエスケープします。

Jackson だけでエスケープする方法と、Spring で Jackson を構成する方法を検索します。
"<" ">" のようなテキストで json をエクスポートしようとしましたが、それらをエスケープすることを期待してい&#60;ます&#62;

。たとえば、 "bold tag"<b>で囲まれたテキストを追加しました。テキストは、フロント エンドの html ページに太字で表示されます。

以下は私のアプローチです。なぜうまくいかなかったのかわかりません。

誰でも助けることができますか?

前もって感謝します!

public class CustomObjectMapper extends ObjectMapper {  
    public CustomObjectMapper() {
        this.getJsonFactory().setCharacterEscapes(new CustomCharacterEscapes());
    }
}

public class CustomCharacterEscapes extends CharacterEscapes {
    private final int[] asciiEscapes;

    public CustomCharacterEscapes() {
        int[] esc = CharacterEscapes.standardAsciiEscapesForJSON();
        esc['<'] = CharacterEscapes.ESCAPE_STANDARD;
        esc['>'] = CharacterEscapes.ESCAPE_STANDARD;
        esc['&'] = CharacterEscapes.ESCAPE_STANDARD;
        esc['\''] = CharacterEscapes.ESCAPE_STANDARD;
        asciiEscapes = esc;
    }

    @Override
    public int[] getEscapeCodesForAscii() {
        return asciiEscapes;
    }

    @Override
    public SerializableString getEscapeSequence(int ch) {
        return null;
    }
}

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <array>
            <bean id="jsonConverter"
                class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                <property name="objectMapper">
                    <bean class="x.y.z.CustomObjectMapper" />
                </property>
            </bean>
        </array>
    </property>
</bean>

4

1 に答える 1

0

私は自分のHttpMessageConverterを書こうとしたことはありませんが、あなたがやりたいことにかなり関連しているように見えるこの投稿を見つけました。彼らの解決策とあなたがここに投稿したものを比較すると、私が気付いた最大の違いは、あなたが以下を実装/オーバーライドしていないようだったということです:

  1. 保護されたブールサポート(Class clazz)は、サポートしているクラスタイプを示します(すべての可能性を処理するのに十分な汎用性が必要な場合は、オブジェクトまたはシリアル化可能、またはドメインオブジェクトに固有のクラスを確認します) )。
  2. 保護されたオブジェクトreadInternal(Class clazz、HttpInputMessage inputMessage)は、リクエスト側で使用されているように見えます
  3. protected void writeInternal(Object t、HttpOutputMessage outputMessage)、これは応答側で使用されているように見えます

別のアプローチは、@ResponseBodyと組み合わせてカスタムJacksonシリアライザーを簡単に作成することです。または、さらに良いことに、ユーザー主導の値があり、それをデータベースに保存している場合は、挿入する前に値をエスケープします。そうすれば、何もする必要がなくなり、問題の値はエンドツーエンドで「安全」になります。夢中になりたい場合は、HTMLの文字列をエスケープするカスタムjava.beans.PropertyEditorを作成し、InitBinderを使用してそれをミックスにプラグインできます。

最後に、文字を自分で置き換えるのではなく、 ApacheCommons -LangStringEscapeUtilsのようなものを使用して値をエスケープすることをお勧めします。

于 2013-03-01T14:13:25.720 に答える