6

現在のプロジェクトで問題が発生しました。ユーザーはテキストエリアを使用して電子メールを送信できます。ユーザーが必要なものを入力できるようにするため、書式設定用の HTML をいくつか入れることができます。たとえば、<b>太字のテキストにタグを使用することをユーザーに許可する必要があります。

電子メールを完了すると、ユーザーは電子メールのプレビューを動的に表示できるようになります。

少し問題がありますが、プレビューが表示されているときに XSS ハッキングを回避するにはどうすればよいですか?

もちろん、を使用してそれらを削除することもできますが、それではunderscore.jsプレビューがフォーマットされません。

そのため、今のところすべての HTML タグを禁止し<hr><b>、 などのタグのみを許可しました。

このソリューションについてどう思いますか? それは十分に安全ですか?

4

5 に答える 5

1

もちろん、常にBB コードを使用するように切り替え、フォームと同じプレビュー用のパーサーを使用してから、送信時に ubb コード サーバー側を解析することができます。

PHP を使用してメールを送信すると仮定してプレビュー用にクライアント側で BB コードを解析したい場合はこの記事を参照してください。

于 2013-11-06T22:50:06.567 に答える
1

ほとんどの XSS 攻撃を回避する最善の方法は次のとおりです。

  • データをサニタイズして、HTML に到達する前にテキストが適切にエスケープされるようにする (自分や他のユーザーの例外を作成でき<b>ます<hr>)

  • コンテンツ セキュリティ ポリシーを使用してすべてのインライン スクリプトを無効にします (中間者攻撃も回避します): http://www.html5rocks.com/en/tutorials/security/content-security-policy/

これら 2 つを一緒に使用すると、サイトがかなり堅牢になります。

于 2013-11-06T22:58:23.970 に答える
0

電子メール クライアントで機能するタグは比較的小さい (それでもかなり大きい) リストであるため、現在行っているのと同様に、タグのホワイトリストを使用することをお勧めします。タグを削除するのは比較的複雑な正規表現ですが、許可するタグは許可しますが、それが一部のタグを許可し、他のタグを許可しない唯一の方法だと思います。ただし、タグの削除を使用して新しいタグを作成できるため、これは絶対確実ではありません。

<<script>script language="javascript">Do something bad</<script>script>

マークダウンまたはサーバー側で有効な HTML に変換できる同様の構文を使用して調査することをお勧めします。

http://daringfireball.net/projects/markdown/を参照してください。

そうすれば、書式設定マークダウンの小さなサブセットを使用でき、サーバー側でそれらを置き換えることができます。

于 2013-11-06T22:55:04.297 に答える
-1

