6

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

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

一旦我了解如何正确执行此操作,我将在不久的将来为此添加密码检查。

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

应用程序.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}
    });
});

控制器.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")
        }
    }
}
4

1 回答 1

11

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

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

这样做的正确方法如下:

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

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

于 2013-02-07T15:48:18.447 回答