-1

我有以下代码可以防止表单欺骗。令牌用于匹配并确保提交的表单来自该页面。

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 欺骗错误,这不允许我提交表单。

4

2 回答 2

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>

希望能帮助到你

于 2013-05-11T17:24:01.280 回答
0

您还应该考虑在哈希中添加盐,因为通过您的方法,有人能够找到脚本运行的时间,他们可以对其进行哈希并欺骗您的令牌。添加盐后,他们还需要知道盐。

md5(time()+53498238923);

任何随机数都可以做到这一点。

于 2013-05-11T17:30:34.863 回答