WebアプリケーションでJerseyを使用しています。サーバーに送信されるデータはJSON形式であり、JSON形式はサーバー側でマーシャリングされておらず、取得されたオブジェクトは以降の処理で使用されます。セキュリティ監査により、このアプローチにいくつかの脆弱性が発生しました。
私の休憩コード:
@POST
@Path("/registerManga")
@Produces(MediaType.APPLICATION_JSON)
public Response registerManga(MangaBean mBean){
System.out.println(mBean);
return Response.status(200).build();
}
MangaBean:
public class MangaBean {
public String title;
public String author;
@Override
public String toString() {
return "MangaBean [title=" + title + ", author=" + author + "]";
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
データは次の形式で送信されます。
["title":"Bleach","author":"kubo tite"]
上記のデータは正常にオブジェクトにアンマーシャリングされ、これを出力として取得します。
MangaBean [title=Bleach, author=kubo tite]
ただし、データが次のように変更された場合:
["title":"<script>alert("123");</script>","author":"kubo tite"]
500内部サーバーエラーが発生し、ユーザーに表示されます。
javax.servlet.ServletException: org.codehaus.jackson.JsonParseException: Unexpected character ('1' (code 49)): was expecting comma to separate OBJECT entries
at [Source: org.apache.catalina.connector.CoyoteInputStream@19bd1ca; line: 1, column: 28]
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
の予期しない発生により""
、パーサーでエラーが発生しています。アンマーシャリングは舞台裏で行われ、私はそれを制御できないため、発生した例外を処理できません。
私の質問は、この例外を処理して、スタックトレースの代わりに適切な応答をユーザーに返す方法です。ご意見をお聞かせください。