SafeCracker 使用内置的 ExpressionEngine XSS 清理方法从跨站点脚本 (XSS) 和 SQL 注入漏洞中清除用户提交的输入。
任何前端用户输入$this->EE->security->xss_clean()
在插入数据库或输出到屏幕之前都会使用 using 进行清理。
值得庆幸的是,EllisLab 的工程师提供了一种秘密的、未记录的方式,将SafeCracker中使用的字段类型和field_id列入“白名单”,并使其免受 XSS 过滤。
要阻止SafeCracker从给定字段中删除所有 HTML,请打开以下文件,具体取决于您正在运行的 ExpressionEngine 版本:
EE 2.1.3 或更早版本(SafeCracker 作为第三方插件安装)
/system/expressionengine/third_party/safecracker/libraries/safecracker_lib.php
EE 2.2.0 或更高版本(SafeCracker 作为第一方模块安装)
/system/expressionengine/modules/safecracker/libraries/safecracker_lib.php
注意:ExpressionEngine 2.2.0 将 SafeCracker 捆绑为第一方模块,因此您的安装位置将取决于您正在运行或升级的版本。
向下滚动到第 2371 行(对于 EE 2.1.3)或第 2516 行(对于 EE 2.2)并查找以下内容:
$this->skip_xss_fieldtypes = array();
$this->skip_xss_field_ids = array();
这就是乐趣开始的地方。要将应用 XSS 过滤器的字段“列入白名单”,只需将fieldtype或field_id添加到任一数组即可。
这是一个例子:
$this->skip_xss_fieldtypes = array(
// This is the fieldtype as specified in the Control Panel
// Channel Fields, not what you use in your SafeCracker template
'textarea'
);
$this->skip_xss_field_ids = array(
// This is the field_id from the exp_channel_data MySQL Table
'field_id_1'
);
您可以指定某种类型的fieldtype(textarea、input 等),或者如果您希望更明确,可以指定field_id 。前一种方式更通用,而后者是绝对的,如果自定义字段要更改其类型,则更加灵活。
通过这些更改,您免除 XSS 清理方法的任何字段将不再应用任何过滤,并允许将任意 HTML 提交到数据库中!
请记住,对 ExpressionEngine 的任何升级都可能覆盖此文件,因此您可能需要更改文件的权限或随身携带备份。
应该非常认真地对待跨站点脚本,因为您永远不会希望您的站点成为攻击向量的来源。总是在谨慎方面犯错。