8

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)

の予期しない発生により""、パーサーでエラーが発生しています。アンマーシャリングは舞台裏で行われ、私はそれを制御できないため、発生した例外を処理できません。

私の質問は、この例外を処理して、スタックトレースの代わりに適切な応答をユーザーに返す方法です。ご意見をお聞かせください。

4

6 に答える 6

2

この例外マッパーが呼び出されていない場合 (John Ding のコメントが示すように)、ResourceConfig に登録されていることを確認してください。

また、JacksonFeature を (Jersey 2.x で) 使用する場合、このための例外マッパーが含まれていることに注意してください。ただし、独自に登録すると、それが優先されます。

パッケージで登録する例です。したがって、 JSONParseExceptionMapper を「your.package.here」に配置すると、取得されます。

@ApplicationPath("whatever")
public class MyAppResourceConfig extends ResourceConfig
{
    public MyAppResourceConfig()
    {
        packages("your.package.here");
        register(JacksonFeature.class);
    }
}

元の質問については、JsonMappingExceptionMapper も処理する必要があります。

于 2014-08-18T20:12:20.837 に答える
0

もう 1 つのオプションは ResourceConfig にあり、JsonParseExceptionMapper クラスを登録します。

register(JsonParseExceptionMapper.class);

于 2014-09-30T09:52:44.273 に答える
0

web.xml ファイルに記載されている同じパッケージ (またはサブ パッケージ) に例外処理クラスを追加します。

于 2016-04-14T04:22:01.940 に答える