Pregunta

Soy un principiante trabajando en un guión de entrada en PHP. Esta es la declaración token de forma que tengo hasta ahora:

$_SESSION["form_token"] = md5(rand(time (), true)) ;

Se emite el comunicado justo después de que el usuario indique que él / ella quiere iniciar sesión.

Mi comprensión limitada es que el propósito es identificar fichas de un único usuario en un punto único en el tiempo y para disfrazar el formulario de información simbólica.

A continuación, todo se vuelve borrosa. Aquí están mis 3 preguntas abiertas:

  1. Cuando es el mejor momento para "marcar" el token forma para fines de seguridad?

  2. ¿Cómo puedo comprobar que?

  3. Cuando, si alguna vez, puedo "destruir" el testigo de la forma? (IOW, sería el token de forma alojarse "activa" hasta que el usuario cierra la sesión?

¿Fue útil?

Solución

No hay necesidad de hacer lo que intenta realizar. Al iniciar una sesión en PHP con session_start () una única SessionID ya se generó para usted. Usted debe no a poner esto en el formulario. Se maneja a través de cookies de forma predeterminada. Tampoco hay necesidad de comprobar el SessionID o bien, que una vez más se maneja para usted.

Usted es responsable de la autenticación del usuario y el almacenamiento de su identidad autenticada (por ejemplo, $ _SESSION [ 'user_id'] = $ ID de usuario en la sesión. Si un usuario cierra la sesión se destruye su sesión con session_destroy.

Debe asegurarse session_start () es uno de los primero cosas para todas las páginas en su sitio.

Este es un ejemplo básico:

<?php
session_start(); // starts new or resumes existing session
session_regenerate_id(true); // regenerates SESSIONID to prevent hijacking

function login($username, $password)
{
    $user = new User();
    if ($user->login($username, $password)) {
        $_SESSION['user_id'] = $user->getId();
        return true;
    }
    return false;
}

function logout()
{
    session_destroy();
}

function isLoggedIn()
{
    return isset($_SESSION['user_id']);
}

function generateFormHash($salt)
{
    $hash = md5(mt_rand(1,1000000) . $salt);
    $_SESSION['csrf_hash'] = $hash
    return $hash;
}

function isValidFormHash($hash)
{
    return $_SESSION['csrf_hash'] === $hash;
}

Edit: no he entendido bien la pregunta original. Añadí los métodos pertinentes anteriormente para generar y validar de forma hashes;

Por favor, consulte los siguientes recursos:

Otros consejos

Esto es para prevenir ataques CSRF

http://en.wikipedia.org/wiki/Cross-site_request_forgery

un sitio malicioso podría mostrar una forma teóricamente que los puestos a su aplicación. la forma puede contener instrucciones que hacen que una fuga de datos o algún tipo de acción no deseada. el usuario podría ser engañado en la presentación de la forma que aceptaría la aplicación debido a que el usuario ya está conectado. una ficha forma asegura que el formulario fue creado por su sitio y no en otro sitio.

comprobar el HTTP_REFERER a menudo es lo suficientemente bueno, pero no tan completa una solución (por ejemplo https no enviará la cadena de referencia).

si realmente desea proteger todas las formas con un token, puede crear algunas funciones de conveniencia como emitToken () y checkToken () que harán que funcione en todo el sitio.

algunos ejemplos:

http://phpsec.org/projects/guide/2.html

http://www.rodsdot.com/php/CSRF_Form_Protection.php

Se puede revisar la aplicación de Zend Framework.

Además de la implementación específica, los documentos describen el razonamiento y el uso de este tipo de elemento en un formulario.

Su Zend_Form_Element_Hash https://docs.zendframework.com/zend-form/element/csrf/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top