为 HTML Angular 2 项目使用本地存储的安全性

Posted

技术标签:

【中文标题】为 HTML Angular 2 项目使用本地存储的安全性【英文标题】:Security in using local storage for HTML Angular 2 Project 【发布时间】:2017-07-02 21:44:09 【问题描述】:

我担心如果我使用本地存储来存储用户信息,黑客可能会进入开发人员的控制台/应用程序/本地存储来更改数据(例如公司名称)并开始从其他公司从我的数据库中获取数据。这里有更多细节

我正在开发一个商业应用程序,注册后我会收到基本的用户信息,例如公司、电子邮件、姓名……等。

ny 数据库(firebase)数据结构的简化版本看起来像

-company1
    -filed1
        -data1
    -filed2
        -data1
-company2
    -field1
        data1

这是我目前在没有本地存储的情况下如何做到的(并且提到了它的问题)

    用户打开网站进行登录,应用程序转到 Firebase 以登录用户并检索用户详细信息以将其存储在变量中 每当用户想要进行查询时,我都会使用该变量并查找公司名称等信息(对于本示例)。 然后我告诉 firebase 根据该公司名称 (company1) 搜索路径。

这一切都很好。但是,问题是在启动时没有用户,因此我的所有 AuthGuard 都将失败,导致用户被重定向回登录页面。 想象一下,如果用户登录,然后按下刷新按钮,这将导致重定向回登录页面,因为在 firebase 返回一些数据之前没有用户。

// Auth guard
canActivate() 
    if (!this.userService.getCurrentUser()) 
        return false
    
    return true


getCurrentUser(): User 
    return this.currentUser


const APP_ROUTE: Routes = [
     path: '', redirectTo: '/login', pathMatch: 'full' ,
     path: 'login', component: LoginComponent ,
     path: 'register', component: RegisterComponent ,
     path: 'somePath', component: SomeComponent, canActivate: [AuthGuard] ,
     path: 'somePath2', component: SomeOtherComponent, canActivate: [AuthGuard] ,
     path: '**', redirectTo: '/login' ,
]

我能想到的最简单的解决方法是创建一个本地存储来存储使用的信息,并在需要时将其签入。 但是,我担心使用这种方法,用户可能会进入本地存储,例如,将公司更改为 2,这将允许访问其他公司的数据

有没有办法让我放心地将数据安全地存储在本地存储中?

【问题讨论】:

这个问题在 security.stackexchange.com 上可能会更好。也就是说,如果有人可以通过相对基本的 URL 操作查看他们不应该能够查看的数据(无论是否采用 JSON 格式),那么您需要提高服务器端的安全性 - 这并不是真的你会在打字稿中解决的问题。 【参考方案1】:

使用基本上是 javascript 的 TypeScript 在安全方面存在问题,因为 JavaScript 是一种解释性语言,用户可以访问整个客户端代码。

因此,客户端加密等解决方案将不起作用,因为您在某些时候需要数据,这意味着您的客户端将拥有解密文件的代码,从而使恶意用户可以使用此代码。

阅读this article,它更深入地探讨了这个问题,并提出了几个可能对您有所帮助的选项。

【讨论】:

这是否意味着用户可以访问我的 firebase 配置详细信息,例如我的 app.module.ts 中的密钥,例如 apiKey、authDomain、databaseUrl 等? Firebase 文档告诉我把它放在那里 @Shai:该链接可能不可用。提供最少的信息应该更有趣,以便随着时间的推移使这个答案更有用。 @HDJEMAI 我在回答中写了这篇文章的要点——因为 JS 是一种解释性语言,所以你不能对其进行加密。本文对此进行了更多补充,但这是重点。【参考方案2】:

Firebase 具有内置的安全模型,您可以通过该模型定义对数据库中节点的自定义访问级别。这由 JWT 支持,它依赖于对用户权限进行编码的服务器签名令牌。如果令牌以任何方式被篡改或修改,则整个事物将变得无效。因此,如果您在 Firebase 端正确实施了安全措施,那么修改本地存储数据的用户应该根本不重要。

【讨论】:

以上是关于为 HTML Angular 2 项目使用本地存储的安全性的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 本地存储 Angular 2

严格模式下的 Angular 和本地存储

从 Angular2 访问 HTML5 本地存储

如何在 Angular 中处理本地存储丢失的项目?

Ionic/Angular:在本地存储中读写数组

使用来自本地 json 文件的 html 中的数据 - typescript, angular 7