Spring MVC(Spring 3.1.0)を使用しています。
XSSが原因で、システムから出力されるすべての文字列をHTMLエンコードしたいと思います。
しかし、そのようにエンコードしたくない出力(リンクなど)がありますContextualSerializer
。そのために、それを実装するクラスを使用して作成することにしました。
このメソッドcreateContextual
は、カスタムアノテーション(@NoHTMLEscap
)の存在を確認し、返すを決定しJsonSerializer
ます。
これが私の注釈です:
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface NoHTMLEscap {
}
私はそれを試しましたが、POJOでうまく機能しますが、失敗するケースは次のとおりです。
@Controller
@RequestMapping(value = "/something")
public class MyController {
...
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(value = HttpStatus.OK)
public String getName(@PathVariable String id) {
return "Here is your answer";
}
}
Springは戻り値をjacksonに送信しますが、このメソッドはString
POJOではなく戻り値を返すため、アノテーションの存在を確認する方法がないため、実際にアノテーションを使用することはできません...
この情報をジャクソンのシリアライザーに取得する方法はありますか?
よくわかりませんが、文字列をエスケープしないスプリング固有のコンバーターを使用する必要があると思いました(これで問題が正しく解決されるかどうか、およびこれをどのように実装できるかはわかりません)。