2016-06-29 2 views
0

У меня есть токен, который я пытаюсь проверить в представлении формы ниже, это мои функции токена с формой, которую я использую для отправки, а затем обработкой формы, где должен быть проверен токен. Я не могу заставить функцию токена работать по какой-либо причине?Обработка форм-факсов php

<?php 
function getToken() 
{ 
    if(!isset($_SESSION['user_token'])) 
    { 
    $_SESSION['user_token'] = md5(uniqid()); 
    } 
} 

function checkToken($token) 
{ 
    if($token != $_SESSION['user_token']) 
    { 
    header('location: 404.php'); 
    exit; 
    } 
} 
function getTokenField() 
{ 
    return '<input type="hidden" name="token" value="'.$_SESSION['user_token'].'" />'; 
} 
function destroyToken() 
{ 
    unset($_SESSION['user_token']); 
} 

Регистрационная форма с именем register.php, которая перенаправляется на страницу registerscript.php.

<?php getToken(); ?> 
<form method="post" action="registerscript.php"> 
<fieldset> 
    <legend>Registration Form</legend> 
    <table width="400" border="0" cellpadding="10" cellspacing="10"> 
     <tr> 
      <td></td> 
      <td style="font-weight: bold;color:red"> 

      <?php 
       if(isset($_SESSION['error'])) 
       { 
        echo '<p>'.$_SESSION['error']['firstname'].'</p>'; 
        echo '<p>'.$_SESSION['error']['lastname'].'</p>'; 
        echo '<p>'.$_SESSION['error']['username'].'</p>'; 
        echo '<p>'.$_SESSION['error']['email'].'</p>'; 
        echo '<p>'.$_SESSION['error']['password'].'</p>'; 
        echo '<p>'.$_SESSION['error']['country'].'</p>'; 
        unset($_SESSION['error']); 
       } 
      ?> 

      </td> 
     <tr> 
      <td style="font-weight: bold"><div align="right"><label for="firstname">First Name</label></div></td> 
      <td><input name="firstname" type="text" class="input" size="25" required /></td> 
     </tr>   <tr> 
      <td style="font-weight: bold"><div align="right"><label for="lastname">Last Name</label></div></td> 
      <td><input name="lastname" type="text" class="input" size="25" required /></td> 
     </tr>   <tr> 
      <td style="font-weight: bold"><div align="right"><label for="username">User Name</label></div></td> 
      <td><input name="username" type="text" class="input" size="25" required /></td> 
     </tr>   
     <tr> 
      <td style="font-weight: bold"><div align="right"><label for="password">Password</label></div></td> 
      <td><input name="password" type="password" class="input" size="25" required /></td> 
     </tr> 
     <tr> 
      <td style="font-weight: bold"><div align="right"><label for="confirmpw">Confirm Password</label></div></td> 
      <td><input name="confirmpw" type="password" class="input" size="25" required /></td> 
     </tr> 
     <tr> 
      <td style="font-weight: bold"><div align="right"><label for="email">Email</label></div></td> 
      <td><input name="email" type="email" class="input" size="25" required /></td> 
     </tr> 
     <tr> 
      <td style="font-weight: bold"><div align="right"><label for="country">Country</label></td> 
      <td><select name="country"> 
       <option selected value="0">Select Country</option> 
        <?php 
          while ($rowCerts = $resultcategories->fetch_assoc()) { 
          echo "<option value=\"{$rowCerts['country']}\">"; 
          echo $rowCerts['country']; 
          echo "</option>"; 
          } 
        ?> 

      </select></td> 
     </tr> 
     <tr> 
      <td height="23"></td> 
      <td><div align="right"> 
      <input type="submit" name="submit" value="Register!" /> 
      <?php echo getTokenField(); ?> 

На обработке на отправить я хочу, чтобы проверить маркер формы действует следующий код, но он берет меня к 404.php, как будто неты маркеров, но когда я просмотреть исходный код страницы есть токен.

  <?php 
       session_start(); 
       include_once('conn.php'); 
       if(isset($_POST['submit'])) 
       { 
        checkToken($token); 
        $firstname = $_POST["firstname"]; 
        $lastname = $_POST["lastname"]; 
        $username = $_POST["username"]; 
        $password = $_POST["password"]; 
        $confirmpw = $_POST["confirmpw"]; 
        $country = $_POST["country"]; 

        if(preg_match("/[^a-zA-Z0-9]+/", $firstname)) 
         { 
          $_SESSION['error']['firstname'] = "Incorrect characters used in Firstname.<br>"; 
         } 
       } 

Мой исходный код показывает:

  <input type="submit" name="submit" value="Register!" /> 
      <input type="hidden" name="token" value="f0de3e58dbd6196ac0f964203577abb0" />    </div></td> 
     </tr> 
    </table> 
</fieldset> 
+0

Вы начали сеанс в верхней части своих PHP-скриптов? –

ответ

0

ли $token множество в этой точке?

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

Или она должна быть

if(isset($_POST['submit'])) 
{ 
    checkToken($_POST['token']); 
} 
+0

Когда я проверяю источник формы регистра, создается сгенерированный токен, поэтому я предполагаю, что он iset? – nathzOO

0

Более вероятно, что предыдущий ответ правильный. Что у вас есть в файле conn.php?

Попробуйте добавить такую ​​строку:

echo "--$token--$_SESSION[user_token]--";die; 

перед линией

header('location: 404.php'); 

и сказать, что вы получите.

+0

может быть, потому что им переадресовывают с register.php на registerscript.php токен сеанса отличается? – nathzOO

+0

Я получил ---- f0de3e58dbd6196ac0f964203577abb0-- вещь его эхо после if ($ token! = $ _SESSION ['user_token']) – nathzOO

+0

Итак, ваша $ _SESSION ["user_token"] пуста. register.php и registerscript.php - то же самое. Вы не меняете домен, например, с www.domain.com на домен.com? – Vasya

Смежные вопросы