一部のタグを許可してサーバー側での XSS 攻撃を防ぎたい場合は、OWASP HTMLSanitizer を使用して (OWASP アンチサミーは現在無効になっています)、独自のルールを作成することもできます。

  • HTML サニタイザー プロジェクト ページ:
    https://www.owasp.org/index.php/OWASP_Java_HTML_Sanitizer_Project
  • ルール例 - Ebay ルール:
    https://github.com/OWASP/java-html-sanitizer/blob/master/src/main/java/org/owasp/html/examples/EbayPolicyExample.java

    https://github.com/OWASP/java-html-sanitizer/blob/master/src/main/java/org/owasp/html/examples/EbayPolicyExample.java
    public static final PolicyFactory POLICY_DEFINITION = new HtmlPolicyBuilder()
          .allowAttributes("id").matching(HTML_ID).globally()
          .allowAttributes("class").matching(HTML_CLASS).globally()
          .allowAttributes("lang").matching(Pattern.compile("[a-zA-Z]{2,20}"))
              .globally()
          .allowAttributes("title").matching(HTML_TITLE).globally()
          .allowStyling()
          .allowAttributes("align").matching(ALIGN).onElements("p")
          .allowAttributes("for").matching(HTML_ID).onElements("label")
          .allowAttributes("color").matching(COLOR_NAME_OR_COLOR_CODE)
              .onElements("font")
          .allowAttributes("face")
              .matching(Pattern.compile("[\\w;, \\-]+"))
              .onElements("font")
          .allowAttributes("size").matching(NUMBER).onElements("font")
          .allowAttributes("href").matching(ONSITE_OR_OFFSITE_URL)
              .onElements("a")
          .allowStandardUrlProtocols()
          .allowAttributes("nohref").onElements("a")
          .allowAttributes("name").matching(NAME).onElements("a")
          .allowAttributes(
              "onfocus", "onblur", "onclick", "onmousedown", "onmouseup")
              .matching(HISTORY_BACK).onElements("a")
          .requireRelNofollowOnLinks()
          .allowAttributes("src").matching(ONSITE_OR_OFFSITE_URL)
              .onElements("img")
          .allowAttributes("name").matching(NAME)
              .onElements("img")
          .allowAttributes("alt").matching(PARAGRAPH)
              .onElements("img")
          .allowAttributes("border", "hspace", "vspace").matching(NUMBER)
              .onElements("img")
          .allowAttributes("border", "cellpadding", "cellspacing")
              .matching(NUMBER).onElements("table")
          .allowAttributes("bgcolor").matching(COLOR_NAME_OR_COLOR_CODE)
              .onElements("table")
          .allowAttributes("background").matching(ONSITE_URL)
              .onElements("table")
          .allowAttributes("align").matching(ALIGN)
              .onElements("table")
          .allowAttributes("noresize").matching(Pattern.compile("(?i)noresize"))
              .onElements("table")
          .allowAttributes("background").matching(ONSITE_URL)
              .onElements("td", "th", "tr")
          .allowAttributes("bgcolor").matching(COLOR_NAME_OR_COLOR_CODE)
              .onElements("td", "th")
          .allowAttributes("abbr").matching(PARAGRAPH)
              .onElements("td", "th")
          .allowAttributes("axis", "headers").matching(NAME)
              .onElements("td", "th")
          .allowAttributes("scope")
              .matching(Pattern.compile("(?i)(?:row|col)(?:group)?"))
              .onElements("td", "th")
          .allowAttributes("nowrap")
              .onElements("td", "th")
          .allowAttributes("height", "width").matching(NUMBER_OR_PERCENT)
              .onElements("table", "td", "th", "tr", "img")
          .allowAttributes("align").matching(ALIGN)
              .onElements("thead", "tbody", "tfoot", "img",
                               "td", "th", "tr", "colgroup", "col")
          .allowAttributes("valign").matching(VALIGN)
              .onElements("thead", "tbody", "tfoot",
                              "td", "th", "tr", "colgroup", "col")
          .allowAttributes("charoff").matching(NUMBER_OR_PERCENT)
              .onElements("td", "th", "tr", "colgroup", "col",
                              "thead", "tbody", "tfoot")
          .allowAttributes("char").matching(ONE_CHAR)
              .onElements("td", "th", "tr", "colgroup", "col",
                               "thead", "tbody", "tfoot")
          .allowAttributes("colspan", "rowspan").matching(NUMBER)
              .onElements("td", "th")
          .allowAttributes("span", "width").matching(NUMBER_OR_PERCENT)
              .onElements("colgroup", "col")
          .allowElements(
              "a", "label", "noscript", "h1", "h2", "h3", "h4", "h5", "h6",
              "p", "i", "b", "u", "strong", "em", "small", "big", "pre", "code",
              "cite", "samp", "sub", "sup", "strike", "center", "blockquote",
              "hr", "br", "col", "font", "map", "span", "div", "img",
              "ul", "ol", "li", "dd", "dt", "dl", "tbody", "thead", "tfoot",
              "table", "td", "th", "tr", "colgroup", "fieldset", "legend")
          .toFactory();
    
于 2016-01-19T04:04:47.353 に答える