我有一个( Flask )后端支持将 JSON 提供给 <的API em> Angular 应用。
我喜欢我的后端(算法,数据库)与我的前端(设计,UI)完全断开的事实,因为它可以从两个不同的服务器运行。但是,由于视图完全由客户端生成,因此每个人都可以访问 JSON 数据。假设应用程序是一个简单的事物列表(事物存储在JSON文件中)。
为了防止在浏览器控制台中通过 JSON 直接访问我的数据库,我找到了以下选项:
$http.get
整个数据库,然后多次使用angular $http.get
进行过滤(例如,当用户滚动列表时),以便在编程上更难抓取我相信我的选择仍然很弱。我怎么能让黑客更难抓取整个数据库呢?有什么想法吗?
答案 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: