来自 DDOS 2021-06-10 15:03 的文章

香港高防ip_防ddos教程_如何解决

香港高防ip_防ddos教程_如何解决

摘要这篇文章描述了在web应用程序代码中进行授权检查的一些最常见的设计模式。在设计模式之间进行比较,以帮助了解每个模式何时有意义以及模式的缺点。对于开发人员和架构师,这篇文章帮助您理解不同的代码模式是什么样子的以及如何在它们之间进行选择。对于安全审核员,最有效的审核授权控制的方法是基于代码使用的模式来解释的。安全API的代码模式在NCC集团大约5年的时间里,我估计我已经完成了50多个源代码辅助的web应用程序评估。我得到的一个主要结论是,大型应用程序的安全性反映了内部代码库中使用的编码模式。如果内部存在危险(代码)API,则在未经安全检查的情况下使用这些API时,安全问题将在外部出现。这并不是一个新的想法——对不安全代码API的认识已经存在很多年了。最早的例子之一可能是业界推动在字符串和数组上操作时将C代码迁移到使用更安全的函数(例如strcpy与strcpy_s)。最近,React选择了名称dangerouslysetinerhtml,而不是innerHTML,以便更好地警告开发人员该API的安全问题。在实现授权控制时,同样的想法也适用于web应用程序中使用的代码。在设计一个新的应用程序时,重要的是要创建跨代码库的安全数据访问API。这些API确定是否引入了允许攻击者绕过应用程序的授权控制、提升权限或攻击其他用户的漏洞。每个人都会犯错,但安全的api使编写代码更容易,而不会造成漏洞,从而使应用程序更加安全。用于授权的通用内部设计模式在我回顾过的许多应用程序中,通常有四种代码模式是大多数应用程序用来实现授权的。每种代码模式都可以在正确的情况下工作,但是选择错误的代码模式通常会导致漏洞或阻止授权逻辑在应用程序的用例中正常工作。临时的在特别模式中,每个路由都定义自己的权限检查和逻辑。@路由("/messages/:id")def get_message(上下文,消息\u id):消息=获取消息(消息标识)如果上下文.用户== 邮件.收件人:返回消息return"未授权"这可能是最常见和最危险的模式之一。它可能在一个非常简单的应用程序中工作,但随着应用程序大小的增加,它很快变得不可管理。犯一个错误导致严重的授权绕过是非常容易的(即使对于一个有安全意识的开发人员也是如此),尤其是在使用多年积累的逻辑的路线上工作时。这就是授权逻辑的"无障碍"模式。使用此模式审核大型应用程序时,通常很难通过源代码对授权进行系统的检查。相反,从用户角度进行手动测试通常更容易。像AutoRepeater或Autorize这样的工具可以帮助加速测试。一旦问题或意外行为发生,高防cdn哪个好,审查路线逻辑以确定原因和影响将变得更有效率。基于路线的对于基于路由的模式,每个路由都显式声明访问该路由所需的权限。声明通常发生在decorator或路由文件中,中间件在处理路由逻辑之前检查授权。@路由("/messages/:id")@授权("读取消息")def get_消息(消息_id):return get_消息(message_id)这种模式在某些情况下可以工作,但许多应用程序都会遇到严重的问题。首先,几乎总是有需要更多上下文来通知授权决策的用例。如果要检查用户是否有权访问特定对象,则必须在路由逻辑中实现它,并创建与上述相同的即席模式。这种上下文逻辑可以在中间件中实现,但这通常只会将问题转移到别处。这种模式的第二个可修复的问题是"失效开放"设计的风险。在实现decorator和中间件时,趋势是只在路由应用了特定的授权控制时执行检查。但是,开发人员很容易忘记将decorator添加到路由,从而导致授权漏洞。要解决这个问题,请实现一个反装饰器(比如@harging_noauth),并通过拒绝对任何未应用decorator的路由的授权来确保中间件关闭失败。基于路由的授权检查通常在具有两个功能的企业应用程序中最有效:应用程序(即独立的安装或数据库)对象的租户之间的强分离属于租户,而不是特定的用户这两个特性意味着路由通常不需要根据特定的用户上下文检查逻辑。相反,他们只需要检查用户是否具有执行某些特定操作所需的权限。例如,管理员拥有所有权限,但会计只能读取财务数据。只要模式是可搜索的,这个模式通常很容易审核。用几行上下文对所有路由定义的代码库进行Grep,然后简单地检查每个定义的正确权限检查。确保代码搜索不会错过路由定义,因为上面解释的"fail open"问题没有应用授权检查。集中集中式模式在单个位置实现授权,该位置根据角色和上下文定义对对象的权限。规则可以在配置文件或基于代码的逻辑中定义。当所有路由逻辑想要访问(创建、读取、更新、删除)一个对象时,性价比高的全球高防cdn,它调用集中式api。因此,不可能意外地绕过集中授权逻辑。下面的示例大致上是由Rails和cancancancangem启发而来的。#/message/:id的面向外部的路由def get_message(上下文,消息\u id)#只要我们使用安全的API,这里的任何逻辑都是安全的返回safe_read_消息(上下文.用户,消息编号)结束#安全api取代直接ORM调用#这些方法通常不是手写的,但这显示了逻辑def safe_read_message(用户,消息_id)#不安全的直接ORM调用,不在此方法之外使用消息=消息。不安全的\u查找(消息编号)#.可以吗?通过authorize显式检查授权如果用户.can?(:读,消息)返回消息引发NotAuthorizedException结束#中央授权逻辑def authorize(用户)#示例:用户可以读取配置文件、更新自己的配置文件、编写消息可以:读取,用户配置文件can:更新,用户配置文件,id:用户.profile.idcan:创建,消息#用户只能在自己是收件人的位置阅读邮件可读的消息=消息(收件人:用户)can:读取,消息,https防御cc,id:可读的消息结束根据我的经验,这种模式通常比特别模式或基于路由的模式有效得多。集中式模式的优点是非常容易审核:所有授权逻辑都在一个地方,并且可以禁止路由逻辑不安全地访问对象。有了这种模式,开发人员就可以知道只要使用安全的api,他们自己的逻辑就不会绕过任何授权检查。不安全访问的检查也可以作为代码检查的一部分或在持续集成管道中实现。这种模式的缺点是随着对象和开发人员数量的增加,很难进行扩展。单一授权方法的逻辑通常随对象的数量线性增长。复杂的检查进一步增加了授权方法中的逻辑量。由于这些原因,一旦集中式方法变得太大而无法管理时,大多数代码库通常会从集中式模型迁移到基于对象的模型。这可能是最容易审核的模式,因为所有授权检查都存在于一个位置。但是,还应该搜索代码库以查找不安全API的使用情况,这些API充当到集中逻辑的逃生舱口。如果在路由中使用了不安全的API,则该路由应该得到额外的关注,以确保不存在旁路。基于对象基于对象的模式基本上与集中式模式相似,但是权限是在每个对象上定义的(即每个对象一个授权方法或配置文件)。随着对象数量的增加,这将更具伸缩性。类用户配置文件def authorize(用户)可以:读取,用户配置文件can:更新,用户配置文件,id:用户.profile.id结束结束班级信息def authorize(用户)can:创建,消息可读的消息=消息。何处(收件人:用户)can:读取,消息,id:可读的消息结束结束这种模式的主要缺点是,它将可能发生授权问题的位置数乘以对象类型的数量。在这种模式下,围绕授权逻辑实现SDLC门变得更加重要:在创建或修改授权方法时进行额外的代码审查或审查使用静态分析工具来识别不安全的授权方法授权感知测试框架,使开发人员能够轻松地测试授权审核此模式时,ddos防御方法要钱的吗,通常使用与集中式模式相同的方法。然而,cdn高防是什么意思,基于对象的逻辑通常存在于更大更复杂的代码库中。因此,我倾向于关注特定的特性,并且只单独读取与每个特性关联的对象的授权逻辑。尝试系统地审核每个对象的授权逻辑