SafeCracker 使用内置的 ExpressionEngine XSS Sanitization Method 从跨站脚本 (XSS) 和 SQL 注入漏洞中清除用户提交的输入。
在插入数据库或输出到屏幕之前,使用 $this->EE->security->xss_clean() 对任何前端用户输入进行清理。
感谢我们,EllisLab 的工程师提供了一种秘密的、未记录的方式,将 SafeCracker 中使用的 fieldtypes 和 field_ids 列入“白名单”,并使其免受 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、输入等),或者如果您希望更明确,可以指定 field_id。前一种方式更通用,而后一种方式是绝对的,如果自定义字段要更改其类型,则更加灵活。
通过这些更改,您免除 XSS 清理方法的任何字段将不再应用任何过滤,并允许将任意 HTML 提交到数据库中!
请记住,对 ExpressionEngine 的任何升级都可能会覆盖此文件,因此您可能需要更改文件的权限或随身携带备份。
应该非常认真地对待跨站点脚本,因为您绝不会希望您的站点成为攻击媒介的来源。总是小心谨慎。