提问人:Omar Elewa 提问时间:4/16/2022 最后编辑:Omar Elewa 更新时间:10/27/2022 访问量:346
如何逃脱特殊角色?
How to escape special charcters?
问:
我正在使用一个 html 净化器包,用于在存储到数据库中之前从任何 xss 中净化我的富文本。
但是我的富文本允许使用特殊字符作为 or 的 Wiris 符号。→
 
问题是包不允许我转义这些字符。它会完全删除它们。 我应该怎么做才能逃脱他们?
纯化前的字符串示例
<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/><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>
净化后
<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>
答:
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_parser
HTMLPurifier_Lexer::create($config)
extends
我现在没有这些步骤的概念验证(尤其是在 Laravel 的上下文中),但您应该能够在 .purifier.php
return
评论
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来解决问题
在我的文件中的键下,问题已经消失了。default
purifier.php
评论