2013-05-11 93 views
-1

我有下面的代码应该防止形式欺骗。令牌用于匹配,并确保提交的表单从该网页..PHP形式欺骗代码

if (isset($_POST['Submit'])) { 
    if (!isset($_POST['token']) || $_POST['token'] != $_SESSION['token']) { 
     // error, form spoofing, return to users' page or do something else 
     echo '<script>', 
       'alert("Form spoofing error!! Please Try again later")', 
      '</script>'; 
    } else { 
     //Continue with submission 
    } 
} 

错误显示出来的每次我提交表单,需要显示时,才会有安全风险。

谢谢。

编辑:下面的代码在页面的开始时加入:

$_SESSION['token'] = md5(time()); 

添加隐藏字段与提交后在会议开始时创建的令牌相匹配:

<input name="token" id="token" value="<?php echo md5(time()); ?>" type="hidden"> 

PHP欺骗错误出现在每个表单提交之后,不允许我提交表单。

+2

何时产生了$ _SESSION ['token']'?在比较旧版本之前是否有可能在页面加载时生成新的令牌? – DCoder 2013-05-11 16:55:30

+1

echo'$ _POST ['token']'和'$ _SESSION ['token']'看看它们有什么价值。 – 2013-05-11 16:55:33

+0

太早了,没有足够的咖啡让我看看它是什么。肯定会尝试Siamak建议的调试,并且我还建议您使用!==(身份而不是平等)来加强它。 – 2013-05-11 17:07:47

回答

0

这里有一个例子,你可以尝试,它需要一个POST请求之前加载至少一次第一页砥,也令牌密钥也被散列的乐趣:

<?php 
session_start(); 

if ($_SERVER['REQUEST_METHOD']=='POST') { 

    if (!isset($_SESSION['token_key']) || 
     !isset($_SESSION['token'])  || 
     !isset($_POST[$_SESSION['token_key']]) || 
     $_POST[$_SESSION['token_key']] != $_SESSION['token']) { 

     echo 'Form spoofing error!'; 
    } else { 
     //Continue with validation ect 
     echo 'alls good!'; 
    } 
} 
//set after any checks on previous values 
$_SESSION['token_key'] = sha1(microtime(true)); 
$_SESSION['token'] = sha1(microtime(true)+1); 
?> 
<form method="POST" action=""> 
    <input type="hidden" name="<?php echo $_SESSION['token_key'];?>" value="<?php echo $_SESSION['token'];?>" /> 
    <p><input type="text" name="yada" size="20"> 
    <input type="submit" value="Submit" name="B1"></p> 
</form> 

希望它有助于

+0

我会试试这个。谢谢。 – virs90 2013-05-11 17:25:49

+0

我收到'表格欺骗错误!'提交之后的消息和表单也会提交。任何帮助可能吗? 谢谢。 – virs90 2013-05-11 20:02:32

+0

也许你有会话问题,你应该检查你的会话是否正常工作。 – 2013-05-11 20:11:41

0

你还应该考虑在你的哈希中添加一个salt,因为用你的方法是有人能够找到脚本运行的时间,他们可以对它进行散列并欺骗你的令牌。加入盐后,他们也需要知道盐。

md5(time()+53498238923); 

只要任何随机数就可以做到这一点。