在AWS CloudFront和S3上配置X-Frame-Options响应标头

wae*_*ael 6 amazon-s3 x-frame-options amazon-cloudfront

我试图为由云端服务的亚马逊s3中托管的角度js应用程序设置X-Frame-Options HTTP响应头,我有可能做到吗?

sho*_*ser 11

您可以使用Lambda@Edge函数将 x-frame-options 标头添加到来自 CloudFront/S3 的响应中。lambda 代码在本地边缘位置内运行,但需要在该区us-east-1域内创建和维护。

这里的示例代码使用 nodeJS 6.10 添加响应头

'use strict'; 
 exports.handler = (event, context, callback) => {
   const response = event.Records[0].cf.response; 
   const headers = response.headers; 
   response.headers['x-frame-options'] = [{"key":"X-Frame-Options","value":"SAMEORIGIN"}]; 
   console.log(response.headers); 
   callback(null, response);
 }; 
Run Code Online (Sandbox Code Playgroud)

创建 Lambda 的最终版本,然后将 Lambda 版本的触发器配置设置origin-response为路径模式行为的 CloudFront事件类型。

示例代码将事件记录到 CloudWatch 日志服务以进行调试。如果您还没有,则需要设置一个 lambda 执行 IAM 角色,该角色允许策略允许 CloudWatch 日志操作由edgelambda.amazonaws.com和承担lambda.amazonaws.com

允许将日志写入 CloudWatch 的基本 Lambda 执行策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*",
            "Effect": "Allow"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

允许 Lambda 和 Lambda@Edge 承担角色的信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "edgelambda.amazonaws.com",
          "lambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果 AWS 只是允许在 GUI 中设置 x-frame-options 标头,那会更好,但在此之前,此解决方案有效,并且可以让您的安全审核员满意。


Mo *_*nni -3

是的,您可以在 $http 角度服务中设置标头,如下所示:

$http(method: '<TYPE>', headers: headers, url: <URL>, data: {}).success(...);
var headers = {'X-Frame-Options': ...};
Run Code Online (Sandbox Code Playgroud)