【问题标题】:Using SafeCracker in ExpressionEngine Strips HTML and CSS Inline Styles在 ExpressionEngine 中使用 SafeCracker 去除 HTML 和 CSS 内联样式
【发布时间】:2011-06-23 23:22:37
【问题描述】:

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

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

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

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

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

如您所见,内联 CSS 样式已被删除,但 HTML 的其余部分保持不变。

我希望允许用户能够提交 HTML 代码,并且不让 SafeCracker 删除内联 CSS 样式。我怎样才能做到这一点?

【问题讨论】:

    标签: php forms expressionengine safecracker


    【解决方案1】:

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

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

    感谢我们,EllisLab 的工程师提供了一种秘密的、未记录的方式,将 SafeCracker 中使用的 fieldtypesfield_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 过滤器的字段“列入白名单”,只需将 fieldtypefield_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 的任何升级都可能会覆盖此文件,因此您可能需要更改文件的权限或随身携带备份。

    应该非常认真地对待跨站点脚本,因为您绝不会希望您的站点成为攻击媒介的来源。总是小心谨慎。

    【讨论】:

    • @rjb 感谢您的详细解释。但是为什么这只发生在EE2.2而不是EE2.0。我从来没有遇到过在 EE2.0 中删除内联样式的问题。这只是 2.2 中的情况。
    • 内置的 XSS 清理方法正在不断调整以提高安全性和性能,因此它可能在版本之间发生了变化。您可能还想检查您的Channel Posting Preferences 并确认您有 允许所有 HTML 设置 频道条目中的默认 HTML 格式
    • 是的,我已经允许所有 HTML。您是否能够查明这两个版本之间的 XSS 清理实际上是否有任何不同。
    • 还有内联样式会如何带来任何 xss 风险。
    • 我可以建议你在官方 EE 支持论坛发帖吗,因为 SC 现在是第一方模块?
    猜你喜欢
    • 2010-11-12
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多