如何保护OpenID消费者免受滥用?

如何保护OpenID消费者免受滥用?,openid,denial-of-service,Openid,Denial Of Service,我正在考虑将OpenID作为我的PHP应用程序的登录方法,但有一件事阻止了我继续:我如何保护OpenID使用者不被滥用 滥用包括用请求淹没其他服务器、使用我的应用程序作为代理、将大量下载作为URL传递,或者通过大量请求不必要地降低服务器速度 我想我应该对do请求实施速率限制,但我该怎么做呢?可能的攻击者可以使用其他代理或TOR绕过IP检查。限制允许的提供者将违反OpenID权利的原则 我不希望我的用户是邪恶的,但是我想知道在添加另一个可能的攻击向量之前需要考虑哪些东西。 如果有关系,我将用作P

我正在考虑将OpenID作为我的PHP应用程序的登录方法,但有一件事阻止了我继续:我如何保护OpenID使用者不被滥用

滥用包括用请求淹没其他服务器、使用我的应用程序作为代理、将大量下载作为URL传递,或者通过大量请求不必要地降低服务器速度

我想我应该对do请求实施速率限制,但我该怎么做呢?可能的攻击者可以使用其他代理或TOR绕过IP检查。限制允许的提供者将违反OpenID权利的原则

我不希望我的用户是邪恶的,但是我想知道在添加另一个可能的攻击向量之前需要考虑哪些东西。
如果有关系,我将用作PHP应用程序的后端。

根据某个域被请求的次数成比例地降低请求速度

例如,假设有人试图通过请求许多URL(如
http://example.com/foo
http://example.com/bar
http://example.com/foobar120382
。将所有这些请求视为<代码>示例.COM< /COD>的请求,并执行第一个请求而不需要任何延迟。在发出下一个请求之前延迟2秒,在发出第三个请求之前延迟4秒,在发出第四个请求之前延迟8秒,在发出第五个请求之前延迟16秒,依此类推

这种微小的延迟几乎没有被用户注意到,但会大大降低服务器作为剂量代理的能力。试想一下,第12个请求将被阻止一个多小时(如果您使用两次幂)


显然,您还应该为常见的大型OpenID提供商(如Google或myOpenID)创建某种白色或灰色列表。这些域可能经常被请求。

您需要将攻击分为两个池。1) 攻击您自己的站点,以及2)攻击使用您作为代理的其他人。这两个问题都不是新问题,也不是OpenID独有的问题。例如,经典的“告诉朋友”电子邮件表单可以自动从代理方的IP地址和电子邮件发送垃圾邮件,从而保护垃圾邮件方免受后果的影响,并为他们提供(可能)干净的IP/电子邮件,而该IP/电子邮件尚未被垃圾邮件保护标记。这主要是通过“验证码”来解决的,以防止表单的自动使用

对于针对您自己的站点的攻击,这些都已经被无数次地覆盖过了。试试这里:

对于针对其他人网站的攻击,许多相同的原则适用于其他问题中提到的。限制身份验证请求,拒绝不合理或格式错误的请求,根据回发邮件上的实际内容验证内容长度标题,当然,您可以始终添加经典的“验证码”,以帮助防止使用OpenID使用者进行自动攻击


与这里的其他建议相反,我不会基于OpenID TLD进行节流,而是基于请求方的IP地址。是的,人们可以租用代理IP,但您不能基于TLD进行调节,因为每个OpenID提供程序的用户基础差异很大。您还可以从公司购买已知代理IP的数据库,如。如果用户来自代理IP,请增加限制的攻击性。

我会做一些更简单的事情。将OpenID端点限制为一组受信任的端点:Google、wordpress、myopenid、yahoo。它可能会覆盖大多数用户,并且不会使机器人程序使您的站点向随机站点生成流量成为可能。

以这种方式延迟可能会导致我自己的服务器瘫痪,这是我试图避免的另一件事。为什么?只需将这些请求放入一个异步队列中,可能类似于。这将不起作用,因为我需要验证另一方的响应,这就是为什么首先发送请求的原因。另外,它也不能保护那些我不理解的服务器不响应(这需要一个较小的超时)。1) 你得到了认证请求2)你等待了几秒钟3)你做了你无论如何都会做的事情(我想是调用一些lightopenid函数)。为什么这会打破任何东西?这就像有一个缓慢的服务器或缓慢的网络。我不需要找到连接到的规范URL吗?客户端IP地址似乎是一个好东西,可能使用C类部分来进一步减少滥用的机会。这对于私有应用程序来说是好的,但这与OpenID的开放性是背道而驰的。当该机制被严重滥用时,设置一个允许访问公共服务的标志可能会很有用。不过,对于非私有应用程序也可以。是的,这有违开放性,但事实上,我认为在主要提供商之外,很少有人使用openid