如何保护我的api呼叫免受CSRF攻击

时间:2015-09-24 19:31:03

标签: angularjs api cookies csrf csrf-protection

我正在使用angular js应用,并尝试创建一个简单的登录页面,并尝试请求我的服务器API验证我的登录电话。这是我计划做的事情。

注意:我假设服务器负责验证我的令牌和请求。

通过username电话向服务器提供password API。 在获得身份验证后,服务器将为我的应用程序生成token(我通过该应用程序进行了呼叫)。 我将其存储在我的浏览器COOKIE中。 应用程序将进一步使用此Cookie(身份验证令牌)来对API进行每次HTTP调用。

现在这种方法对我来说很好,但我相信CSRF attack可以公开使用。

为了避免浏览器中显示CSRF attack,我向我的代码提供了APP ID或(版本ID),该代码也随cookie一起传递到http call的API。

使用此版本ID或App ID背后的想法是,这可以被视为我的代码的签名,即请求来自签名(已验证)的应用,该应用已分配token = < / strong> cookie值。

我只是想知道我的方法有多好,以及我的基本应用程序观点和我的主要(广泛项目)应用程序的安全程度。

我试图通过粗略的图表来展示

为这个微小的视图和图表的错误手写道歉。 enter image description here

2 个答案:

答案 0 :(得分:0)

像Laravel这样的后端框架内置了这个:csrf-protection

您可以使用角度常量函数将标记传递给Angular:$provide#constant

因此,在您初始化应用程序后,您可以说:if (ticketsToBuy <= totalTickets) { 并且Laravel会完成其余的工作。如果你想自己实现这样的技术,你应该查看Laravel的源代码:https://github.com/laravel/framework/blob/a1dc78820d2dbf207dbdf0f7075f17f7021c4ee8/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php

答案 1 :(得分:0)

为每个请求添加App ID +版本ID不会保护您的系统免受CSRF攻击,除非这些攻击位于自定义标头中 - 如果是这样,您可以使用X-Requested-With,因为任何非标准标题受跨域保护,前提是您尚未启用开放策略的CORS。

检查App ID + Version(如果在查询字符串或POST数据中设置)的原因是攻击者可以轻松获取此信息以将App ID +版本ID添加到其跨站点请求中。另一种适合您的方法是Double Submit Cookies技术。使用CSPRNG生成随机128位字符串,然后将其设置为cookie值(例如CSRFCookie)。每次向您的API发出请求时,也会传递此值。例如在查询字符串中:CSRFCookie=<generated value>。在服务器端,您只需检查值是否匹配。攻击者不知道cookie值,因此他们无法向查询字符串添加相同的值。

此方法确实存在一些轻微漏洞,只能在MITM场景中真正可利用,或者如果您不控制所有子域。简答:Use HTTPS only for all your subdomains and implement HSTS