amazon-web-services - 使用 CloudFront 函数将 X-Frame-Options 标头添加到所有 URL
问题描述
我有一个单页应用程序,我试图通过将 X-Frame-Options 标头添加到 HTML 响应来防止点击劫持。我的网站通过 CloudFront 托管在 S3 上。
CloudFront 分配配置为index.html
默认发送:
Default root object
index.html
在错误页面部分,我将 404 页面配置为也指向index.html
. 这样,所有不在 S3 中的 URL 都会返回默认的 HTML,即/login
,/admin
等等。
然后我创建了一个 CloudFront 函数,如此处所述,并将其分配给查看器响应:
function handler(event) {
var response = event.response;
var headers = response.headers;
headers['x-frame-options'] = {value: 'DENY'};
return response;
}
这有效,但仅适用于/
:
curl -v https://<MYSITE.com>
....
< x-frame-options: DENY
对于其他 URL,它不起作用 - 缺少 x-frame-options 标头:
curl -v https://<MYSITE.com>/login
....
< x-cache: Error from cloudfront
我的问题是 - 为什么我的 cloudfront 函数没有在错误响应中附加标头,我该怎么做才能添加它?
解决方案
我了解您的问题是:
- Q1:为什么 CloudFront 功能适用于
/
? - Q2:为什么 CloudFront 功能不适用于其他 url 路径?
请参考以下回复:
- A1:因为您可能会指定一个
Default Root Object
[1](例如index.html
),它在用户请求根 URL 时返回对象。当 CloudFront 返回带有 的对象时200 ok
,将对viewer response
事件调用 CloudFront 函数。 - A2:您可能没有
s3:ListBucket
在您的 S3 存储桶策略中授予权限(例如OAI)。结果,您将收到Access Denied
(403) 丢失对象的错误,而不是 404 Not Found 错误。即,Error Pages
您配置的 不适用于这种情况,并且不会调用 CloudFront 函数,因为 HTTP 状态码高于 399 [2]。
[Updated]
建议:
viewer response
因为当源返回 HTTP 状态代码 400 或更高时,CloudFront 不会为事件调用边缘函数。origin response
但是,会为所有源响应调用事件的Lambda@Edge 函数。在这个场景中,我建议我们应该使用 Lambda@Edge 而不是 CloudFront 函数。- 为方便起见,请参考l@e的示例代码:
exports.handler = async (event, context) => {
const response = event.Records[0].cf.response;
const headers = response.headers;
headers['x-frame-options'] = [{
key: 'X-Frame-Options',
value: 'DENY',
}];
return response;
};
- 供参考。这是我的卷曲测试结果:
# PATH: `/`
$ curl -sSL -D - https://dxxxxxxx.cloudfront.net/
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 12
Connection: keep-alive
ETag: "e59ff97941044f85df5297e1c302d260"
___snipped___
Server: AmazonS3
X-Frame-Options: DENY
___snipped___
# PATH: `/login`
$ curl -sSL -D - https://dxxxxxxx.cloudfront.net/login
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 12
Connection: keep-alive
ETag: "e59ff97941044f85df5297e1c302d260"
___snipped___
Server: AmazonS3
X-Frame-Options: DENY
___snipped___
推荐阅读
- python - 遍历列表(产量)
- view - ASP.NET Core MVC 应用程序:我想在提交和渲染相同的数据后显示相同的视图但有问题
- django - Djoser 更改电子邮件语言
- python - 在某些系统上提供 URL 时,launch_default_for_uri() 会引发异常
- c++ - 对压倒一切现象的困惑
- javascript - 如何循环并返回 javascript 对象的值?
- typescript - 带点的打字稿别名
- javascript - Eslint 正在观看 eslintignore 中的文件
- spring - 如何使 HATEOAS 呈现空的嵌入式数组
- node.js - 异步/等待不工作 AWS lambda,等待后跳过所有内容