xssの脆弱性を防ぐために、新しいプロジェクトにantisamyを使用しています。このアプリケーションでは、ユーザーは単純な(ansiエンコードされた)Excelファイルでコンテンツをアップロードできます。一部のhtmlを挿入することは可能ですが、javascriptなどを挿入することはできません。
antisamyを使用して入力をスキャンすると、次のエラーが発生します。タグに処理できない属性が含まれていました。href属性の値は「https&#5 8;&#4 7;&#4 7; bla&#4 6; bla&#4 6; com&#4 7; bla/...」でした。この値は、セキュリティ上の理由から受け入れることができませんでした。入力の処理を続行するために、タグをフィルタリングすることを選択しました。
あなたがそれを見ることができるように、私はエンティティにいくつかのスペースを追加しました。
(ただし、 https://bla.bla.com/bla/のようになります...)
コードを介してデバッグすると、「汚染されたHtml入力」とそのhref属性が正しいように見えます(したがって、Excelファイルのエンコードに問題はありません)。
antisamy-policyファイルは次のようになります。
...
<regexp name="onsiteURL" value="([\w\\/\.\?=&;#-~]+|#(\w)+)"/>
<regexp name="offsiteURL" value="(\s)*((ht|f)tp(s?)://|mailto:)[A-Za-z0-9]+[~a-zA-Z0-9-_\.@#$%&;:,\?=/\+!]*(\s)*"/>
...
<attribute name="href">
<regexp-list>
<regexp name="onsiteURL"/>
<regexp name="offsiteURL"/>
</regexp-list>
<literal-list>
<literal value="javascript:void(0)"/>
</literal-list>
</attribute>
...
また、正規表現パターンをテストしましたが、リンクは有効だと思いました。もちろん、htmlエンティティによってエンコードされている場合はそうではありません。
だから問題は何ですか?
よろしくお願いします
AntiSamyコードを少しデバッグしたところ、問題が発生しましたが、問題を解決できません。htmlentitiesは、検証後にantisamyによって追加されました(HTMLページに印刷する場合)。しかし、私の入力は、AntiSamyライブラリのorg.cyberneko.html.parsers.DOMFragmentParserによって、次のステートメントで解析されます。parser.parse(new InputSource(new StringReader(html))、dom); 私のタグでは、href属性に次のようなものが含まれています:https://bla.bla.com/bla?frame = Frameset [undefinable character] lang = en insted of https://bla.bla.com/bla?frame = Frameset&lang = en
したがって、アンパサンドがアンパサンドではなくなるというのは、エンコーディングの問題のようです。どのエンコーディングを使用すべきかをどのように見つけることができますか?
編集:キャラクターはE28CA9->⟨