2008年10月26日日曜日

Proxomitronでよく使われる表現でクオートされた "<>" に誤爆する問題に対処する

元ネタは「Proxomitron フィルター作成スレッド Part10」の45氏
(ISP規制で2chに投稿できないので、こちらに書きました。)

問題の概要

45氏が提起された問題を以下にまとめます。

  • Proxomitronでよく使われる表現「<a\s[^>]++href=」は「<a onclick="for(i=0;10>i;i++){...}">」に誤爆する
  • &;lt;a title="<test>">」は「&;lt;>」をHTMLエンティティ化すれば対処できる
  • JavaScriptコードはHTMLエンティティ化すると動作しない。どうしよう?

解決法:初めからクオートされた "&;lt;>" に対応できるフィルタにする

<a\s[^>]++href=<a(\s[a-z]+(=$AV(*)|(^=)))++\shref= に置換することで、対応します。

[Patterns]
Name = "Kill <a> ad (anti quoted <>) [2008/10/26] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "$NEST(<a(^(^\s)),"
        "(\s[a-z]+(=$AV(*)|(^=)))++\shref=$AV(http://$LST(AdList)*)*"
        ",</a>)"

この記法、汎用性はありますが美しいコードではないのがネックです。

そもそも属性値に "&;lt;>" と書いているサイトはどれぐらいあるのか

「>」と書いているサイト、「&gt;」と書いているサイト、どちらも見たことがありますが、母数が少ないためにどちらが多いとは断定し難い状態です。
(どちらかといえば、しっかりしたHTMLが増えてきていて 「&gt;」と書いているサイトが多い印象はあります。)

JavaScriptに限定すれば、<a onclick="func();"> (関数埋め込み型) や <a id="TEST"> (外部スクリプトでイベントハンドラを割り当てる) と比べて、<a onclick="for(i=0;10>i;i++){...}"> が圧倒的に少ない、のは間違いないと思います。
JavaScriptライブラリの影響で、一昔前と比べて手打ちでコードを入力する機会が減っているのかも。

結論:結局どう対応すればいいのか

完全対応を目指すなら、既存のフィルタをクオートされた "&;lt;>" に対応できるフィルタに修正するのが一番。
ですが、すべてのフィルタを修正していくのは大変です。
経験上、クオートされた "<>" を見る機会がほとんどないので、問題が発生したときに原因となるフィルタを対処療法的に修正していくだけで十分だと思います。

ラベル: ,

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム