如何逃脱特殊角色?

How to escape special charcters?

提问人:Omar Elewa 提问时间:4/16/2022 最后编辑:Omar Elewa 更新时间:10/27/2022 访问量:346

问:

我正在使用一个 html 净化器包,用于在存储到数据库中之前从任何 xss 中净化我的富文本。

但是我的富文本允许使用特殊字符作为 or 的 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>

特殊字符 htmlpurifier

评论


答:

1赞 pinkgothic 4/17/2022 #1

我的猜测是,这些实体未能通过HTML Purifier用来检查有效实体的正则表达式,这里HTMLPurifier_EntityParser

         $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])".
             ')/';

请注意,它期望数字实体当前如何开始。(这是完全理智的,因为它被设计为处理纯HTML,没有附加组件,并确保它安全;但在你的用例中,你需要更多的实体灵活性。0

您可以扩展该类并覆盖构造函数(在这些正则表达式被定义的地方,通过定义您自己的正则表达式,从正则表达式的部分中删除),实例化它,尝试设置使用实例化的 EntityParser 对象创建的 Lexer(这是我最不确定它是否可行的部分;您可能还必须创建一个 Lexer 补丁), 然后使用 Core.LexerImpl 将更改后的词法分析器提供给配置。0*// dec$this->_entity_parserHTMLPurifier_Lexer::create($config)extends

我现在没有这些步骤的概念验证(尤其是在 Laravel 的上下文中),但您应该能够在 .purifier.phpreturn

评论

0赞 Omar Elewa 4/17/2022
非常感谢您的回答,我找到了一个更简单的解决方案,只需在我的配置文件中将 Core.EscapeNonASCIICharacters 设置为 true。
0赞 Omar Elewa 4/17/2022
但是我遇到了另一个问题^--^ stackoverflow.com/questions/71898104/...如果你能给我任何帮助,我将不胜感激。
1赞 Omar Elewa 4/17/2022 #2

我通过将键Core.EscapeNonASCIICharacters设置为true来解决问题

在我的文件中的键下,问题已经消失了。defaultpurifier.php