📜  Phalcon-安全功能

📅  最后修改于: 2020-10-21 05:31:58             🧑  作者: Mango


Phalcon在安全性组件的帮助下提供了安全性功能,该组件有助于执行某些任务,例如密码哈希和跨站点请求伪造(CSRF)。

哈希密码

散列可以定义为将固定长度的位字符串转换为指定长度的过程,这种方式不能将其反转。输入字符串中的任何更改都会更改散列数据的值。

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

Phalcon提供了一种简单的方式来存储加密形式的密码,该方式遵循md5,base64sh1之类的算法。

如前几章所述,我们为博客创建了一个项目。登录屏幕接受输入作为用户的用户名和密码。要从用户处接收密码并以特定形式对其进行解密,请使用以下代码段。

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

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算法的加密格式。

密码

用户输入适当的用户名和密码后,用户即可访问系统,否则将显示一条错误消息作为验证。

验证方式

跨站请求伪造(CSRF)

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

每种形式的数据都在令牌生成的帮助下得到保护。生成的令牌是随机的,并且与我们向其发送表单数据的令牌匹配(通常是通过POST方法在Web应用程序外部)。

码:

  
     
     
 

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

使用以下代码将会话适配器包括在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; 
});