2017-07-14 5 views
-1

私は数日間オンとオフになっていましたが、私のRexExの熟練はあまり良くありません。はい、私はRegExがHTMLを解析するのではないことを理解しています。私はCKEditor入力のサーバー側の "クリーニング"を行っていますが、これは既にこれを行いますが、クライアント側のみです。いずれもホワイトリストされたタグをストライピングした後イベント属性を見つけて削除するRegEx ex。 onclick、onload、onhoverなど

...

まず:$html = preg_replace(' on\w+=(["\'])[^\1]*?\1', '', $html);

すべてのイベントが正しく'または"のいずれかの重引用符で引用された属性

を削除する第二: $html = preg_replace(' on\w+=\S+', '', $html); *何の引用符を持っていないものを削除しかし、まだ発射することができます。 onclickの= blowUpTheBaseは()私がやりたい何

はのonEventが> & <の間にあるが、私は唯一のonEvent属性はタグの後の最初の1であれば、それは仕事を得ることができ確実です。私が試したすべてが、ほとんどのコードをキャプチャしてしまいます。私はちょうど十分に怠惰なそれを得ることができません。

ex。 $html = preg_replace('<([\s\S]?)(on\w+=\S+) ([\s\S]*?)>', '<$1 $3>', $html);

編集: RegExは私が求めているので、@ colburtonの回答を選択します。私はそれがトリックに起因するので、私の特定の状況にもそれを使用します。それは、この「正しい方法」を行う方法についての素晴らしい例と説明を与えるので、私は彼のanswerため@Casimirらイポリットに感謝したいと思います

しかし

(それはとにかく内部のアプリケーションです)。 DOMDocumentを使用して関数を書くとすぐに、RTE/WYSIWYG/HTML入力を処理するgotoの方法になります。

+0

'[^ \ 1]'として動作しません。あなたはそれがそうだと思います。代わりに '(?:(?!\ 1)。)*'を使用する必要があります。また、正規表現のデリミタを使用する必要があります。 –

+0

引用符問題と属性の位置は、正規表現であなたのhtmlを解析することが悪い考えである理由の2つです。 DOMDocumentを使用すると、これらの問題は存在しません。あなたのHTMLコンテンツを偽のルート要素に囲み、 '

....
'と言って、パーサーでこのビルドを使用しましょう。 –

+0

外部データを信頼できないことに注意してください。すでにクライアント側で処理されるはずのクリーニングの部分がある場合は、もう一度サーバー側で行うか、少なくともチェックする必要があります。 –

答えて

0

多分私はこれを最初から言及していたはずです。これは、XSSをフィルタリングする方法ではありません。これはあなたが提案したパラメータの中で純粋に学問的なものです(例えば、 "RegExを使う")。


これは非常に近いあなたを取得:

<a href="something" onclick="bad()">text</a> onclick not in tags 
<a href="something" onclick=bad()>text</a> 
<a href="something" onclick="bad()" >text</a> 
<meta name="keywords" content="keyword1, keyword2, keyword3"> 

<a href="something" onclick= "bad()">text</a> onclick not in tags 
<a href="something" onclick =bad()>text</a> 
<a href="something" onclick=bad('test')>text</a> 
<a href="something" onclick=bad("test")>text</a> 
<a href="something" onclick="bad()" >text</a> 
What if I write john+onelia=love forever? 

でテスト

preg_replace('/(<.+?)(?<=\s)on[a-z]+\s*=\s*(?:([\'"])(?!\2).+?\2|(?:\S+?\(.*?\)(?=[\s>])))(.*?>)/ig', "$1 $3", $string); 

はこの辺り再生: https://regex101.com/r/GMBaQs/9

+0

複数のカウンタの例:https://regex101.com/r/GMBaQs/2 –

+0

@Casimir:入力のThx。別のラウンドに進んでください;-) – colburton

+0

それはそれを押していますが、https://regex101.com/r/GMBaQs/5は1つを取得します。これまでの回答をありがとう、私を恥ずべきにしています。 – Chad

関連する問題