如何使用 CSP 仅阻止通过 HTML 元标记进行重定向

问题描述 投票:0回答:1

场景

假设有以下 HTML 标记,这是成功 XSS 注入尝试的结果:

<!-- this meta tag was successfully injected/prepended -->
<meta http-equiv="refresh" content="3; URL=https://evil.anyhost.it/">

<!-- original markup of the site -->
<html>
  <head>
    <title>...</title>
    <script src="/assets/app.js" type="module"></script>
  </head>
  <body>...</body>
</html>

使用以下内容安全策略将阻止

<meta http-equiv="refresh">
重定向,但也会拒绝加载任何有效脚本,例如
/assets/app.js

Content-Security-Policy:
  default-src 'self';
  object-src 'none';
  base-uri 'none';
  sandbox;

当使用CSP声明

sandbox allow-scripts allow-same-origin
时,可以加载并执行
/assets/app.js
处的脚本,但也允许再次重定向。

问题

哪个内容安全策略会阻止 HTTP 重定向(由注入的

<meta http-equiv="refresh">
负载启动),但仍允许有效的同源脚本?谢谢!

http-headers xss content-security-policy meta-tags websecurity
1个回答
0
投票

为了实现阻止由注入的

<meta http-equiv="refresh">
负载发起的 HTTP 重定向的目标,同时仍然允许有效的同源脚本,您可以利用
script-src
标头中的
Content-Security-Policy
指令以及
'unsafe-inline'
值来授权来自同一来源的内联脚本。不过,请记住,允许
'unsafe-inline'
确实会带来安全隐患,因此在使用此方法时请务必小心。

这是您可以使用的

Content-Security-Policy
标头:

Content-Security-Policy:
  default-src 'self';
  object-src 'none';
  base-uri 'none';
  script-src 'self' 'unsafe-inline';
  sandbox;

说明:

  1. default-src 'self';
    :指定只能从同源加载资源。
  2. object-src 'none';
    :避免加载任何插件或嵌入式资源。
  3. base-uri 'none';
    :禁止使用
    <base>
    标签建立不同的基本 URL。
  4. script-src 'self' 'unsafe-inline';
    :授予脚本从同一源执行的权限,包括内联脚本(通过
    'unsafe-inline'
    )。这对于执行合法脚本
    /assets/app.js
    至关重要。
  5. sandbox;
    :为内容强制实施沙箱环境。

通过使用

'unsafe-inline'
授予内联脚本权限,您实际上允许任何内联脚本在页面上执行。这引入了潜在的安全漏洞,因为注入页面的任何恶意脚本也可能运行。彻底检查和验证作为内联脚本执行的内容至关重要。

请记住,安全涉及权衡,并且应在清楚地意识到所涉及的风险的情况下允许

'unsafe-inline'
。如果可行,请考虑使用随机数或哈希来允许特定的内联脚本,同时最大限度地降低代码注入的风险。

假设数据库中的数据符合所提供的条件,您在

TropicalRepository
中编写的查询方法应该可以正确运行。尽管如此,您的查询方法参数名称中存在一个较小的拼写错误。您使用了
retro
而不是
isRetro
。 Java 命名约定通常使用布尔字段的“is”前缀,因此您的方法应为:

Tropical findByHouseIsAndSignAndIsRetroAndLang
        (Integer house, String sign, Boolean isRetro, String lang);

如果您的查询仍未产生预期结果,您可以检查以下几个方面:

  1. 数据匹配:验证数据库中的数据是否与您尝试检索的条件精确对应。确认

    house
    sign
    isRetro
    lang
    的值是否与查询方法中传入的值完全相同

  2. 数据库配置:验证您的数据库是否已正确配置并链接到您的 Spring Boot 应用程序。

  3. Logging:激活 Spring Data JPA 查询日志记录以观察正在生成和执行的实际 SQL 查询。您可以将以下属性附加到您的

    application.properties
    application.yml
    文件中:

    logging.level.org.springframework.data.jpa=DEBUG
    

    这将在应用程序日志中显示 SQL 查询,帮助识别任何问题。

  4. 命名约定:重新确认

    Tropical
    实体类中的字段名称。字段名称的大小写应与查询方法中使用的大小写匹配。 Java 区分大小写。

  5. 数据类型:验证查询方法中参数的数据类型与实体类中对应字段的数据类型是否一致。

  6. NULL 值:如果任何字段(

    house
    sign
    isRetro
    lang
    )可以采用
    null
    值,您可能需要在查询方法中处理此问题。例如,如果
    isRetro
    null
    ,则查询将不会匹配任何记录。

© www.soinside.com 2019 - 2024. All rights reserved.