我正在采用 Twig(一个 php 模板框架)的一些代码来转义 html 和 js 输出。现在我不完全理解他们使用的正则表达式。
对于完整的 Twig 代码:
git clone git://github.com/fabpot/Twig.git
// the code is in Core.php in the function twig_escape_filter
他们使用:
preg_replace_callback( '#[^a-zA-Z0-9,\._]#Su' , '_twig_escape_js_callback' , $string ); // for javascript
preg_replace_callback( '#[^a-zA-Z0-9,\.\-_]#Su' , '_twig_escape_html_attr_callback' , $string ); // for html attibutes
回调函数将替换与否定字符类对应的所有内容。
据我所知,这是等价的(去掉一些反斜杠):
'#[^a-zA-Z0-9,._]#Su'
'#[^a-zA-Z0-9,._-]#Su'
现在我们看到,对于 javascript,它们允许使用逗号,我不明白,因为逗号是 javascript 上下文中的控制字符。举一个逗号利用的例子:
// say we have a function call to a javascript function like this
function ajax( timeout, onerror, onsuccess ) {...};
// now assume I get the timeout value from somewhere dodgy (in php)
$timeout = escapeJS( '1000, evilCallback, evilCallback2' );
echo "ajax( $timeout, myErrorHandler, mySuccessHandler );"
请注意,javascript会很乐意忽略额外的参数......
在 html 属性中,想法是防止关闭属性,因此它们不允许空格,因为不带引号的属性很常见,并且在 html4 中也是合法的。但是,我看到属性中使用空格来为元素提供多个类,例如:<tr class="tablerow odd">
. 因此,不允许使用空格可以防止像这样的类属性来自带有模板或其他来源的数据库......
- 鉴于在 xhtml 中禁止使用不带引号的属性,并且我的网站生成 xhtml 严格的文档类型,我可以允许空格吗?
- 我应该禁止 javascript 的逗号吗?