PHP形式欺骗代码

时间:2013-05-11 16:51:47

标签: php forms security spoofing

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

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 个答案:

答案 0 :(得分: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>

希望有所帮助

答案 1 :(得分:0)

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

md5(time()+53498238923);

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