我在ExpressionEngine中有一个用SafeCracker构建的表单。其中一个文本区域字段用于允许用户提交HTML代码。
以下是他们将提供的代码类型的示例:
<div style="left: 385px; top: 137px;" class="aaa"></div>。
当提交表单并将条目保存到数据库时,SafeCracker会去掉内联CSS样式。实际保存到数据库的结果是:
<div class="aaa"></div>。
正如您所看到的,内联CSS样式正在被移除,但HTML的其余部分保持不变。
我想让用户能够提交超文本标记语言代码,而不是有SafeCracker剥离的内联CSS样式(S)。我如何才能做到这一点呢?
发布于 2011-06-24 11:19:18
SafeCracker使用内置的ExpressionEngine XSS Sanitization Method清除用户提交的来自跨站点脚本和Scripting漏洞的输入。
在将任何前端用户输入插入数据库或输出到屏幕之前,都会使用$this->EE->security->xss_clean()对其进行清理。
谢天谢地,EllisLab的工程师们提供了一种秘密的、没有文档记录的方法,可以将EllisLab中使用的字段类型和field_ids列入“白名单”,并免除它们的过滤。
要阻止SafeCracker从给定域中剥离所有超文本标记语言,请打开以下文件,具体取决于您运行的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过滤器的字段列入“白名单”,只需将字段类型或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的任何升级都可能会覆盖此文件,因此您可能希望更改该文件的权限或保留备份。
应该非常认真地对待跨站点脚本,因为您永远不会希望您的站点成为攻击载体的来源。总是在谨慎的一面犯错误。
https://stackoverflow.com/questions/6461763
复制相似问题