来自 DDOS 2021-10-11 12:25 的文章

网站防护_ddos高防ip原理_优惠券

网站防护_ddos高防ip原理_优惠券

概述Go编程语言(也称为Golang)是Google创建的一种开源编程语言。Go是编译的,并且静态类型化为C(使用垃圾回收)。它具有有限的结构类型、内存安全特性和CSP风格的并发特性。在本文中,我将从理论到实践包括源代码示例在内的竞走条件。我将讨论如何检测和解决竞争条件问题以及它们所代表的安全影响。理论竞争条件是软件中的一个常见问题,因为计算机程序希望一系列操作按特定顺序执行,但它们以另一个顺序运行,从而使软件输出不可预测。这些问题在并发计算机程序中很常见,其中多个工作线程、进程或线程共享一个状态。一方面,这些问题在软件开发阶段很容易引入,因为并发不容易实现。另一方面,它们很难被检测/调试,因为计算机程序的行为并不总是确定的。例如,考虑一下HTTP服务器。它们是并发计算机程序的一个很好的例子,因为它们能够一致地处理并发请求。例如,要跟踪网页的访问/访问者数量,我们可以使用本地文件系统上的文件。当接收到新的HTTP请求时,进程从该文件中读取当前计数器值,将其递增1,然后将新值写入同一文件。让我们在下一节中研究这个例子。在实践中让我们从编写HTTP服务器main()函数开始,使用Go HTTP包现在,我们将实现updateVisitsCounter()函数,该函数负责读取/写入文件系统中文件的访问次数。请注意,为了简洁起见,缺少错误处理。完整的源代码可以在这里找到。要运行它,请输入go run服务器.go把你的浏览器指向:8080。每次重新加载浏览器窗口时,您应该会看到访问者数量增加,如下所示。图1在本地运行服务器时,只有一个用户在访问它,神盾的高防cdn,您不应该遇到竞争情况。为了使竞争条件变得明显,让我们用一些并发的HTTP请求来稍微强调一下服务器。我们可以通过运行并发-请求.go如图2所示。图2在图2的左侧,服务器.go正在运行并准备接收请求。在右边,同时-请求.go将对它发出5个并发的HTTP请求。每个输出行以请求时间戳开头(时间.UnixNano())和请求的响应。显然,右侧的输出不是预期的:四个不同的请求都收到了相同的消息,"Hello,you're visitor#1"。请注意,图2中缺少访问者3、4和5。按时间戳对输出进行排序,我们可以看到,在访问者编号为2之后,还有三个其他访问者收到了消息"Hello,you're visitor#1",如图3所示。图3如前一节所述,我们的HTTP服务器实现具有:共享状态:文件系统中保存计数器的文件(访问\u counter_file)和updateVisitsCounter()实现要求文件系统中文件的读/写操作按严格的顺序顺序进行。下面的图4说明了两个并发worker的竞争条件:(worker1和worker2)图4两个工人都从VISITS_COUNTER_文件读取值0(零)。然后worker1将值更新为1。当worker2仍在处理其第一个请求时,worker1接收到一个新请求,该请求执行一个读操作,然后立即执行一个写操作,将VISITS_COUNTER_文件更新为2。当worker2处理完请求后,它将值1写入VISITS_COUNTER_文件:读取值0(零)递增一个单位。最后,worker1收到一个新请求,读取VISITS_COUNTER_文件,其值为1。安全影响竞争条件可被利用来导致软件故障,从而导致拒绝服务和权限提升等问题。检查时间到使用时间(TOCTTOU)是一类可能导致权限提升的竞争条件。下面是一些竞赛条件的例子:窗口打开竞争条件漏洞,Internet Explorer,CVE-2011-1257Windows快捷链接,CVE-2010-2568脉冲音频,CVE-2009-1894Firefox,CVE-2007-5960如何检测如前所述,查找和解决竞赛条件并不容易,但细心、勤奋和测试肯定会有所帮助。尽管为编写并发代码提供了一种干净的方法,但是Go的创建者认为需要添加一个race检测器来帮助诊断竞争条件。Go-race检测器适用于所有主要的操作系统,但仅适用于64位系统,而且它只能检测数据竞争(从不同的线程访问内存或对内存访问进行排序的操作)。请记住,竞争条件检测发生在运行时,对于一个典型的程序来说,内存增加5-10倍,执行时间增加2-20倍。要启用种族检测,请使用-race选项运行程序,例如go run-race服务器.go. 比赛检测器不会报告任何比赛服务器.go因为这不是一场数据竞赛,而是一场托图竞赛。更改实现,将VISITS_COUNTER_文件替换为共享全局变量visitsconter,以存储访问次数(服务器-备选方案。开始),将允许我们看到-race选项输出go run-race服务器-备选方案。开始如下图5所示。图5如何解决一般来说,使用互斥锁(互斥锁)、信号量和其他访问和执行控制原语将有助于防止争用。像sync这样的包提供基本的同步原语,比如互斥锁。在我们的HTTP服务器中添加互斥体-固定。开始实现,修复了争用条件,ddos攻击防御部署,从而得到如图6所示的预期结果。图6程序在计算机中的互斥作用很简单。在对共享状态启动操作之前,一个工作线程应该获得对它的访问权,获取互斥体的锁(lock())。一旦发生这种情况,所有其他愿意操作共享状态的工人都将被阻止,直到互斥体的锁被释放(Unlock())。一旦互斥锁被释放,下一个工作线程将能够操作共享状态。在我们的示例中,获取mutex的锁将使worker能够按照这个确切的顺序读写VISITS_COUNTER_文件,而不会受到其他工作线程的干扰。更新VISITS_COUNTER_文件后,其他工作人员也可以这样做。当然,访问和执行控制原语也带来了其他挑战。例如,如果互斥锁从未被释放呢?可能永久拒绝工人共享资源。这是并发编程中一个众所周知的问题,称为饥饿,这不在本文的讨论范围之内。结论Golang并发性非常棒,防御ddos群集,但是编译器并没有做太多的事情来防止您犯错误,nginxcc防御,从而导致竞争条件。竞争条件是您真正想要避免的,防御cc攻击的服务器,而检测和调试都是非常困难的任务。在编写并发程序时,要仔细检查状态(例如,文件或变量)是否同时被多个工作线程/进程访问。如果是这样,您将需要一些访问控制机制,例如互斥锁或信号量。工具书类Go安全编码实践检查时间使用Go数据竞争检测器Go内存模型转到synx包种族条件利用饥饿developers golangrace ConditionSecure coding secure coding practices漏洞修复生物最新帖子Checkmarx安全研究团队Checkmarx安全研究团队持续调查潜在易受攻击的网站、应用程序、api、设备、开源软件包和其他软件驱动技术。该团队致力于检查、发现、复制、分类和负责任地披露软件中的漏洞,以此作为其持续努力的一部分,以推动全世界组织间软件安全实践的必要变革。团队通常会提供一些例子,说明需要注意哪些常见的缺陷,如何减少常见的编码错误,以及在开发软件时应该避免什么。他们备受尊敬的研究、安全编码指南、博客和报告在很大程度上被认为是业界最好的。Checkmarx安全研究团队的最新帖子