2

私はWebフレームワークに取り組んでおり、それにXSS防止を組み込むことを試みています。着信データをエスケープしてデータベースに保存するように設定しましたが、ユーザーが生成したhtmlを保存したい場合があります。私はJavaScriptの実行を防ぐカスタムタグを作成しようとしています。これが私の最初のハックです。

<html>
  <head>
    <script type="text/javascript" src="/js/jquery.min.js"></script>
  </head>
  <body>

    <preventjs>
      <div id="user-content-area">
        <!-- evil user content -->
          <p onclick="alert('evil stuff');">I'm not evil, promise.</p>
          <p onmouseover="alert('evil stuff');">Neither am I.</p> 
        <!-- end user content -->
      </div>
    </preventjs>

    <script type="text/javascript">
      // <preventjs> tags are supposed to prevent any javascript events
      // but this does not unbined DOM events
      $("preventjs").find("*").unbind();
    </script>

  </body>
</html>

jQueryを使用してすべてのバインドを解除しようとしましたが、DOM内のイベントのバインドが解除されません。これは、まさに私がやろうとしていることです。DOM要素のすべてのイベントのバインドを解除することは可能ですか?

4

4 に答える 4

4

問題は、これを間違った目的で行っていることです。敵対的な可能性のあるコンテンツを受け取ったときに、すべてのユーザー入力をフィルタリングする必要があります。

これを行う際の最初の経験則は、「常にホワイトリストに登録し、ブラックリストに登録しない」です。ユーザーが生成したHTMLですべての属性を許可するのではなく、許可された属性のリストを保持し、HTMLを受信したときに他のすべての属性を削除します(おそらくクライアント側で、間違いなくサーバー側で)。

ああ、HTMLは正規言語ではありません。このタスクの正規表現ではなく、HTMLパーサーを使用することをお勧めします。

于 2011-08-25T19:35:59.377 に答える
2

.unbindjQueryを使用して添付されたイベントのみをバインド解除します。インラインイベントハンドラーコードをnullに設定することで、それらを取り除くことができます。例:

$("preventjs *").removeAttr("onclick").removeAttr("onmouseover");

デモ。

編集:これは邪悪な解決策です。「on」で始まるすべての属性を削除できます。

$("preventjs *").each(function() {
    var attribs = this.attributes;
    var that = this;
    $.each(attribs, function(i, attrib) {
        if(attrib.name.indexOf("on") === 0) {
            $(that).removeAttr(attrib.name);
        }
    });
});

デモ。

于 2011-08-25T19:25:15.693 に答える
1

問題は、インラインハンドラーを使用していることです。unbindインラインハンドラーを削除できません。

<p onclick="alert('evil stuff'...
   ^^^^

インラインハンドラーを削除するには、removeAttr

$("preventjs").find("*").removeAttr('onclick');
$("preventjs").find("*").removeAttr('onmouseover');
于 2011-08-25T19:23:51.960 に答える
0

イベントを個別にバインド解除できます。

$('p').each(function(){ this.onclick = this.onmouseover = undefined; });

mouseoutなどの他のイベントのバインドを解除する場合は、それらをそのリストに追加する必要があります。

$('p').each(function(){ this.onclick = 
                          this.onmouseover = 
                            this.onmouseout = undefined; });

もちろん、以外のセレクターを使用することをお勧めします。HTMLタグではない$('p')ため、他のセレクターを配置したくありませんでした。preventjs

于 2011-08-25T19:26:53.040 に答える