阻止在Angular应用程序中访问JSON数据

时间:2014-09-14 22:23:10

标签: json angularjs security

我有一个( Flask )后端支持将 JSON 提供给 <的API em> Angular 应用。

我喜欢我的后端(算法,数据库)与我的前端(设计,UI)完全断开的事实,因为它可以从两个不同的服务器运行。但是,由于视图完全由客户端生成,因此每个人都可以访问 JSON 数据。假设应用程序是一个简单的事物列表(事物存储在JSON文件中)。

为了防止在浏览器控制台中通过 JSON 直接访问我的数据库,我找到了以下选项:

  • 加密数据(因为解密函数在javascript中可以自由显示,但在处理缩小的文件时不那么容易,因此很弱)
  • 而不是$http.get整个数据库,然后多次使用angular $http.get进行过滤(例如,当用户滚动列表时),以便在编程上更难抓取

我相信我的选择仍然很弱。我怎么能让黑客更难抓取整个数据库呢?有什么想法吗?

4 个答案:

答案 0 :(得分:4)

我理解这个问题 - 应该允许用户通过您的UI访问所有数据,但您不希望他们直接访问API。正如您所知,客户端访问的任何数据都无法保证,但我们可以将其更多地访问PITA。

这样做的一种常见方法是检查HTTP referer。当您从UI拨打电话时,服务器将获得请求来自的页面。这通常用于防止人们在未经许可的情况下创建使用您的数据的mashup。与所有HTTP请求标头一样,您依赖调用方是真实的。这不会保护您免受控制台黑客攻击或使用其他语言编写刮刀的人。 @see CSRF

另一个想法是在html源代码中嵌入一个变量令牌来引导你的应用程序。您可以将其指定为角度常量或全局变量,并将其包含在所有$ http请求中。令牌本身对于每个会话可以是唯一的,或者是只有服务器可以处理的加密的到期日期。但是,这种方法是有缺陷的,有人可以解析html源代码,获取代码,然后发出请求。

所以,真的,你可以让某些人更难,但它几乎不是万无一失的。

如果用户只能访问某些数据,您可以尝试使用firebase。它允许您为谁可以访问内容定义规则。

答案 1 :(得分:1)

  

安全注意事项在设计Web应用程序时,请考虑   安全威胁来自:

     

JSON漏洞XSRF服务器和客户端都必须合作   为了消除这些威胁。 Angular预先配置了   解决这些问题的策略,但为此工作后端   服务器合作是必需的。

     

JSON漏洞保护JSON漏洞允许第三方   网站将您的JSON资源URL转换为JSONP请求   条件。为了解决这个问题,您的服务器可以为所有JSON请   跟随字符串“)]}',\ n”。 Angular会自动剥离   在将其作为JSON处理之前的前缀。

     

例如,如果您的服务器需要返回:

     

['one','two']易受攻击,您的服务器可以返回:

     

)]}',['one','two'] Angular将在处理前删除前缀   JSON。

     

跨站点请求伪造(XSRF)保护XSRF是一种技术   未经授权的网站可以获取用户的私人数据。角   提供了一种对抗XSRF的机制。执行XHR请求时   $ http服务从cookie中读取令牌(默认情况下为XSRF-TOKEN)   并将其设置为HTTP标头(X-XSRF-TOKEN)。既然只有JavaScript   在您的域上运行可以读取cookie,您的服务器可以   确保XHR来自您域上运行的JavaScript。该   不会为跨域请求设置标头。

     

要利用这一点,您的服务器需要在一个令牌中设置一个令牌   在第一个HTTP上称为XSRF-TOKEN的JavaScript可读会话cookie   GET请求。在随后的XHR请求中,服务器可以验证   cookie匹配X-XSRF-TOKEN HTTP标头,因此请确保   只有您域上运行的JavaScript才能发送请求。   对于每个用户,令牌必须是唯一的,并且必须由   服务器(防止JavaScript编写自己的令牌)。我们   建议令牌是您网站身份验证的摘要   带有盐的饼干,以增加安全性。

     

可以使用xsrfHeaderName和指定标题的名称   $ httpProvider.defaults的xsrfCookieName属性   config-time,运行时$ http.defaults或每请求配置   对象

请参考以下链接,

<强> https://docs.angularjs.org/api/ng/service/ $ HTTP

答案 2 :(得分:0)

来自AngularJS DOCs

JSON漏洞保护 JSON漏洞允许第三方网站在某些情况下将您的JSON资源URL转换为JSONP请求。为了解决这个问题,您的服务器可以使用以下字符串")]}',\n"作为所有JSON请求的前缀。 Angular会在将前缀作为JSON处理之前自动删除前缀。

还有其他技术,如XSRF保护和转换,这些技术将进一步增强JSON通信的安全性。有关详细信息,请参阅AngularJS文档https://docs.angularjs.org/api/ng/service/$http

答案 3 :(得分:0)

您可能需要考虑使用JSON Web Tokens。我不确定如何在Flask中实现它,但这是一个很好的例子,说明如何使用Nodejs后端。这个例子至少说明了如何在Angularjs中实现它。

http://www.kdelemme.com/2014/03/09/authentication-with-angularjs-and-a-node-js-rest-api/

更新:Flask的JWT:

https://github.com/mattupstate/flask-jwt