1

次のタイプのオブジェクトを GWT クライアントからサーバーに RPC 経由で送信するとします。オブジェクトはデータベースに保存されます。

public class MyData2Server implements Serializable
{
    private String myDataStr;
    public String getMyDataStr() { return myDataStr; }
    public void setMyDataStr(String newVal) { myDataStr = newVal; }
}

クライアント側では、フィールド myDataStr を最大 20 文字に制限します。

私はWebアプリケーションのセキュリティについて読んでいます。私が何かを学んだ場合、それはクライアントデータが信頼されるべきではないということです. その後、サーバーはデータをチェックする必要があります。したがって、フィールドが実際に20文字を超えていないことをサーバーで確認する必要があるように感じます。そうでない場合は、攻撃の試みであることがわかっているため、リクエストを中止します(もちろん、クライアント側にバグがないことを前提としています)。

だから私の質問は:

  1. フィールドが 20 文字以内であることをサーバー側で実際に確認することはどれほど重要ですか? つまり、攻撃の可能性/リスクはどのようなもので、その結果はどれほど悪いものになる可能性があるのでしょうか? 私が読んだところによると、オーバーフローとサービス拒否によってサーバーをダウンさせる可能性があるように見えますが、セキュリティの専門家ではないため、誤解している可能性があります。

  2. サーバー上でフィールドサイズのチェックを行うのに時間を無駄にしないと仮定すると、どのようにそれを達成する必要がありますか? 素朴なチェックのようなものを読んだことを思い出したようです(参照がなくなりました)

    if (myData2ServerObject.getMyDataStr().length() > 20) 新しい MyException() をスローします。

は正しい方法ではありません。代わりに、メソッド readObject() を定義 (またはオーバーライド) する必要があります。もしそうなら、RPC 呼び出しのコンテキスト内でどのように行うべきでしょうか?

前もって感謝します。

4

1 に答える 1

1

フィールドが 20 文字以内であることをサーバー側で実際に確認することはどれほど重要ですか?

これは 100% 重要ですが、エンド ユーザーを 100% 信頼できる場合 (内部アプリなど) を除きます。

つまり、チャンスは何ですか

一般的に: 増加します。正確な確率は、具体的なシナリオについて個別に答えることができます (つまり、ここでは誰もあなたに言うことはできませんが、一般的な統計にも興味があります)。私が言えることは、改ざんは自明のことです。これは、JavaScript コードで (たとえば、Chrome の組み込みの開発ツール デバッガーを使用して)、または明確に表示される HTTP 要求データを編集することによって実行できます。

/ 攻撃のリスクと、その結果がどれほど悪いか?

リスクはさまざまです。最も直接的なリスクは、「GWT でシリアル化可能なオブジェクトの任意のフィールドに任意の値を設定できるとしたら、何を保存して何ができるか?」と考えることで評価できます。これはサイズオーバーだけでなく、ユーザーIDなどの改ざんも考えられます。

私が読んだところによると、オーバーフローとサービス拒否によってサーバーをダウンさせる可能性があるように見えますが、セキュリティの専門家ではないため、誤解している可能性があります。

これは対処すべきさらに別のレベルであり、GWT RPC メソッド実装内のサーバー側の検証では対処できません。

代わりに、ここのようなメソッド readObject() を定義 (またはオーバーライド) する必要があります。

それは良いアプローチだとは思いません。2 つのことを達成しようとしますが、どちらもうまくできません。サーバー側で実行する必要があるチェックには、次の 2 種類があります。

  1. 低レベルでは、バイトが入ってくるとき (RemoteServiceServlet によって Java オブジェクトに変換される前)。これは、GWT だけでなく、すべてのサーバーで処理する必要があり、別の質問で回答する必要があります (回答は、単に最大要求サイズのサーバー設定である可能性があります)。
  2. 論理レベルでは、Java オブジェクトにデータを取得した後。このために、検証/承認レイヤーをお勧めします。GWT の優れた機能の 1 つは、サーバー側とクライアント側の両方で JSR 303 検証を使用できるようになったことです。すべての側面をカバーしているわけではありません (ユーザー権限をテストする必要があります) が、「@Size(max = 20)」のユース ケースをカバーできます。
于 2012-11-11T15:48:29.673 に答える