当前位置: 首页 > 知识库问答 >
问题:

将“不安全内联”代码从元素移除到单独脚本的最佳实践

詹夕
2023-03-14

所以,背景是我是一个相当大的CMS的开发人员。数十万行代码。

因此,在实现内容安全策略时,我被迫对style-src和script-src指令使用“unsafe-inline”,因为CMS在元素中输出了大量内联CSS以及用于脚本编写的大量onclick-attributes。

为了提取内联样式,我更新了创建实际HTML的代码,以生成内联样式的crc32散列,将一个类应用于元素,然后在具有nonce-attribute的style标记中单独打印所有CSS。最终结果看起来是这样的:

对于内联脚本,或者更确切地说是onclick属性,我做了类似的事情,创建命令的crc32,将其作为元素的内联类添加,然后将其添加到脚本标记中。问题是,我使用jQuery将这些事件附加到元素,而旧的live()函数不推荐使用,所以我将它作为click事件附加到body元素上,这样隐藏的元素仍然会被激发。最终结果看起来是这样的:

所以,所有这些都是以前的或类似的东西。我想知道这个修复的最佳实践是什么。

并且在您建议这些实例中的每一个都应该将它们的动作附加得更符合逻辑或者用某种形式的内部逻辑来代替,以使它们触发正确的命令之前--我同意!但这是一大堆代码!我的第一步是做一个修复,然后开始对每个实例进行寻址,以做一个更漂亮的修复。

那么有没有更好的方法来处理这件事呢?

共有1个答案

郦楷
2023-03-14

好吧,所以我可能找到了变通办法。如果我的系统要打印此代码:

<a onclick="dialog('/url.php')">Do stuff</a>

我的代码现在输出如下:

<a data-cmd="dialog" data-arg="/url.php">Do stuff</a>

然后我有一个全局代码:

$("body").on("click", "[data-cmd]", function(){
    switch ($(this).attr("data-cmd")){
        case "dialog" : dialog($(this).attr("data-arg")); break;
        case "bbe" : bbe($(this).attr("data-arg")); break;
        case "visa" : visa($(this).attr("data-arg")); break;
        case "svisa" : svisa($(this).attr("data-arg")); break;
        case "pop" : pop($(this).attr("data-arg")); break;
        case "dialog" : dialog($(this).attr("data-arg")); break;
        default: return false;
    }
    return false;
})

因此,使用它,我就可以拥有一个可以出现在data-cmd中的各种命令的安全列表,而且我不必eval()任何东西,这违反了内容安全策略。

我确信我会发现很多这不起作用的异常值(我可以想象onclick=“hide('EL1');show('EL2')”失败了,但是我可以回退到我以前的修复程序中,并用nonce将它们放入单独的脚本块中。“hide('EL1');show('EL2')”不起作用(我可以想象onclick=“hide('EL1');show('EL2')”失败了。

 类似资料:
  • 下面,我们将会回顾常见的安全原则,并介绍在使用 Yii 开发应用程序时,如何避免潜在安全威胁。 大多数这些原则并非您独有,而是适用于网站或软件开发, 因此,您还可以找到有关这些背后的一般概念的进一步阅读的链接。 基本准则 无论是开发何种应用程序,我们都有两条基本的安全准则: 过滤输入 转义输出 过滤输入 过滤输入的意思是,用户输入不应该认为是安全的,你需要总是验证你获得的输入值是在允许范围内。 比

  • Overview The term “production” refers to the stage in the software lifecycle when an application or API is generally available to its end-users or consumers. In contrast, in the “development” stage, y

  • 本文向大家介绍Lua table中安全移除元素的方法,包括了Lua table中安全移除元素的方法的使用技巧和注意事项,需要的朋友参考一下 在Lua中,table如何安全的移除元素这点挺重要,因为如果不小心,会没有正确的移除,造成内存泄漏。 引子 比如有些朋友常常这么做,大家看有啥问题 将test表中的偶数移除掉 打印结果: 有问题吧,20怎么还在?这就是在遍历中删除导致的。 如何做呢? Let'

  • 我正在从chargebee.com加载外部脚本,并在控制台中收到此错误消息: [仅报告]拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src'nonce VVZ V0c=''self'https://maps.googleapis.com https://domain.chargebeestatic.com http://dgkxwewtzsnml.cloudfront.ne

  • 本篇文档的目的在于如何让系统管理员或开发者用尽可能少的时间部署一个安全的 web 站点或应用,即 SSL 和 TLS 部署最佳实践。

  • 我有一个xml。我想要元素