Phalcon - Funciones de seguridad
Phalcon proporciona funciones de seguridad con la ayuda del componente de seguridad, que ayuda a realizar ciertas tareas como hash de contraseña y Cross-Site Request Forgery (CSRF).
Contraseña hash
Hashingpuede definirse como el proceso de convertir una cadena de bits de longitud fija en una longitud especificada de tal manera que no se pueda invertir. Cualquier cambio en la cadena de entrada cambiará el valor de los datos hash.
El descifrado de datos hash se realiza tomando el valor ingresado por el usuario como entrada y comparando el formato hash del mismo. Por lo general, para cualquier aplicación basada en web, almacenar las contraseñas como texto sin formato es una mala práctica. Es propenso a ataques de terceros, ya que aquellos que tienen acceso a la base de datos pueden obtener fácilmente contraseñas para cualquier usuario.
Phalcon proporciona una forma sencilla de almacenar contraseñas en forma cifrada que sigue un algoritmo como md5, base64 o sh1.
Como se vio en los capítulos anteriores, donde creamos un proyecto para blogs. La pantalla de inicio de sesión acepta la entrada como nombre de usuario y contraseña para el usuario. Para recibir las contraseñas del usuario y descifrarlas en una forma particular, se utiliza el siguiente fragmento de código.
Luego, la contraseña descifrada se compara con la contraseña aceptada como entrada del usuario. Si el valor coincide, el usuario puede iniciar sesión correctamente en la aplicación web; de lo contrario, se muestra un mensaje de error.
<?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'
));
}
}
Las contraseñas almacenadas en la base de datos están en formato cifrado de sh1 algoritmo.
Una vez que el usuario ingresa un nombre de usuario y contraseña apropiados, el usuario puede acceder al sistema; de lo contrario, se muestra un mensaje de error como validación.
Falsificación de solicitud entre sitios (CSRF)
Es un ataque que obliga a los usuarios autenticados de la aplicación web a realizar determinadas acciones no deseadas. Los formularios que aceptan aportaciones de los usuarios son vulnerables a este ataque. Phalcon intenta prevenir este ataque protegiendo los datos que se envían a través de formularios fuera de la aplicación.
Los datos de cada formulario se protegen con la ayuda de la generación de tokens. El token generado es aleatorio y coincide con el token al que enviamos los datos del formulario (principalmente fuera de la aplicación web a través del método POST).
Código:
<?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>
Note - Es importante utilizar el adaptador de sesión al enviar tokens de formulario, ya que todos los datos se mantendrán en la sesión.
Incluir adaptador de sesión en services.php usando el siguiente código.
/**
* Start the session the first time some component request the session service
*/
$di->setShared('session', function () {
$session = new SessionAdapter();
$session->start();
return $session;
});