Phalcon借助安全组件提供安全功能,有助于执行某些任务,如密码哈希和跨站请求伪造(CSRF).
散列密码
散列可以定义为将固定长度的位串转换为指定长度的过程,使其无法反转.输入字符串中的任何更改都将更改散列数据的值.
通过将用户输入的值作为输入并比较相同的散列形式来进行散列数据的解密.通常对于任何基于Web的应用程序,将密码存储为纯文本是一种不好的做法.它容易受到第三方攻击,因为有权访问数据库的人可以轻松地为任何用户获取密码.
Phalcon提供了一种以加密形式存储密码的简便方法,该方法遵循算法比如 md5,base64 或 sh1 .
如前几章所述,我们为博客创建了一个项目.登录屏幕接受输入作为用户的用户名和密码.要从用户接收密码并以特定形式解密,请使用以下代码段.
然后,解密的密码将与用户输入的密码相匹配.如果值匹配,则用户可以成功登录到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应用程序之外).
代码:
security->getTokenKey() ?>" value = "security->getToken() ?>"/>
注意 : 在发送表单令牌时使用会话适配器很重要,因为所有数据都将在会话中维护.
在 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; });