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> </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>
我的猜测是这些实体未通过 HTML Purifier 用于检查 HTMLPurifier_EntityParser
、here:
中的有效实体的正则表达式
$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
键下,问题消失了。
我正在使用 laravel html purifier 程序包在存储到数据库之前从任何 xss 中净化我的富文本。
但是我的富文本允许 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>
我的猜测是这些实体未通过 HTML Purifier 用于检查 HTMLPurifier_EntityParser
、here:
$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
.
我现在无法为您执行这些步骤 proof-of-concept(尤其是在 Laravel 的情况下),但您应该能够在 purifier.php
文件,在 return
.
我通过将键 Core.EscapeNonASCIICharacters
设置为 true
在我的 purifier.php
文件中的 default
键下,问题消失了。