gpt4 book ai didi

javascript - 将带有随机数的 CSP header 添加到 Lambda Edge

转载 作者:行者123 更新时间:2023-12-05 07:03:31 26 4
gpt4 key购买 nike

我是一名运维人员,我正在建立一个需要实现安全 header 的网站。

我已经使用我需要的 header 创建了一个 Lambda@Edge 函数,它工作正常,但我想为 style-src 添加一个随机数,因为我们正在调用外部 URL(谷歌字体等)。我发现的大多数指南只使用“self”而不使用其他 URL。 SO 上还有一个关于此的问题,但响应不起作用,因为我使用的是 Origin Request 而不是 Origin Response。

我可以将它添加到 Lambda@Edge 函数吗?我有一些生成随机数的 nodejs 代码,但是当我尝试将它添加到 style-src 部分时,它会忽略它。我不懂 JS,所以这对我来说很难解决。

如果这不是正确/最佳方法,我愿意接受任何将随机数与 CSP 和 Lambda@Edge 结合使用的方法。

这是我的 Lambda@Edge 代码。

'use strict';
exports.handler = (event, context, callback) => {

//Get contents of response
const response = event.Records[0].cf.response;
const headers = response.headers;


//Set new headers
headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubdomains; preload'}];
headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'self'; frame-ancestors 'none'; connect-src https://dev.example.io https://api.exampleapi.io; img-src 'self' data: https://examplebucket.s3.region.amazonaws.com; script-src 'self'; font-src 'self' https://fonts.example.com; style-src 'self' https://fonts.example.com; object-src 'none'"}];
headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}];
headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}];
headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}];
headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}];

//Return modified response
callback(null, response);
};

这是我用于生成随机数的代码,可以在本地运行。

const crypto = require('crypto');
let nonce = crypto.randomBytes(16).toString('hex');

最佳答案

我注意到,当您使用 CloudFront 事件 Origin RequestOrigin Response 作为 lambda@edge 函数的触发器时,您只会在这种情况下生成随机数如果有缓存未命中。但据我了解,每个 HTTP 请求都需要一个随机数。这表明您需要使用其他事件之一(查看器请求或查看器响应),但另一方面这会为每个 HTTP 请求触发您的函数(无论您请求的对象是否在缓存中),什么可能对您网站的访问量产生高额成本。

AWS 在此处详细描述了所有 CloudFront 事件: CloudFront Events That Can Trigger a Lambda Function

您在这里没有提到的一件事是,不仅需要为 CSP header 生成随机数,还需要将随机数添加到您的 HTML 页面(例如,通过将所有 <script> 标记替换为 <script nonce="r@nd0m"> 。它是可以在 lambda@edge 函数中执行此操作,方法是从 S3 存储桶中读取所需的对象并如上所述替换所有脚本标签。但是您需要了解 AWS lambda@edge 限制(例如,响应的大小是由 Lambda 函数生成)。在此处检查限制:Restrictions on using Lambda functions with CloudFront

我已经找到了在使用随机数创建 CSP 时不使用 lambda@edge 函数的解决方案。因此,您不使用 lambda@edge,例如将 API 网关与 Lambda 结合使用。看这里(尝试 3:Route53、CloudFront、S3、API 网关、Lambda):My experience getting an A+ from Mozilla’s Observatory tool on AWS

关于javascript - 将带有随机数的 CSP header 添加到 Lambda Edge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63178621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com