Laravel mews/purifier - 如何转义特殊字符?

Laravel mews/purifier - How to escape special charcters?

我正在使用 laravel html purifier 程序包在存储到数据库之前从任何 xss 中净化我的富文本。

但是我的富文本允许 Wiris 符号使用特殊字符作为 → 

问题是包不允许我转义这些字符。它完全删除它们。 我应该怎么做才能逃脱他们??

净化前的字符串示例

<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>x</mi><mn>2</mn></msup><mo>&#160;</mo><mo>+</mo><mo>&#160;</mo><mmultiscripts><mi>y</mi><mprescripts/><none/><mn>2</mn></mmultiscripts><mo>&#160;</mo><mover><mo>&#8594;</mo><mo>=</mo></mover><mo>&#160;</mo><msup><mi>z</mi><mn>2</mn></msup><mo>&#160;</mo></math></p>

净化后

<p><math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>x</mi><mn>2</mn></msup><mo> </mo><mo>+</mo><mo> </mo><mmultiscripts><mi>y</mi><mprescripts></mprescripts><none><mn>2</mn></mmultiscripts><mo> </mo><mover><mo>→</mo><mo>=</mo></mover><mo> </mo><msup><mi>z</mi><mn>2</mn></msup><mo> </mo></math></p>

我的猜测是这些实体未通过 HTML Purifier 用于检查 HTMLPurifier_EntityParserhere:

中的有效实体的正则表达式
         $this->_textEntitiesRegex =
             '/&(?:'.
             // hex
             '[#]x([a-fA-F0-9]+);?|'.
             // dec
             '[#]0*(\d+);?|'.
             // string (mandatory semicolon)
             // NB: order matters: match semicolon preferentially
             '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
             // string (optional semicolon)
             "($semi_optional)".
             ')/';
 
         $this->_attrEntitiesRegex =
             '/&(?:'.
             // hex
             '[#]x([a-fA-F0-9]+);?|'.
             // dec
             '[#]0*(\d+);?|'.
             // string (mandatory semicolon)
             // NB: order matters: match semicolon preferentially
             '([A-Za-z_:][A-Za-z0-9.\-_:]*);|'.
             // string (optional semicolon)
             // don't match if trailing is equals or alphanumeric (URL
             // like)
             "($semi_optional)(?![=;A-Za-z0-9])".
             ')/';

注意它目前如何期望数字实体以 0 开头。 (非常理智,因为它旨在处理没有 add-ons 的纯 HTML,并确保其安全;但在您的 use-case 中,您需要更多的实体灵活性。)

您可以扩展 class 并覆盖构造函数(在定义这些正则表达式的地方,通过定义您自己的构造函数,您从 // dec 部分中删除 0*正则表达式),实例化它,尝试在使用 HTMLPurifier_Lexer::create($config) 创建的 Lexer 上将 $this->_entity_parser 设置为实例化的 EntityParser 对象(这是我最不确定它是否有效的部分;您可能必须创建一个 Lexer也使用 extends 进行修补),然后使用 Core.LexerImpl.

将更改后的 Lexer 提供给配置

我现在无法为您执行这些步骤 proof-of-concept(尤其是在 Laravel 的情况下),但您应该能够在 purifier.php 文件,在 return.

之前

我通过将键 Core.EscapeNonASCIICharacters 设置为 true

解决了这个问题

在我的 purifier.php 文件中的 default 键下,问题消失了。