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

全站加速_叶普盖尼奥涅金百度云_代金券

小七 141 0

使用Cloudflare Workers识别数据丢失并发出警报

马库斯·斯皮斯克摄这些天你几乎每天都会在新闻中听到数据泄露的消息。新的法规,如GDPR,要求公司在意识到数据泄露的72小时内披露。然而,当数据泄露发生时,意识到并识别它们并不是一件容易的事。对于公司来说,在被媒体发现之前就意识到自己的数据泄露和损失,这往往是一项挑战。数据泄露的一个症状是数据(如密码或PII),这些数据不应该离开内部系统,通过HTTP响应进入公共互联网。由于Cloudflare Workers位于基础设施和公共设施之间,对于任何暴露在互联网上的端点,Workers可以用作一种警告您金丝雀数据离开的方式。在下面的示例中,我们将检查每个响应的内容,检查是否泄漏了我们的canary数据,如果是,则返回一个静态响应并调用PagerDuty API来通知潜在的漏洞。检测数据丢失在本例中,我们将在响应体中查找特定的字符串。这个字符串可以是数据库中的金丝雀数据(在我们的示例中,秘密是"shhhthissiasecret",我们在一个非常特定的字符串上进行匹配)。要获取内容的主体,我们使用javascript let body=等待响应.text()这会将响应的主体拉入body变量。注意,由于这个方法消耗响应的主体,所以我们必须在返回它之前构造一个新的响应对象。如果您希望使用JSON,那么也可以调用响应.json(). 因为我们无法读取图像的主体和其他非文本格式,所以在尝试解析正文之前,我们会检查响应的内容类型。如果(response.headers.get('Content-Type').includes('text')){让身体=等待响应.text()如果(主体。包括('shhhthisasecret')){response=new response('Blocked.',{status:403,headers:new headers({'Private-block':true})})返回响应}返回新响应(正文,{状态:响应.状态,标题:响应.headers})}默认情况下,Workers将把响应流式传输回客户端,以帮助提高性能和TTFB。值得注意的是,在Worker中读取响应的主体意味着响应不会被流化(因为我们必须等待读取完成,以确定主体中是否存在此字符串)向客户端返回响应静态块在本例中,我们创建一个静态响应:response=新响应('被阻止。,{status:403,headers:new headers({'Content-Type':'text/html'})})为了确保浏览器能够正确地解析和显示它,我们还添加了值为"text/html"的Content-Type头。假设源代码用它不应该响应的内容响应,我们将替换响应头,这样就不会反映出任何额外的信息。速率限制响应在上面的例子中,我们正在寻找一个显然永远不应该被泄露的字符串。但是,在某些情况下,您可能希望检测对应用程序响应有效的数据,但您仍然希望限制访问数据的次数。Cloudflare Rate Limiting允许您基于响应标头和响应状态代码创建速率限制规则。通过定义下面的规则,并将X-Rate-Limiting响应头设置为true,我们可以确保每个IP每分钟只能访问一次此数据:在辅助进程中添加标头:response=新响应(正文,{状态:响应.状态,headers:new headers({'X-Rate-Limiting':true}})触发页面输出作为对这些事件发出警报的方法,我们将对PagerDuty进行API调用。若要启动,您必须设置一个服务,以便在上接收警报和事件。在集成设置中,请确保选择了API,因为这将允许我们直接从Worker发出HTTP请求。您还需要设置一个API密钥(在"配置"→"API访问"下),以允许工作人员创建事件事件并触发警报。我们将调用事件.等待直到(). 这有两个目的:我们不一定要阻止返回给客户端的响应,并让它等到我们完成对PagerDuty的请求(这对于关键任务的性能很重要)。一旦worker完成将其主响应主体发送回客户端,未完成的异步任务就会被取消。事件.等待直到()有助于确保即使在将响应发送到客户端之后,对PagerDuty的调用也是完整的。异步函数createPagerDutyIncident(事件){让正文=`{"事件":{"type":"事件","title":"潜在数据泄露","服务":{"id":"${PD_SERVICE_id}","type":"服务参考"},}}`让PDInit={method:'发布',标题:新标题({"Content-Type":"应用程序/json","接受":"申请"/vnd.pagerduty公司+json;版本=2","From":`${PD_From}`,"Authorization":`Token Token=${PD_API_KEY}`}),正文:正文}事件.等待直到(取回('https://api.pagerduty.com/incidents'和PDInit)}完整的工人const PD_API_KEY='密钥'const PD_FROM='邮箱:email@gmail.com'const PD_SERVICE_ID='ID'addEventListener('fetch',事件=>{let response=handleRequest(事件)事件响应(回应)})/***在响应中查找金丝雀数据*@param{Request}请求*/异步函数handleRequest(事件){试试看{让请求=事件请求let response=等待获取(请求)//仅当内容类型包含"文本"时检查如果(response.headers.get('Content-Type').includes('text')){让身体=等待响应.text()如果(主体。包括('shhhthisasecret')){response=新响应('被阻止。,{status:403,headers:new headers({'Content-Type':'text/html'})})createPagerDutyIncident(事件)返回响应}返回新响应(正文,{状态:响应.状态,标题:响应.headers})}其他{返回响应}}接球(e){控制台.log(五)}}异步函数createPagerDutyIncident(事件){让正文=`{"事件":{"type":"事件","title":"潜在数据泄露","服务":{"id":"${PD_SERVICE_id}","type":"服务参考"},}}`让PDInit={method:'发布',标题:新标题({"Content-Type":"应用程序/json","接受":"申请"/vnd.pagerduty公司+json;版本=2","From":`${PD_From}`,"Authorization":`Token Token=${PD_API_KEY}`}),正文:正文}事件.等待直到(取回('https://api.pagerduty.com/incidents'和PDInit)}结论Cloudflare Workers使您能够完全控制流经Cloudflare的每个请求和响应。能够检查响应的主体意味着您可以识别、警告和修改源代码发回的内容,从而使用worker来执行诸如数据丢失预防之类的工作。你可以在这里查看更多的用法和食谱。像往常一样,我们很乐意听到你和工人们在做什么。