保护未经身份验证的RESTAPI

保护未经身份验证的RESTAPI,api,rest,security,oauth,yii2,Api,Rest,Security,Oauth,Yii2,我一直在阅读关于保护RESTAPI的内容,并阅读了关于oAuth和JWTs的内容。这两种方法都非常好,但据我所知,它们都在用户经过身份验证或“登录”后工作。这是基于用户凭据生成oAuth和JWT的,一旦获得oAuth令牌或JWT,用户就可以执行其授权的所有操作 但我的问题是,登录和注册API如何?如何保护它们?如果有人阅读我的javascript文件来查看我的ajax调用,他们可以很容易地找到端点和传递的参数,他们可以通过某个REST客户端多次点击,更严重的是,他们可以编写一个程序,点击我的注册

我一直在阅读关于保护RESTAPI的内容,并阅读了关于oAuth和JWTs的内容。这两种方法都非常好,但据我所知,它们都在用户经过身份验证或“登录”后工作。这是基于用户凭据生成oAuth和JWT的,一旦获得oAuth令牌或JWT,用户就可以执行其授权的所有操作

但我的问题是,登录和注册API如何?如何保护它们?如果有人阅读我的javascript文件来查看我的ajax调用,他们可以很容易地找到端点和传递的参数,他们可以通过某个REST客户端多次点击,更严重的是,他们可以编写一个程序,点击我的注册api一千次,这将创建一千个垃圾邮件用户,或者他们甚至可以强行使用登录api。那么如何保护它们呢


我正在用yii2编写API。

您的URL将很容易确定。你应该有一个IP地址的黑名单,当一个IP地址行为可疑时,只需将其添加到黑名单中即可。您可以定义什么是可疑的,但如果您不确定,可以从以下内容开始:

使用此架构创建类似于数据库表的内容:

ip地址(ip、可疑、登录尝试、注册尝试)

哪里可疑意味着它被列入黑名单。login_attemtps和register_尝试应为json值,显示尝试登录/注册的ip地址的历史记录。如果最近20次尝试失败且在一分钟内,则ip地址应被列入黑名单。被列入黑名单的ip地址应该收到一个响应,即无论他们的请求是什么,他们都被列入黑名单。因此,如果他们拒绝你的服务或试图黑客的东西,那么你拒绝你的服务从他们


例如,使用sha1保护密码。该算法足够安全,并且比sha256更快,例如,sha256可能是一种过度杀伤力。如果你的API涉及银行账户或类似的非常重要的东西,重要到足以让坏人使用服务器公园进行黑客攻击,然后强迫用户创建很长的密码,包括数字、特殊字符、,大大小小的字母。

Yii 2.0框架有一个内置过滤器,名为,它实现了基于。它将允许您在一定的时间间隔内限制接受请求的最大数量。例如,您可以限制登录和注册端点在10分钟的时间间隔内最多接受100个API调用。当超过该限制时,将抛出异常(429状态代码)

您可以在yii2restfulapi或本文中了解更多关于它的信息

到目前为止,我自己并没有使用它,但从我在官方文件中读到的内容来看,我的意思是:

注意,需要 实施 . 如果 未设置或未实现

我猜它的设计只是为了与登录用户一起工作,可能是通过使用与用户相关的数据库表(advanced template中引入的默认数据库表)。我不确定,但我知道它需要将允许的请求数和相关的时间戳存储到用户类中需要定义的
saveamount
方法中的某个持久存储中。因此,我认为您必须按照@LajosArpad的建议,通过IP地址跟踪来宾用户,然后重新设计您的用户类来保存他们的身份,这样您就可以启用它


快速的谷歌搜索让我来看看这个扩展:你也可以看看。

对于javascript,你应该使用OAuth 2.0隐式授权流,比如谷歌或Facebook
登录和注册使用2个基本网页。别忘了为他们添加验证码

对于某些特殊客户端,如移动应用程序或Web服务器:
如果您确定二进制文件是安全的,则可以为其创建自定义登录API。在此API中,您必须尝试验证您的客户端

一个简单的解决方案,您可以参考:

  • 使用加密算法(如AES或3DES)加密密码 从客户端使用密钥(只有客户端和服务器知道)
  • 使用散列算法(如sha256)散列(用户名+客户端时间+其他 密钥)。客户端将向发送客户端时间和哈希字符串 服务器。如果客户端时间差异太大,服务器将拒绝请求 来自服务器或哈希字符串不正确
例如:

注意:在任何情况下,服务器都应该使用captcha来避免暴力攻击,不要相信任何其他过滤器

关于RESTAPI的验证码,我们可以基于令牌创建验证码
例如

对于注册操作:您必须调用2 api

  • /getSignupToken:获取图像验证码url和注册令牌 分别
  • /注册:发布注册数据(包括注册令牌和 验证码(由用户键入)

  • 对于登录操作:我们可以要求根据用户名对登录失败的次数进行验证码,请参见此处的my api模块,以供参考。I管理器通过访问令牌进行用户身份验证。登录时,我生成令牌,然后再次访问,客户端需要发送令牌,服务器将进行检查


    即使缩小JS文件,也有人能从JavaScript读取api端点吗?缩小并不能解决问题。您可以轻松地复制粘贴整个代码到IDE中,并且自动格式化代码将格式化所有代码。好的,那么在发出请求后可以触发的基于过滤器的传统身份验证呢。这是如何工作的?你能给我举个例子吗?你说的“保护他们”是什么意思?谁在试图阻止他们?或者你的意思是仅仅防止拒绝服务攻击等?这是一个很好的建议,对登录和注册非常有用。我想如果在最后2分钟内有5次注册尝试,我会被列入黑名单。同样地,如果10次登录尝试和所有失败都在2分钟内完成,我也会将它们列入黑名单。但是@Lajos我们能做什么
    api/login?user=user1&password=AES('password',$secret_key1)&time=1449570208&hash=sha256('user1'+'|'+'1449570208'+'|'+$secret_key2)