2010-09-06 3 views
1

Quelqu'un peut-il regarder mes deux fonctions ci-dessous et suggérer ce que je peux faire? J'ai créé deux fonctions qui créent fondamentalement une clé unique et cela est répercuté dans un champ caché dans un formulaire et puis directement après que je vérifie si le formulaire a été soumis la deuxième fonction vérifie pour voir si la clé dans le champ caché correspond à la clé dans la session. Le problème que j'ai est de temps en temps il me redirige juste à la page interdite suggérant que les clés ne correspondent pas bien que je n'ai pas édité la clé de formulaire délibérément en utilisant mes outils de développement web de Firefox pour tester.PHP bug clé de forme

Je ne sais pas si c'est un problème de cache ou pas, quelqu'un peut-il voir s'il y a quelque chose qui me manque ou pourrait améliorer? Cela arrive seulement de temps en temps, par exemple si je soumets le formulaire plusieurs fois, il peut alors aller à la page interdite qui suggère que la clé dans le champ caché ne correspond pas à la clé de la session, bien que je ne vois rien de mal les fonctions.

Voici ma première fonction, cela crée une clé unique et cela est répercuté dans un champ caché dans le formulaire. J'ai également une limite de temps sur combien de temps un utilisateur doit soumettre le formulaire, mais j'ai commenté cela dès maintenant, car il semble se produire plus souvent lorsqu'il est activé.

 
function GenerateFormTokenHash($token) 
{ 
    $token = $_SESSION['token'] = md5(uniqid(mt_rand(), true)); 
    //$token_time = $_SESSION['token_time'] = time(); 
    return htmlspecialchars($token); 
    //return $token_time; 
} 

Pour utiliser la fonction ci-dessus i écho simplement GenerateFormTokenHash (jeton de $); dans un jeton appelé caché.

La fonction ci-dessous est utilisée directement après avoir vérifié si le formulaire a été soumis.

 
# Form Token Hash Validator 
function IsValidFormTokenHash() 
{ 
    /*global $websiteaddress; 
     $token_age = time() - $_SESSION['token_time']; 
     if($token_age >= 300) { 
      echo 'Session Expired'; 
      echo 'This form has now expired. '; 
      echo 'Please click here to go back to the form.'; 
      $_SESSION = array(); 
      setcookie(session_name(), '', time()-42000, '/'); 
      # Destroy the session 
      session_destroy(); 
      # Generate new seesion id 
      session_regenerate_id(true); 
      exit; 
     }*/ 
    if(isset($_POST['token']) && $_POST['token'] != $_SESSION['token'] || !isset($_POST['token']) || !isset($_SESSION['token'])) 
    { 
       $_SESSION = array(); 
       setcookie(session_name(), '', time()-42000, '/'); 
       # Destroy the session 
       session_destroy(); 
       # Generate new seesion id 
       session_regenerate_id(true); 
     redirect("/error/forbidden.php"); 
     exit; 
    } 
} 

Encore une fois cette fonction est dans mon fichier functions.php donc après je vérifie si le formulaire i a été soumis appelle simplement la fonction comme suit:

 
if(isset($_POST['submit'])) { 
    IsValidFormTokenHash(); 
} 

Je suis en train de travailler essentiellement pourquoi parfois de temps en temps, il pense juste que la clé de session et la clé dans le champ caché ne correspondent pas, peut-être un problème de cache ou quelque chose que je peux faire pour s'assurer qu'il fonctionne correctement?

Répondre

3

Probablement ce que vous avez besoin est de mettre entre parenthèses autour de vos if pièces de contrôle, ils sont probablement obtenir une évaluation d'une autre manière que vos besoins en logique:

if((isset($_POST['token']) && $_POST['token'] != $_SESSION['token']) //<-- added parenthesis around those 
    || !isset($_POST['token']) 
    || !isset($_SESSION['token'])) 
+0

« Très oui. » Je suis d'accord! – mattbasta

+0

Merci aularon semble être ok donc merci beaucoup pour votre temps et aide :) – PHPLOVER