0

すべてのイベント属性を削除したいと思います (たとえば、イベント参照リストに基づくすべてのイベントから)。

イベント属性を認識する PHP の DOMDocument クラスに関数はありますか?

RegEx を使用してみましたが、一重引用符と二重引用符で複雑になりました。

preg_replace('/on*[a-z]+=".*?"/i', '', $html); // Doesn't match onclick="alert(\"hello\");"

HTMLPurifier という外部ライブラリを試しましたが、すべてのイベント属性を削除するオプションがありません。

取るべき方向または簡単な解決策はありますか?

4

4 に答える 4

1

真に安全なコードが必要な場合、ホワイトリスト アプローチ (「これらのもののみを許可する: ...」) は通常、ブラックリスト アプローチ (「これらのものを許可しない: ...」) よりも堅牢です。

あなたは HTML Purifier に言及し、「すべてのイベント属性を削除するオプションはありません」と述べました。

それは...技術的には正しいです。イベント属性を削除するように指示することはできません。ただし、その理由はセールス ポイントです。それは自動的に行われます。「欠けている」オプションは、イベント属性を許可するように HTML Purifier を構成する機能です。それは意図的に間違っています。HTML Purifier (名前が示すように) は、セキュリティに重点を置いています。

HTML Purifier 構成を使用して許可できる「安全でない HTML」の側面がいくつかありますが(デフォルトの構成は意図的に厳選されています)、イベント属性はそれらの中にありません。(まあ、フープを飛び越えれば、HTML Purifier にそれらを受け入れるように教えることができますが、それには多くの労力が必要です。)

ユーザー HTML を受け入れたい場合は、もう一度試してみることをお勧めします。これは、多くの人々によってテストされた、かなり確立されたツールです。

HTML を壊して JavaScript を挿入する非常にトリッキーな方法がいくつかあります。srcたとえば、 orhref属性を使用して JavaScript を挿入できることをご存知ですか? style一部のブラウザーでは、タグを使用して JavaScript を挿入できることをご存知ですか? この XSS チートシートを見てください。それは、あなたが何に反対しているのか、そしてなぜホワイトリストが一般的により効率的であると考えられているのか、大まかなアイデアを与えるかもしれません.

いずれにせよ、頑張ってください!

于 2013-06-24T20:48:10.633 に答える
0

HTML ドキュメントをロードし、すべての要素を反復処理してから、それらのすべての属性 (ネストされている) を反復処理し、属性が で始まる場合は属性を削除しますon

$doc = new DOMDocument();
$doc->loadHTML($html);

foreach ($doc->getElementsByTagname('*') as $element) 
{
    foreach (iterator_to_array($element->attributes) as $name => $attribute)
    {
        if (substr_compare($name, 'on', 0, 2, TRUE) === 0)
        {
            $element->removeAttribute($name);
        }
    }
}

また、既知の属性名のリストをスクレイピングして、不明な属性名が見つかった場合に警告を発することもできます (または、許可する属性のホワイトリストを用意します)。これが役に立てば幸いです。コードをすばやく入力すると、小さなエラーが発生する可能性があります。

于 2013-06-24T07:38:27.567 に答える