Como crear llave de seguridad en los formularios

De KumbiaPHP Framework Wiki
Revisión del 01:07 7 ago 2010 de Argordmel (discusión | contribuciones) (Crear llave de seguridad en los formularios con Kumbiaphp)

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

<?php

class SecurityKey {

    /**
     * Genera un input tipo hidden con el valor de la llave
     *     
     * @return string
     */
    public static function generateKey(){

        $h = date("G")>12 ? 1 : 0;
        $time = uniqid().mktime($h, 0, 0, date("m"), date("d"), date("Y"));
        $key = sha1($time);
        $_SESSION['rsa32_key'] = $key;
                
        return "<input type='hidden' id='rsa32_key' name='rsa32_key' value='$key' />\r\n";
    }

    /**
     * Devuelve el resultado de la llave almacenada en sesion
     * con la enviada en el form
     *
     * @return boolean
     */
    public static function isValid () {

        $key = isset($_SESSION['rsa32_key']) ? $_SESSION['rsa32_key'] : null;

        if( (!is_null($key) ) && ($key === Input::post('rsa32_key')) ) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Devuelve la ultima llave almacenada en sesion
     *
     * @return string
     */
    public static function getKey() {

        $key = isset($_SESSION['rsa32_key']) ? $_SESSION['rsa32_key'] : null;

        return $key;

    }
    
}
?>


2. Forma de uso:

  • En la vista y antes de hacer el cierre del formulario imprimimos la llave
<?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
public function create () {

  if( Input::hasPost('menus') ) {

    if(SecurityKey::isValid()) { 

      $menu = new Menus(Input::post('menus'));

      if(!$menu->save()){

        Flash::error('Falló Operación');

      }else{

        Flash::valid('Operación exitosa');
        Input::delete();

      }

    } else {

      Flash::error('Acceso incorrecto al sistema');

    }

  }  
        
}


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