Como crear llave de seguridad en los formularios

De KumbiaPHP Framework Wiki
Saltar a: navegación, buscar


Esta es una buena clase que nos permite verificar que el formulario enviado por el cliente coincide con una llave almacenada en sesion.

1. Copiamos la clase y la guardamos en la siguiente dirección

miapp/libs/security_key.php

  1. <?php
  2.  
  3. class SecurityKey {
  4.  
  5.     /**
  6.      * Genera un input tipo hidden con el valor de la llave
  7.      *     
  8.      * @return string
  9.      */
  10.     public static function generateKey(){
  11.  
  12.         $h = date("G")>12 ? 1 : 0;
  13.         $time = uniqid().mktime($h, 0, 0, date("m"), date("d"), date("Y"));
  14.         $key = sha1($time);
  15.         $_SESSION['rsa32_key'] = $key;
  16.  
  17.         return "<input type='hidden' id='rsa32_key' name='rsa32_key' value='$key' />\r\n";
  18.     }
  19.  
  20.     /**
  21.      * Devuelve el resultado de la llave almacenada en sesion
  22.      * con la enviada en el form
  23.      *
  24.      * @return boolean
  25.      */
  26.     public static function isValid () {
  27.  
  28.         $key = isset($_SESSION['rsa32_key']) ? $_SESSION['rsa32_key'] : null;
  29.  
  30.         if( (!is_null($key) ) && ($key === Input::post('rsa32_key')) ) {
  31.             return true;
  32.         } else {
  33.             return false;
  34.         }
  35.     }
  36.  
  37.     /**
  38.      * Devuelve la ultima llave almacenada en sesion
  39.      *
  40.      * @return string
  41.      */
  42.     public static function getKey() {
  43.  
  44.         $key = isset($_SESSION['rsa32_key']) ? $_SESSION['rsa32_key'] : null;
  45.  
  46.         return $key;
  47.  
  48.     }
  49.  
  50. }
  51. ?>


2. Forma de uso:

  • En la vista y antes de hacer el cierre del formulario imprimimos la llave
  1. <?php echo SecurityKey::generateKey(); ?>


  • Esto nos generará un input tipo hidden asi:
 
<input type='hidden' id='rsa32_key' name='rsa32_key' value='7e3dd021785706cf2467bbad3382d08a13f192b3' />


  • En el controller o en el modelo verificamos la llave
  1. public function create () {
  2.  
  3.   if( Input::hasPost('menus') ) {
  4.  
  5.     if(SecurityKey::isValid()) { 
  6.  
  7.       $menu = new Menus(Input::post('menus'));
  8.  
  9.       if(!$menu->save()){
  10.  
  11.         Flash::error('Falló Operación');
  12.  
  13.       }else{
  14.  
  15.         Flash::valid('Operación exitosa');
  16.         Input::delete();
  17.  
  18.       }
  19.  
  20.     } else {
  21.  
  22.       Flash::error('Acceso incorrecto al sistema');
  23.  
  24.     }
  25.  
  26.   }  
  27.  
  28. }


Para cualquier comentario referente a esta clase, puedes acudir al IRC, la lista de correo o el Foro de KumbiaPHP.