XSS(クロスサイトスクリプティング)攻撃(Java)をキャッチするのに最適な正規表現
質問
Jeffはこれについて HTMLのサニタイズに実際に投稿しました。しかし、彼の例はC#であり、実際にはJavaバージョンに興味があります。誰かがJavaのより良いバージョンを持っていますか?彼の例は、C#からJavaに直接変換するだけで十分ですか?
[更新]今日のように質問をしたときにSOはあまり人気がなかったので、この質問に賞金をかけました(*)。セキュリティに関連するものについては、より多くの人々がそれを見るほど、それはより良いです!
(*)実際には、まだクローズドベータ版だったと思います
解決
正規表現ではこれを行わないでください。有効なHTMLだけを保護しているわけではないことに注意してください。 Webブラウザが作成するDOMから保護しています。ブラウザーはだまされて、無効なHTMLから有効なDOMを簡単に生成できます。
たとえば、難読化されたXSS攻撃のリストをご覧ください。 YahooおよびHotmail IE6 / 7/8の場合
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
IE6で機能するこの攻撃はどうですか?
<TABLE BACKGROUND="javascript:alert('XSS')">
このサイトにリストされていない攻撃はどうですか?ジェフのアプローチの問題は、主張されているように、ホワイトリストではないということです。 そのページの誰かが適切に注意している:
問題は、html きれいでなければなりません。場合があります ハッキングされたhtmlを渡すことができます。 一致しません。その場合、 ハッキングされたhtml文字列をそのまま返します 置き換えるものと一致しません。この 厳密なホワイトリスト登録ではありません。
AntiSamy などの専用ツールをお勧めします。実際にHTMLを解析し、DOMを走査して、設定可能ホワイトリストにないものをすべて削除することで機能します。主な違いは、不正な形式のHTMLを適切に処理できることです。
最良の部分は、上記のサイトに対するすべてのXSS攻撃に対して実際に単体テストを行うことです。それに、このAPI呼び出しよりも簡単なことがあります:
public String toSafeHtml(String html) throws ScanException, PolicyException {
Policy policy = Policy.getInstance(POLICY_FILE);
AntiSamy antiSamy = new AntiSamy();
CleanResults cleanResults = antiSamy.scan(html, policy);
return cleanResults.getCleanHTML().trim();
}
他のヒント
オープンWebアプリケーションセキュリティプロジェクト(OWASP)には、入力を無害化するためのいくつかの提案があります。インスタンスを参照してください:
すべての疑わしいコードを見つけるには、正規表現を使用するのが最善の方法であるとは確信していません。壊れたHTMLを処理する場合、正規表現は特に簡単にだまされます。たとえば、Sanitize HTMLリンクにリストされている正規表現は、要素名と属性「href」の間に属性を持つすべての「a」要素の削除に失敗します。
<!> lt; alt = <!> quot; xssインジェクション<!> quot; href = <!> quot; http://www.malicous.com/bad.php <!> quot; <!> gt;
悪意のあるコードを削除するより堅牢な方法は、あらゆる種類のHTMLドキュメント(Tidy、TagSoupなど)を処理できるXMLパーサーに依存し、XPath式で削除する要素を選択することです。 HTMLドキュメントがDOMドキュメントに解析されると、削除する要素を簡単かつ安全に見つけることができます。これはXSLTでも簡単です。
NoScriptの最高のAnti-XSSアドオンから抽出しました。正規表現は次のとおりです。 完璧に動作します:
<[^\w<>]*(?:[^<>"'\s]*:)?[^\w<>]*(?:\W*s\W*c\W*r\W*i\W*p\W*t|\W*f\W*o\W*r\W*m|\W*s\W*t\W*y\W*l\W*e|\W*s\W*v\W*g|\W*m\W*a\W*r\W*q\W*u\W*e\W*e|(?:\W*l\W*i\W*n\W*k|\W*o\W*b\W*j\W*e\W*c\W*t|\W*e\W*m\W*b\W*e\W*d|\W*a\W*p\W*p\W*l\W*e\W*t|\W*p\W*a\W*r\W*a\W*m|\W*i?\W*f\W*r\W*a\W*m\W*e|\W*b\W*a\W*s\W*e|\W*b\W*o\W*d\W*y|\W*m\W*e\W*t\W*a|\W*i\W*m\W*a?\W*g\W*e?|\W*v\W*i\W*d\W*e\W*o|\W*a\W*u\W*d\W*i\W*o|\W*b\W*i\W*n\W*d\W*i\W*n\W*g\W*s|\W*s\W*e\W*t|\W*i\W*s\W*i\W*n\W*d\W*e\W*x|\W*a\W*n\W*i\W*m\W*a\W*t\W*e)[^>\w])|(?:<\w[\s\S]*[\s\0\/]|['"])(?:formaction|style|background|src|lowsrc|ping|on(?:d(?:e(?:vice(?:(?:orienta|mo)tion|proximity|found|light)|livery(?:success|error)|activate)|r(?:ag(?:e(?:n(?:ter|d)|xit)|(?:gestur|leav)e|start|drop|over)?|op)|i(?:s(?:c(?:hargingtimechange|onnect(?:ing|ed))|abled)|aling)|ata(?:setc(?:omplete|hanged)|(?:availabl|chang)e|error)|urationchange|ownloading|blclick)|Moz(?:M(?:agnifyGesture(?:Update|Start)?|ouse(?:PixelScroll|Hittest))|S(?:wipeGesture(?:Update|Start|End)?|crolledAreaChanged)|(?:(?:Press)?TapGestur|BeforeResiz)e|EdgeUI(?:C(?:omplet|ancel)|Start)ed|RotateGesture(?:Update|Start)?|A(?:udioAvailable|fterPaint))|c(?:o(?:m(?:p(?:osition(?:update|start|end)|lete)|mand(?:update)?)|n(?:t(?:rolselect|extmenu)|nect(?:ing|ed))|py)|a(?:(?:llschang|ch)ed|nplay(?:through)?|rdstatechange)|h(?:(?:arging(?:time)?ch)?ange|ecking)|(?:fstate|ell)change|u(?:echange|t)|l(?:ick|ose))|m(?:o(?:z(?:pointerlock(?:change|error)|(?:orientation|time)change|fullscreen(?:change|error)|network(?:down|up)load)|use(?:(?:lea|mo)ve|o(?:ver|ut)|enter|wheel|down|up)|ve(?:start|end)?)|essage|ark)|s(?:t(?:a(?:t(?:uschanged|echange)|lled|rt)|k(?:sessione|comma)nd|op)|e(?:ek(?:complete|ing|ed)|(?:lec(?:tstar)?)?t|n(?:ding|t))|u(?:ccess|spend|bmit)|peech(?:start|end)|ound(?:start|end)|croll|how)|b(?:e(?:for(?:e(?:(?:scriptexecu|activa)te|u(?:nload|pdate)|p(?:aste|rint)|c(?:opy|ut)|editfocus)|deactivate)|gin(?:Event)?)|oun(?:dary|ce)|l(?:ocked|ur)|roadcast|usy)|a(?:n(?:imation(?:iteration|start|end)|tennastatechange)|fter(?:(?:scriptexecu|upda)te|print)|udio(?:process|start|end)|d(?:apteradded|dtrack)|ctivate|lerting|bort)|DOM(?:Node(?:Inserted(?:IntoDocument)?|Removed(?:FromDocument)?)|(?:CharacterData|Subtree)Modified|A(?:ttrModified|ctivate)|Focus(?:Out|In)|MouseScroll)|r(?:e(?:s(?:u(?:m(?:ing|e)|lt)|ize|et)|adystatechange|pea(?:tEven)?t|movetrack|trieving|ceived)|ow(?:s(?:inserted|delete)|e(?:nter|xit))|atechange)|p(?:op(?:up(?:hid(?:den|ing)|show(?:ing|n))|state)|a(?:ge(?:hide|show)|(?:st|us)e|int)|ro(?:pertychange|gress)|lay(?:ing)?)|t(?:ouch(?:(?:lea|mo)ve|en(?:ter|d)|cancel|start)|ime(?:update|out)|ransitionend|ext)|u(?:s(?:erproximity|sdreceived)|p(?:gradeneeded|dateready)|n(?:derflow|load))|f(?:o(?:rm(?:change|input)|cus(?:out|in)?)|i(?:lterchange|nish)|ailed)|l(?:o(?:ad(?:e(?:d(?:meta)?data|nd)|start)?|secapture)|evelchange|y)|g(?:amepad(?:(?:dis)?connected|button(?:down|up)|axismove)|et)|e(?:n(?:d(?:Event|ed)?|abled|ter)|rror(?:update)?|mptied|xit)|i(?:cc(?:cardlockerror|infochange)|n(?:coming|valid|put))|o(?:(?:(?:ff|n)lin|bsolet)e|verflow(?:changed)?|pen)|SVG(?:(?:Unl|L)oad|Resize|Scroll|Abort|Error|Zoom)|h(?:e(?:adphoneschange|l[dp])|ashchange|olding)|v(?:o(?:lum|ic)e|ersion)change|w(?:a(?:it|rn)ing|heel)|key(?:press|down|up)|(?:AppComman|Loa)d|no(?:update|match)|Request|zoom))[\s\0]*=
テスト: http://regex101.com/r/rV7zK8
99%XSSをブロックするのは、定期的に更新されるアドオンであるNoScriptの一部だからです
^(\s|\w|\d|<br>)*?$
これにより、文字、数字、空白、および<br>
タグが検証されます。
さらにリスクが必要な場合は、次のようなタグを追加できます
^(\s|\w|\d|<br>|<ul>|<\ul>)*?$
jeffsコードを使用することの最大の問題は、現在利用できない@です。
おそらく<!> quot; raw <!> quot; jeffsコードからの正規表現(必要な場合)
http://www.cis.upenn。 edu /〜matuszek / General / RegexTester / regex-tester.html
そしてエスケープが必要なものがエスケープされるのを見て、それを使用します。
この正規表現の使用を念頭に置いて、他の答えがあなたを助けるように何かをコピー/ペーストする前に、私が何をしていたのか、私が成功しなかった場合の理由と結果を正確に理解したことを個人的に確認します。
(おそらく、コピー/貼り付けにはかなり適切なアドバイスです)
[\s\w\.]*
。一致しない場合は、XSSがあります。多分。この式では文字、数字、およびピリオドのみが許可されることに注意してください。 XSSを恐れて、すべてのシンボル(有用なシンボルも含む)を回避します。 <!> amp;を許可すると、心配があります。そして、単に<!> ampのすべてのインスタンスを置き換えます。 &
では不十分です。信頼するには複雑すぎる:P。明らかにこれは多くの正当なテキストを禁止します(一致しないすべての文字を!または何かで置き換えることができます)が、XSSを殺すと思います。
単にhtmlとして解析し、新しいhtmlを生成するというアイデアはおそらく優れています。
古いスレッドですが、これは他のユーザーにとっても便利でしょう。 php用のメンテナンスされたセキュリティレイヤーツールがあります: https://github.com/PHPIDS/ に基づいていますここにある正規表現のセット:
https://github.com/PHPIDS/PHPIDS/ blob / master / lib / IDS / default_filter.xml
この質問は、計算理論の研究の素晴らしい応用を完全に示しています。計算理論は、コンピューターの数学的表現の作成に焦点を当てた分野です。
計算理論の最も深い研究のいくつかは、さまざまな言語の関係を示す証明です。
計算理論家が証明した言語関係には、次のものがあります。
これは、文脈自由言語が通常の言語よりも強力であることを示しています。したがって、言語が明示的にコンテキストフリー(コンテキストフリーであり、正規ではない)である場合、任意の正規表現が言語を認識することは不可能です。
JavaScriptは少なくともコンテキストに依存しないため、すべてのXSSをキャッチできる正規表現(regex)を設計することは不可能なタスクであることは100%の確実性でわかっています。