云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名注册_网站建设方案范文_年度促销

小七 141 0

使用Cloudflare Workers代理流量以报告URI

以下是Scott Helme的一篇客座帖子,他是一位安全研究员、国际演说家和博客作者。他也是流行音乐的创始人securityheaders.com网站报告-uri.com网站,帮助人们部署更好的安全性的免费工具。随着报表URI的持续增长,我们看到越来越多的网站使用该服务。这种多样性带来了需要满足的额外要求,有些要求很简单,有些要求不那么简单。下面我们将快速了解这些挑战,以及如何使用Cloudflare Worker轻松解决这些挑战。发送CSP报告当浏览器在report URI发送CSP报告供我们收集时,我们接收发送给我们的JSON负载,但是我们还可以访问另外两部分信息,客户端IP和用户代理字符串。我们从不存储、收集或分析客户机IP,我们根本不需要也不想这样做,我们对UA字符串所做的只是提取浏览器名称,如Chrome或Firefox。大多数网站运营商对我们的方法非常满意,一切正常。然而,有些问题是网站运营商根本不想让我们获得这些信息,有些情况下,由于监管机构对他们的限制,他们无法让我们访问这些信息。另一个常见的问题是,我真的从未预料到,它只是将报告端点视为第三方地址。我们有各种不同的方法来解决这些问题。CNAME公司到目前为止,如果客户不想向第三方地址报告,我们会要求他们将子域CNAME给我们,并运行一个专用实例,该实例将使用其子域接收报告。我们负责证书的签发和更新,客户无需再做任何事情。在许多不同的技术需求中,这是一种相当常见的方法,对我们来说效果很好。问题是,它确实会给双方带来一些行政管理费用。从我们这方面来说,管理独立基础设施的技术要求是一个额外的负担,我们负责属于其他人的子域,并且系统中有更多的活动部件,增加了复杂性。我很好奇有没有别的办法。HTTP代理不久前我们和一位客户讨论过一个想法,但从未部署过,那就是让他们在前提下运行代理。它们可以在自己的控制下向自己的端点报告,并简单地将报告转发到它们的报告URI报告地址。这意味着他们可以屏蔽客户机IP,在需要时屏蔽用户代理字符串,并且通常对有效负载执行任何他们喜欢的清理。问题是,这似乎是一个可怕的工作,我更愿意讨论部署报告URI的前提。客户机仍然存在一些风险,比如不小心对其端点进行ddos攻击,这就消除了使用报表URI的一个很好的理由。另寻出路在很大程度上,我们目前的模式运行得非常好,但有些客户有一个强烈的要求,即不直接向我们发送报告。我们的内部部署解决方案还没有准备好,所以我们需要一些我们可以提供的东西,而不需要太多上面提到的开销。那时候我有了一个主意,也许能解决这个问题。飞机上的Javascript几天前我坐在一架飞机上,我从不喜欢浪费时间。当我在去机场的路上坐在车里,坐在机场里或坐在飞机上时,我都在工作。这些宝贵的时间是不能浪费的,在最近一次从曼彻斯特到维也纳的航班上,我和Cloudflare的工人们在他们的操场上玩耍。我在和一个工作人员一起为网站添加安全标头,该网站已经启动,在检查Headers对象并查看请求中的标头时,我看到了用户代理字符串。""哦,嘿,如果我想的话,我可以把它去掉,"我心想,然后当你在实现一个伟大的想法的过程中,我的大脑中触发了一连串的事件。我可以移除UA头。。。从请求。。。然后工人可以提出任何它喜欢的子请求。。。来自不同来源的请求。。。工人可以收到报告并转发!!!我意识到(当然)Cloudflare Worker可以用来接收您自己站点子域上的报告,然后将它们转发到reporturi的报告地址。使用Cloudflare Workers作为报表代理使用reporturi的一个主要好处是,所有事情都很简单,而在本博客开头提到的所有解决方案都改变了这一点。有了Cloudflare Worker,我们可以保持部署报表URI的绝对简单性,但也可以轻松地允许您选择屏蔽客户机的IP地址或负载中的任何其他信息。子域='苏格兰人'addEventListener('fetch',事件=>{事件响应(转发报告(事件请求))})异步功能转发报告(req){让newHdrs=new Headers()新硬盘集("用户代理",req.headers.get("用户代理")常量初始化={正文:需求主体,标题:newHdrs,方法:"POST"}让路径=新URL(请求url).路径名let address='https://'+子域+'。报告-uri.com网站'+路径let response=等待获取(address,init);返回新响应(响应.正文, {状态:响应.状态,状态文本:响应状态文本})}这个简单的worker部署在您自己的站点上,它为上述所有问题提供了一个解决方案。您只需在第一行的var中配置您的子域,其他一切都将为您处理。将这个worker部署到您要向其发送报告的子域,在发送报告时遵循相同的路径命名约定,一切都将正常工作(TM)。上面的脚本是为我的子域配置的,所以如果我想在任何站点上部署它,比如example.com网站,我会选择我要发送报告报告的站点上的子域-uri.example.com网站我们走吧。https://scotthelme.report-uri.com/r/d/csp/enforce变成https://report-uri.example.com/r/d/csp/enforce报告现在正被发送到您自己控制的子域中,worker将拦截请求并将其转发到位于reporturi的目的地。在此过程中,您将屏蔽客户端IP,因为我们将只看到源IP是Cloudflare Worker,在上面的示例中,我们正在转发UA字符串以用于浏览器标识。非常简单有了上面的worker,我们就不必担心设置CNAME、证书供应、独立的基础设施或其他任何与之相关的事情。您也不必担心如何设置和管理代理来将报告转发给我们,以及这样做所需的流量或处理能力。工人将负责所有这些,最好的是它将以最小的开销来处理它,只需几分钟的设置时间,并且每处理100万个报告只需0.5美元。更进一步最棒的是,一旦worker设置并处理报表,您就可以开始做一些非常棒的事情,而不仅仅是代理报表,worker的功能非常强大。下采样报告量如果您想保存报表URI上的配额,那么可能您在部署CSP的过程中还处于早期阶段,而且它非常嘈杂,没有问题。工作人员可以选择一个随机的下采样报告转发,这样你仍然可以接收报告,但不会很快吃掉你的配额。对forwardReport()函数的开头进行以下更改,以随机丢弃50%的报告。异步功能转发报告(req){如果(数学地板((数学随机()*100)+1)