在众多插件和主题中,开发人员将为管理员级用户提供一个选项,让他们输入自己的额外CSS(显然是为了定制输出)。一些插件和主题还提供了添加Javascript的选项。在大多数情况下,输入将从textarea发布,并添加到现有的样式表文件或发送到wp_head
.
通常,包括拥有100000用户的插件,唯一的安全措施是nonce。
现在,对我来说,对于这个特定的功能来说,暂时的情况似乎已经足够了:如果一个站点已经被破坏到具有管理员权限的用户自己输入恶意脚本的程度,那么这种情况似乎相当绝望。。。
然而,一些开发人员似乎认为,通过$\\u POST变量将CSS代码发送到处理它并将其添加到选项表,然后添加到特定页面标题的函数中,可以截取和修改CSS代码。我不明白这到底是怎么回事,再次假定管理员的行为是负责任的。不是说这不可能发生,只是不知道而已。(有人想解释一下吗?)
WordPress本身不包括CSS清理器或验证器,也不包括CSSTidy类型的功能,但具有高度安全意识的开发人员有时会尝试模拟Jetpack或WordPress核心实践,添加CSSTidy或CSS解析器,以消除漏洞。讨论了这个问题,并提出或概述了一些方法或途径here 和here .
目前,我正在考虑将以下内容应用到$\\u后期处理函数中-所讨论的变量是“style”:
$style = filter_input(
INPUT_POST, \'style\', FILTER_CALLBACK, array( \'options\' => \'tidystyle\' )
) ;
被调用的函数看起来是这样的(实际函数的前四行来自上面链接的两个堆栈交换/溢出问题中的第一个)
/* Belt and Suspenders CSS TIDIER
* STYLESHEET ENTERED BY ADMIN ONLY, PROCESSED ONLY WITH SECURITY NONCE
*/
function tidystyle( $css ) {
$css = str_replace( \'/-moz-binding/\', \'\', $css );
$css = str_replace( \'/expression/\', \'\', $css );
$css = str_replace( \'/javascript/\', \'\', $css );
$css = str_replace( \'/vbscript/\', \'\', $css );
$css = str_replace( \'@import\', \'\', $css ) ;
//took this next one from wp-includes/formatting.php
//it underlies sanitize_textarea_field()
//I like it because it doesn\'t bother ">" in the absence of "<"
//and also allows for $newlines
$css = _sanitize_text_fields( $css, TRUE) ;
return $css;
}
然而,我想知道
any 其中,或者更为成熟的CSSTidy/HTML Purify等方法,对于这种特殊类型的使用来说是非常必要或可取的,或者可以实现任何有意义的功能:管理级用户通过textarea输入添加自定义CSS。
(PS刚刚注意到回调函数中调用的函数-_sanitize_text_fields
- 显然是从WP 4.7开始的-所以使用时要小心!)