Phalcon - 安全特性



Phalcon 通过安全组件提供安全特性,该组件有助于执行某些任务,例如密码哈希和**跨站点请求伪造**(CSRF)。

哈希密码

**哈希**可以定义为将固定长度的比特串转换为指定长度的过程,以使其无法逆转。输入字符串的任何更改都会更改哈希数据的取值。

哈希数据的解密通过将用户输入的值作为输入并将其与相同的哈希形式进行比较来完成。通常对于任何基于 Web 的应用程序,将密码以纯文本形式存储都是一种不好的做法。它容易受到第三方攻击,因为那些访问数据库的人可以轻松获取任何用户的密码。

Phalcon 提供了一种简单的方法来以加密形式存储密码,遵循诸如**md5、base64**或**sh1**之类的算法。

如前几章所述,我们在其中为博客创建了一个项目。登录屏幕接受用户名和密码作为用户的输入。为了接收来自用户的密码并将其解密为特定形式,使用了以下代码片段。

然后将解密的密码与从用户接收的输入密码进行匹配。如果值匹配,则用户可以成功登录到 Web 应用程序,否则将显示错误消息。

<?php  
class UsersController extends Phalcon\Mvc\Controller {  
   public function indexAction() {  
   }  
   public function registerUser() { 
      $user = new Users();  
      $login    = $this->request->getPost("login"); 
      $password = $this->request->getPost("password");
      $user->login = $login;  
      
      // Store the hashed pasword 
      $user->password = $this->security->sh1($password);  
      $user->save(); 
   }  
   public function loginAction() {  
      if ($this->request->isPost()) {  
         $user = Users::findFirst(array( 
            'login = :login: and password = :password:', 
            'bind' => array( 
               'login' => $this->request->getPost("login"), 
               'password' => sha1($this->request->getPost("password")) 
            ) 
         ));  
         if ($user === false) { 
            $this->flash->error("Incorrect credentials"); 
            return $this->dispatcher->forward(array( 
               'controller' => 'users', 
               'action' => 'index' 
            )); 
         }
         $this->session->set('auth', $user->id);  
         $this->flash->success("You've been successfully logged in"); 
      }  
      return $this->dispatcher->forward(array( 
         'controller' => 'posts', 
         'action' => 'index' 
      )); 
   }  
   public function logoutAction() { 
      $this->session->remove('auth'); 
      return $this->dispatcher->forward(array( 
         'controller' => 'posts', 
         'action' => 'index' 
      )); 
   }  
}     

存储在数据库中的密码采用**sh1**算法的加密格式。

Password

一旦用户输入了合适的用户名和密码,用户就可以访问系统,否则会显示错误消息作为验证。

Validation

跨站点请求伪造 (CSRF)

这是一种攻击,它迫使 Web 应用程序的已认证用户执行某些不希望的操作。接受用户输入的表单容易受到此攻击。Phalcon 试图通过保护通过表单发送到应用程序外部的数据来防止此攻击。

每个表单中的数据都通过令牌生成来保护。生成的令牌是随机的,并且与我们将表单数据发送到的令牌匹配(大多数情况下通过 POST 方法发送到 Web 应用程序外部)。

代码

<?php echo Tag::form('session/login') ?>  
   <!-- Login and password inputs ... -->  
   <input type = "hidden" name = "<?php echo $this->security->getTokenKey() ?>" 
      value = "<?php echo $this->security->getToken() ?>"/>  
</form> 

**注意** - 在发送表单令牌时使用会话适配器很重要,因为所有数据都将保存在会话中。

使用以下代码在**services.php**中包含会话适配器。

/** 
   * Start the session the first time some component request the session service 
*/ 

$di->setShared('session', function () { 
   $session = new SessionAdapter(); 
   $session->start();  
   return $session; 
});
广告