在ExpressionEngine中使用SafeCracker剥离HTML和CSS内联样式

时间:2011-06-23 23:22:37

标签: php forms expressionengine safecracker

我在ExpressionEngine中使用SafeCracker构建了一个表单。其中一个textarea字段用于允许用户提交HTML代码。

以下是他们将提供的代码类型示例:

<div style="left: 385px; top: 137px;" class="aaa"></div>

提交表单并将条目保存到数据库后,SafeCracker将删除内联CSS样式。实际保存到数据库的结果是:

<div class="aaa"></div>

正如您所看到的,内联CSS样式正在被删除,但HTML的其余部分仍然保留。

我希望允许用户提交HTML代码,而不是让SafeCracker剥离内联CSS样式。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:3)

SafeCracker使用内置的ExpressionEngine XSS Sanitization Method来清除用户提交的跨站点脚本(XSS)和SQL注入漏洞的输入。

在插入数据库或输出到屏幕之前,使用$this->EE->security->xss_clean()清理任何前端用户输入。

值得庆幸的是,EllisLab的工程师们提供了一种秘密的,无记录的方式,即在SafeCracker中使用“白名单” fieldtypes field_ids ,并免除他们对XSS过滤的影响。< / p>

要阻止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'
);

您可以指定某种类型的字段类型(文本区域,输入等),或者 field_id ,如果您更明确的话。前一种方式更为通用,而后一种方式是绝对的,如果自定义字段会改变其类型,则更灵活。

通过这些更改,您从XSS清理方法中免除的任何字段将不再应用任何过滤,并允许将任意HTML提交到数据库中!

请注意,ExpressionEngine的任何升级都可能会覆盖此文件,因此您可能希望更改文件的权限或保留备份方便。

跨站点脚本应该非常认真,因为您永远不希望您的站点成为攻击媒介的来源。总是犯错误。