使用AngularJS安全处理登录的最佳方法是什么

Fis*_*isu 6 javascript angularjs

我是Angular的新手.我正在开发一个简单的登录表单,其中键入的用户名与从JSON查询返回的用户名进行比较.如果找到匹配项,则处理登录.

我觉得我这样做的方式并不安全,我是否认为可以通过浏览器的控制台访问返回的JSON字符串?

一旦我理解了如何正确地解决这个问题,我将在不久的将来为此添加密码检查.

我想指出正确的方向来解决用户登录Angular方式的问题.

app.js

angular.module('userApp', ["ngResource"]).

config(['$routeProvider', function($routeProvider) {
    $routeProvider.
        when('/login', {templateUrl: 'partials/login.html',   controller: LoginCtrl}).
        when('/loggedin', {templateUrl: 'partials/user-admin.html', controller: UserCtrl}).
        otherwise({redirectTo: '/login'});
}],[ '$locationProvider', function($locationProvider) {
    $locationProvider.html5Mode = true;
}]).

factory("User", function($resource) {
    return $resource("users/:userId.json", {}, {
        query: {method: "GET", params: {userId: "users"}, isArray: true}
    });
});
Run Code Online (Sandbox Code Playgroud)

controllers.js

function LoginCtrl($scope, $route, $routeParams, $location, User) {
    $scope.users = User.query();
    $scope.loginUser = function() {
        var loggedin = false;
        var totalUsers = $scope.users.length;
        var usernameTyped = $scope.userUsername;

        for( i=0; i < totalUsers; i++ ) {
            if( $scope.users[i].name === usernameTyped ) {
                loggedin = true;
                break;
            }
        }

        if( loggedin === true ) {
            alert("login successful");
            $location.path("/loggedin");
        } else {
            alert("username does not exist")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Łuk*_*man 11

是的,你是对的 - 这不安全.永远不要做这样的事情:

  • 切勿在数据库中存储普通密码(如"my_password_123")
  • 切勿将任何类型的敏感信息返回给客户端,并在JavaScript中执行秘密计算
  • 切勿providedPassword == stored password在服务器或客户端代码中使用简单的密码比较()
  • 永远不要使用不安全(http)层 - 改为使用安全(HTTPS)

这样做的正确方法如下:

  1. 在DB中存储密码时生成密码的哈希值.确保使用强哈希算法和盐渍密码.在撰写本回复时,SHA-256就足够了,但请务必检查它是否仍然被认为是安全的.
  2. 连接SSL证书以获得HTTPS支持,这样任何人都不会监视用户发送到您的服务器的内容
  3. 用户输入username+password并将其发送到服务器上的代码.在服务器上,您计算SHA-1哈希并将其与DB中的存储值进行比较.然后,您将身份验证的结果发送回客户端,并通过持久会话在服务器上保留它的跟踪.

请记住,大多数这些东西都是由一些安全框架完成的,比如Spring Security.我不建议从头开始做这一切,因为安全性主题很多,而且很容易犯恶意用户可以使用的错误.

  • 很好的总结,但实际上在服务器上计算哈希的原因是什么?如果哈希是客户端站点创建的,当某人进入你的ssl连接时,它会更安全.对? (2认同)
  • 我不推荐SHA-1.它长期以来一直没有被认为是安全的.而是推荐SHA-256.这个问题的标题是很多人最终会看到这个答案,所以我认为值得更新推荐的算法. (2认同)