CSP style-src: 'unsafe-inline' - 值得吗?

CSP style-src: 'unsafe-inline' - is it worth it?

目前,我在我的所有网站上都使用 Modernizr,事实证明,由于它的工作方式,它需要允许 unsafe-inline 样式。我已经不允许内联脚本和脚本的不安全评估。想知道允许内联样式存在哪些安全风险吗?

允许内联样式会使您容易受到 "other XSS" 的影响。跨站点样式攻击。

这里的想法是,用户可以在您的文档中插入样式属性的任何地方,他们可以按照他们想要的方式修改您的页面的外观。我将列出几个按严重程度递增排序的潜在攻击:

  1. 他们可以把你的页面变成粉红色,让它看起来很傻。
  2. 他们可能会修改您页面的文本,让您看起来像是在说冒犯性的话,可能会冒犯您的读者群。
  3. 他们可以让用户生成的内容(例如他们提供的 link 出现在人们期望看到用户内容的正常位置之外,使其看起来像是官方的。 (例如,将您网站上的 "Login" 按钮替换为他们自己的 link)。
  4. 使用精心设计的样式规则,他们可以将页面上包含的任何信息发送到外部域,并公开或以其他方式恶意使用该数据来对付您的用户。

第四个示例,尽管有 unsafe-inline,但可以完全防止信息泄露到外部域,前提是您确保您的其他 CSP 规则绝不允许任何类型的请求进入不受信任或通配符领域。但是如果你错过了在某处阻止样式属性,前 3 个总是可能的。

Mike West did a good talk 几年前的 CSSConf 上有更多示例。

我个人认为 CSS 不使用 unsafe-inline 是不切实际的。这意味着我必须为每种样式使用外部样式 sheet 文件。着色文本,居中文本等。它可以完成。您可以通过使用主样式 sheet“main.css”和每个页面的文件 sheet(“index.css”、“contect.css”等)来完成此操作).然而,我并没有傻到允许任意代码执行;我过滤掉所有更少然后磨碎的迹象。我认为这是一个不合理的限制。阻塞内联 JavaScript 并不像阻塞内联 CSS 那样糟糕。我可以看到阻塞内联 JavaScript。但是我不认为我会做那个以太。如果你小心地过滤你的 less then 和 grater then 标志(除了不过滤这些你还可以做一些其他愚蠢的事情)如果你不犯允许任意代码执行的愚蠢错误那么你是安全的。创建这些内联块只是为了保护以允许任意代码执行的方式搞砸代码的 Web 开发人员。但是这些块使编码变得有点困难。所以这是一个权衡。

TLDR 恕我直言不值得阻止内联 CSS,值得阻止内联 JavaScript 但不必要。我不会考虑阻塞内联 CSS,我不会阻塞内联 JavaScript 但我可能会考虑它。

经验:我是一名网页设计师,使用 HTML CSS JavaScript 和 PHP 在代码中进行设计。我有自己的网站,我手工编码。我使用官方 w3 验证器进行验证。我跟上网页设计标准,例如 HTML5.