3

サーブレットで次のコードを使用しています。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out=response.getWriter();
    response.setContentType("text/html");


    out.println("<html>");
    out.println("<body>");
    out.println("<script>alert(1)</script>");
    out.println("</body>");
    out.println("</html>");
}

そして、フィルターの次のコード:

public class SampleFilter implements Filter {
  protected FilterConfig config;

  public void init(FilterConfig config) throws ServletException {
    this.config = config;
  }

  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws ServletException, IOException {
      long startTime = System.currentTimeMillis();
    ServletResponse newResponse = response;

    if (request instanceof HttpServletRequest) {
        System.out.println("in filter if1");
      newResponse = new CharResponseWrapper((HttpServletResponse) response);
    }
    System.out.println("after filter if1");
    chain.doFilter(request, newResponse);
    long elapsed = System.currentTimeMillis() - startTime;
    if (newResponse instanceof CharResponseWrapper) {
        System.out.println("in filter if2");
      String text = newResponse.toString();
      if (text != null) {
        text = SampleFilter.HTMLEntityEncode(text);//.toUpperCase();
        response.getWriter().write(text);
      }
    }
    System.out.println("after filter if2");
    config.getServletContext().log(" took " + elapsed + " ms");
    System.out.println(elapsed);
  }

  private static String HTMLEntityEncode(String input) {

        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < input.length(); i++) {

          char ch = input.charAt(i);

          if (Character.isLetterOrDigit(ch) || Character.isWhitespace(ch)) {

            sb.append(ch);

          } else {

            sb.append("&#" + (int)ch + ";");

          }

        }

        return sb.toString();

  }

}

ブラウザで次の表示データを取得したい:

<script>alert(1)</script>

むしろ私は得ています

<html>
<body>
<script>alert(1)</script>
</body>
</html>

ブラウザで。

どんな助けでも素晴らしいでしょう。

4

4 に答える 4

3

XSS 攻撃を防ごうとするときは、有効なコードを潜在的に危険な部分から有効な式から分離する必要があります。これを実現するには、さまざまな手法があります。

バインドされたデータのエスケープ:この場合、何らかのテンプレート テクノロジを使用する必要があります。テンプレートで定義された Anyting は安全であると見なされます。最も単純なケースでは、バインドされたすべてのデータが危険であると見なされるため、エスケープされます。これを簡単にするソリューションの 1 つがSnippetoryです。(はい、開発しています。Sourceforgeまたはmaven repoから入手できます) テンプレートは次のようになります。

 <html>
   <body>
     $attack
     $text
   </body>
 </html>

次に、バインディング コードは次のようになります。

Template page = Syntaxes.FLUYT_X.readResource("template.html")
    .encoding(Encodings.html);
page.set("attack", "<script>alert(0)</script>");
page.set("text", "text <--> escaping");
page.render(response.getWriter());

ただし、欠点は、出力処理全体を正しく行う必要があることです。しかし、本格的なプロジェクトでは、これが最も重要な方法だと思います。

現在、処理後に使用できるいくつかのアプローチがありますが、通常はバインドされたデータのエスケープと組み合わせて使用​​され、Stackoverflow のエディター フィールドなどの複雑なものを実装します。

ホワイトリスト:基本的に、データを分析し (おそらく html パーサーを使用)、ホワイトリストに追加したタグの一部ではないものをすべてエスケープします。そして、許可しないすべての属性を削除します。これはかなり安全ですが、非常に制限的でもあります。さらに、かなり複雑なので、ここで例を示すことはできません。

ブラックリスト:ほとんど同じですが、vlack リストにないものを通過させます。何かを忘れた場合でも、危険な攻撃が可能です。

于 2013-03-29T10:12:19.293 に答える
3

難しい方法でそれをしないでください。HTML出力を生成するためにJSPを使用するだけです。JSP 標準タグ ライブラリ ( JSTL<c:out> ) は、タグと${fn:escapeXml()}関数のフレーバーで XSS 攻撃の穴からユーザー制御データをエスケープする組み込みの方法を提供します。

<p>Welcome, <c:out value="${user.name}" />!</p>
...
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />

完全に無害になるように、定義済みの XML エンティティ<をbyのようにエスケープします。&gt;

サーブレットは、HTML 出力を生成するようには設計されていません。これらは、リクエスト/レスポンスを制御する目的で設計されています。

以下も参照してください。

于 2013-03-31T01:16:48.490 に答える
1

Jersey REST API用のXSSフィルタを実装しました。コードは簡単に抽出して、標準の Java フィルターに適用できます。

ほとんどの人は出力をエンコードすることを推奨していますが、JavaScript API を介してデータにアクセスでき、お客様が XSS 脆弱性を除外することを保証する方法がないため、入力の XSS 脆弱性を除外することを選択しました。このアプローチのもう 1 つの利点は、データが出力されるたびにフィルタリングが行われるのではなく、一度だけ行われることです。

POST データのコンテンツが正しくフィルタリングされるようにするには、フィルターを JSR 303 の @SafeHtml アノテーションと組み合わせて使用​​する必要があることに注意してください。

これについては、こちらのブログで文書化しました: http://codehustler.org/blog/jersey-cross-site-scripting-xss-filter-for-Java-web-apps/

于 2013-05-15T13:44:34.327 に答える
1

あなたの場合、注入されたコンテンツから正当なコンテンツを分離する方法がないため、フィラーを使用することは不可能です。xss に対するヒューリスティックなブラック ボックス防御は、出力ではなく入力をフィルタリングすることで適用できます。

于 2013-03-29T10:24:41.253 に答える