2014-02-06 41 views
1

不久之前,我遇到了一个关于AngularJS认证的教程。他们创造了一个AuthenticationService,看上去有点像这样:

angular.module("auth").factory("AuthenticationService", function ($http, $sanitize) { 

    function sanitizeCredentials(credentials) { 
     return { 
      username: $sanitize(credentials.username), 
      password: $sanitize(credentials.password) 
     }; 
    } 

    return { 
     login: function (credentials) { 
      return $http.post("auth/login", sanitizeCredentials(credentials)); 
     } 
    }; 
}); 

所以你看到的,$sanitize服务是用来消毒的用户名和密码。到目前为止这么好,但在这里使用它真的有意义吗?据我所知,$sanitize用于用户输入立即显示在HTML内。但是当我向服务器发送消息时,在前端进行消毒是非常有用的。因为任何人都可以重写这部分,所以我需要再次在服务器上执行此操作。那么为什么不直接发送它来消毒并在后端做重要的事情呢?

回答

2

你的问题似乎有两个部分。

关于$sanitize立即显示,不知道这意味着什么,B/C你可能有ng-model捕获用户名。

关于从客户端发送一个经过清理的用户名/密码而不是在服务器上执行,这是一个合理的问题。技术上你也可以做。海事组织这是一个保持用户输入始终清晰的问题。所有投入都应在最早的时候进行健全检查。像凭证这样的关键部分应该有两层理智,以免一个人无意中消失。或者更糟糕的是,在你的两个(或更多)理智层中的一个中发现了一个攻击向量。

回想一个众所周知的ldap攻击矢量,其中用户名如im-a-user)&&()。紧随其后的an和null是一个漏洞。为什么当这些字符串可以在输入点被擦掉时会漂浮在其周围?