防止访问 AngularJS 中的管理页面

Posted

技术标签:

【中文标题】防止访问 AngularJS 中的管理页面【英文标题】:Prevent access to admin pages in AngularJS 【发布时间】:2013-09-27 10:27:56 【问题描述】:

我想知道 AngularJS 中最好的方法是保护管理页面,即普通用户不应该看到的页面。显然,会有后端身份验证,但由于 AngularJS 应用程序是客户端,理论上人们仍然可以查看路由并直接访问这些 URL 并查看管理页面。

我使用 Express、PassportJS 和 MongoDB (Mongoose) 作为我的后端。自然,他们将无法与管理页面交互,因为在创建、删除时存在服务器端身份验证......但如果他们没有适当的访问。由于该应用程序完全是客户端 JS,我认为这是不可能的,因为人们可以修改路由等等。解决这个问题的最佳方法是什么?感谢您的任何意见!

【问题讨论】:

最好的方法是遵循这种方法***.com/questions/16139660/… 不要为用户提供不应该看到的内容:跨度> 【参考方案1】:

为什么您“更愿意”不向非管理员用户提供这些页面?除了一些你应该阻止人们看到他们“不应该”看到的东西的本能之外,你有真正关心这个的理由吗?

如果您的安全配置正确,那么非管理员用户将无法访问管理员数据或执行管理员操作。这才是你应该关注的,而不是发明复杂的方法来阻止他们看到他们无论如何都无法使用的管理屏幕。你花在这上面的任何时间基本上都是浪费时间,你应该把它花在更重要的事情上。

【讨论】:

对不起,但我无法相信这个答案,以及它已经被投票和选举的事实。我从事信息安全和地狱工作,问题很好,回答毫无意义。人,请,至少简单的解决方案... htdocs 并在提供资源之前评估资源的访问权限... 您声称它“毫无意义”,但没有反驳。敏感的是您的数据,而不是管理页面中的 html。为保护后者而付出的任何努力都是无所作为的安全战区,而且是在浪费您的时间和雇主的金钱。 我有员工,而不是雇主,因为我有一家公司。但是,让我们回到我的朋友的重点。披露信息是一个安全漏洞,披露受保护区域,甚至不应该看到某些东西的可视界面,也是一个错误,并且可能导致其他类型的攻击中的社会工程,你不应该披露有关如何应用程序的信息如果用户不应该看到它,则可以使用。参考:我们与银行和多个安全标准合作。如果您在博客上使用 Angular,那没关系。但这根本不是一个好习惯。 那你就是在浪费自己的钱。披露敏感信息是一个安全漏洞。你的应用程序的 UI 绝对不应该有任何敏感的东西,如果有,那就是设计缺陷。应用程序的安全模型越小越简单,就越容易推理并确保其正确性。您添加的所有内容在开发和维护方面都具有非零成本,并且通过尝试将严格的安全模型引入您的表示层,您只会使其设计复杂化,并有可能在 API 级别出现更严重的缺陷。 没关系,我不同意,没有客户会接受一个黑客可以看到限制区域的可视化界面的网上银行应用程序,这就像建立一个 if(用户已登录)一样简单在发送 UI 之前。没有什么私人的人,但一个重要的客户永远不会接受像“它不是敏感信息,它只是几个 div”这样的解决方案。这是我的最后一句话,兄弟,我想我已经表达了我的观点。对于那些关心 if(用户已登录)-> 发送角度,否则,302 的人。【参考方案2】:

我会在 routeProvider 中进行检查。这必须对每条需要身份验证的路由进行。您甚至可以编写一个单独的方法并将其粘贴到每个路由以避免重复。

$routeProvider
.when('/profile', 
  templateUrl: 'views/profile.html',
  controller: 'ProfileCtrl',
  resolve: 
    validate: function($q, $location) 
      // Either you could maintain an array of hashes on client side
      // a user do not have access to without login
      // Or hit the backend url to check it more securely
      var validateAccess = $q.defer();
      var isAllowed = ['profile', 'index', 'dashboard'].indexOf($location.hash()) !== -1;

      if (!isAllowed) 
        $location.path('/login');
      

      validateAccess.resolve();
      return validateAccess.promise;
    
  
)
.otherwise(
  redirectTo: '/'
);

【讨论】:

那并不能真正解决任何问题,不是吗?您仍然可以手动要求管理页面的 html/css。【参考方案3】:

这个问题有点老了,但如果有人正在寻找解决方案,我使用资源文件来存储我的 html 模板,然后在验证权限时使用 webapi 检索它,并仅在用户通过身份验证时返回 html。

【讨论】:

【参考方案4】:

我同意 Chris Russo 的担忧。这都是关于安全问题的。如果您在前端使用 Angular,那么如果有人试图攻击您的网站/应用程序,您需要一个具有强大保护您的应用程序能力的框架。我会推荐 Spring 框架 (spring_security),它已被证明具有保护您的 Web 应用程序的功能。您需要为每个用户分配角色,例如 ROLE_USER 或 ROLE_ADMIN。我不会详细说明如何做到这一点,但这将有助于解决您的疑虑。 :)

【讨论】:

【参考方案5】:

我这样做的方式是,将 angularJS html 放入 JSP 页面并检查会话。如果会话验证提供访问。 我不确定这是否是正确的方法。 另一种方法是,不使用 JSP,但每次 API 命中时,检查服务器上的会话,否则返回 false。 另一种方法是在第一次登录时,获取自动生成的密钥,同时存储在服务器和客户端,检查每个 API 命中。

【讨论】:

【参考方案6】:

你可以在ui-routerhttps://github.com/angular-ui/ui-router/tree/master中使用params

【讨论】:

以上是关于防止访问 AngularJS 中的管理页面的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Angularjs 1.x中的直接HTML访问?

在 jquery.load 页面中使用 angularjs

angularJS简单掉用接口,实现数组页面打印

执行前不显示AngularJS代码[重复]

AngularJS 作用域与数据绑定机制

angular js 初学