0

このGWT-RPCの質問(および回答#1)のフォローアップ。フィールドサイズのチェック、サーバーに送信される最大データサイズの事前逆シリアル化をチェックする正しい方法を知りたいです。たとえば、リクエストデータサイズ> Xの場合、リクエストを中止します。単純さを評価し、前述の質問/回答の回答に基づいて、全体的なリクエストの最大サイズをチェックするだけで十分であり、よりきめ細かいチェック(つまり、フィールドレベルのチェック)を逆シリアル化後まで延期できると思う傾向がありますが、私はベストプラクティスの提案。

関心のある技術スタック:Apache-TomcatフロントエンドWebサーバーとのGWT-RPCクライアントサーバー通信。

最初のステップは、リクエストのサイズをグローバルに制限することだと思います( httpd.confなどのLimitRequestBody?)。
RPCリクエストごとに設定できるような、よりきめ細かいチェックはありますか?もしそうなら、どこで、どのように?より細かい粒度のチェックは、1つのグローバル設定にどの程度のセキュリティ価値をもたらしますか?

例を使用して質問をより具体的に組み立てるために、同じサーブレットに次の2つのRPC要求署名があると仮定します。

public void rpc1(A a, B b) throws MyException;
public void rpc2(C c, D d) throws MyException;

次の最大サイズをおおよそ知っていると仮定します。

  • a:10 kB
  • b:40 kB
  • c:1 M B
  • d:1 kB

次に、次の最大サイズを期待します。

  • rpc1:50 kB
  • rpc2:1 MB

この例のコンテキストでは、私の質問は次のとおりです。

  1. リクエストの最大サイズをどこで/どのように設定するか-つまり、上記の例では1 MBですか?httpd.confのLimitRequestBodyだと思いますが、それがこの目的の唯一のパラメーターであるかどうかは100%わかりません。
  2. 可能であれば、サーブレットごとの最大サイズをどこで/どのように構成するか-つまり、サーブレット内のrpcの最大サイズは1 MBですか?
  3. 可能であれば、rpcリクエストごとの最大サイズをどこで/どのように構成/確認しますか?つまり、最大rpc1サイズは50 kB、最大rpc2サイズは1 MBですか?
  4. 可能であれば、rpc要求引数ごとの最大サイズを構成/チェックする場所/方法-つまり、aは10 kB、bは40 kB、cは1 MB、dは1kBです。ポストデシリアライズを行うのは実用的な意味があると思いますね。
  5. コスト/メリットに基づく実用的な目的では、一般的にどのレベルの逆シリアル化前チェックが推奨されますか?1.グローバル、2。サーブレット、3。rpc、4。オブジェクト引数?別の言い方をすれば、上記の逆シリアル化前の各レベルチェックのコストの複雑さと付加価値はどのくらいですか?

よろしくお願いします。

4

1 に答える 1

0

私が質問をしてから学んだことに基づいて、誰かが私をよりよく見せてくれるまでの私自身の答えと戦略は次のとおりです。

  1. 防御とチェックの最初の行は、httpd.confに設定されているApacheのLimitRequestBodyです。これは、すべてのサーブレットにわたるすべてのrpc呼び出しの全体的な最大値です。
  2. 2番目の防御線は、GWTAbstractRemoteServiceServlet.readContentをオーバーライドすることによるサーブレットの事前デシリアライズです。たとえば、私が思うに、さらに下に示すようにそれを行うことができます。これが、この質問で私が釣りをしていたことの核心でした。
  3. 次に、デシリアライズ後に各rpc呼び出し引数をさらに確認できます。サーバー側とクライアント側の両方でJSR303検証を便利に使用できます。参照StackOverflowgwtreクライアント側を参照してください。

AbstractRemoteServiceServlet.readContentをオーバーライドする方法の例:

@Override 
protected String readContent(HttpServletRequest request) throws ServletException, IOException
{
  final int contentLength = request.getContentLength();
  // _maxRequestSize should be large enough to be applicable to all rpc calls within this servlet.
  if (contentLength > _maxRequestSize)
    throw new IOException("Request too large");
  final String requestPayload = super.readContent(request);
  return requestPayload;
}

最大リクエストサイズが2GBを超える場合は、この質問を参照してください。

セキュリティの観点から、この戦略は、ユーザーがサーバーに送信するデータのサイズを制御するのに非常に合理的であるように思われます。

于 2013-01-07T03:01:02.580 に答える