保护未经过身份验证的REST API

时间:2016-06-26 09:25:12

标签: api rest security oauth yii2

我一直在阅读有关保护REST API的内容,并阅读了有关oAuth和JWT的内容。两者都是非常好的方法,但从我所理解的,它们都在用户通过身份验证后工作,或者换句话说“登录”。这基于用户凭证oAuth和JWT生成,一旦获得oAuth令牌或JWT,用户就可以执行其授权的所有操作。

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

我正在yii2中编写我的API。

4 个答案:

答案 0 :(得分:10)

Yii 2.0框架有一个名为yii\filters\RateLimiter的内置过滤器,它实现了基于leaky bucket algorithm的速率限制算法。它允许您限制在特定时间间隔内接受的最大请求数。例如,您可以限制登录和注册端点在10分钟的时间间隔内接受最多100个API调用。超出此限制时,系统会引发yii\web\TooManyRequestsHttpException例外( 429 状态代码)。

您可以在Yii2 RESTful API related documentation或此SO post内阅读更多相关信息。

到目前为止,我自己并没有使用它,但是我在官方文档中读过它,我的意思是:

  

请注意RateLimiter需要   $user   实施   yii\filters\RateLimitInterface。   如果,RateLimiter什么也不做   $user   未设置或未实现   yii\filters\RateLimitInterface

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

通过快速谷歌搜索,我可以看到这个扩展程序:yii2-ip-ratelimiter,您也可以查看。

答案 1 :(得分:8)

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

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

ip_addresses(ip,is_suspicious,login_attempts,register_attempts)

is_suspicious在哪里意味着它被列入黑名单。 login_attemtps和register_attempts应该是json值,显示尝试登录/注册的ip地址的历史记录。如果最近20次尝试失败并且在一分钟之内,那么ip地址应该被列入黑名单。列入黑名单的IP地址应该收到一个响应,无论他们的请求是什么,他们都被列入黑名单。因此,如果他们拒绝您的服务或试图破解某些内容,那么您就会拒绝他们的服务。

例如,使用sha1保护密码。该算法足够安全,并且比sha256更快,例如,这可能是一种过度杀伤力。如果您的API涉及银行帐户或类似的非常重要的东西,那么重要的是 - 让坏人使用服务器园来破解它,然后强制用户创建非常长的密码,包括数字,特殊字符,大小写字母。< / p>

答案 2 :(得分:2)

对于javascript,您应该使用像Google或Facebook这样的OAuth 2.0隐式授权流程。
登录和注册使用2个基本网页。别忘了为他们添加验证码。

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

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

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

例如:

api/login?user=user1&password=AES('password',$secret_key1)&time=1449570208&hash=sha256('user1'+'|'+'1449570208'+'|'+$secret_key2)

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

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

对于注册操作:您必须拨打2 api

  1. / getSignupToken:获取图像验证码和注册令牌 分别。
  2. / signup:发布注册数据(包括注册令牌和 用户输入的验证码)
  3. 对于登录操作:我们可以根据用户名

    通过计数失败登录来要求验证码

答案 3 :(得分:2)

将我的api模块放在这里以供参考。我通过访问令牌管理用户身份验证。登录时,我生成令牌,然后再次访问,客户端需要发送令牌,服务器将检查。

Yii2 Starter Kit lite