3

Fortify は、新しいファイル (パス) 比較が行われる行でパス操作エラーを発生させます。Struts2 を使用しています。

fortify がこのエラーを出さないように、この問題を修正する方法を誰か教えてもらえますか?

private boolean filePresent(String fileName) {
    if (fileName != null) {
        String path = getDirPath();
        if (path != null) {
            path = path.endsWith("/") ? path : path + "/";
            path = path + fileName;
            if (new File(path).exists()) {
                setFileName(fileName);
                return true;
            }
        }
    }
    return false;
}

ファイルがWebサーバーに存在するかどうかを確認する必要があるため、ファイル名を引数として渡し、web.xmlからディレクトリパス全体を取得し、それをファイル名に追加し、パスを作成してチェックしますFile オブジェクトに対して、それが存在するかどうかを確認します。

4

2 に答える 2

6

C:/Windows/System32 が存在するかどうか、または /etc/hosts が存在するかどうかを、リモートの Web ユーザーに知られたくありません。これにより、サーバーでフォレンジック調査を行うことができるからです。

入力文字列に適切な数の ".." シーケンスを含めることで、関数がまさにそれを可能にしていることにおそらく気付いていないでしょう。

問題を停止するには、次の 2 つの方法があります。

  1. ホワイトリスト アプローチ。入力パラメーター内のすべての文字をスクラブし、"a" から "z" まで、およびおそらく "." のみを許可します。入力がこれらの境界の外にある場合は、例外をスローします。

1a. または、有効なファイルのリストが 20 未満であることがわかっている場合は、それらをリストして、入力が完全に一致しない場合は例外をスローします。

  1. ブラックリスト アプローチ。入力を確認し、シーケンス「..」またはスラッシュまたはバックスラッシュが含まれている場合は例外をスローします。これは一般的に多層防御ではありませんが、私が今読んでいるあなたの機能にとっては、これで問題ありません。
于 2012-03-31T11:00:05.137 に答える
0

filter を使用して次のようにすることもできます

フィルターで

chain.doFilter(new RequestWrapper((HttpServletRequest) request), response);

RequestWarper では次のようなものを使用します

if(value.contains("..\\"))
value = value.replace("..\\", "");
        if(value.contains("../"))
            value = value.replace("../", "");
        if(value.contains("./"))
            value = value.replace("./", "");
于 2013-12-19T12:50:17.390 に答える