0

我有这个设置:带有提交按钮的HTML表单->检查是否在jquery中按下了按钮->然后通过$.post(jquery)将输入发送到php页面。

如果有人真的按下了 HTML 表单中的按钮,我如何在 php 代码中判断?我想阻止用户在不通过我的表单的情况下向 php 页面提交 $_POST 值。

4

2 回答 2

1

我会做以下事情:

  1. 以基于当前日期/时间生成随机散列令牌的形式具有隐藏的帖子值。
  2. 首次提交表单时保存此令牌。(数据库)
  3. 每次有人尝试提交表单时,随机令牌都会更新,它将是唯一的,因为它将基于时间戳。因此,如果用户仅通过复制令牌和 POST 数据而不通过表单来提交表单,则您的代码应在 PHP 端检查该令牌是否已存在于数据库中。如果它确实提示用户友好的错误消息或重定向。如果没有,则更新旧令牌以保存新令牌。

令牌可以保存在 DB 或 Session 中,具体取决于您想对它们做什么。

于 2013-01-25T22:19:59.703 回答
0

您基本上是要防范CSRF。正如 GGio 所说,基于会话的令牌是实现这一目标的最佳方式。

if (!isset($_SESSION['token'])) {
    $token = sha1(uniqid(rand(), true) . $_SESSION['user_id']);
    $_SESSION['token'] = $token;
    $_SESSION['token_time'] = time();
}
else{
    $token = $_SESSION['token'];
}

在您的表单元素中:

<input type = "hidden" name = "token" value = "<?php echo $token; ?>" >

在处理表格之前:

if(isset($_SESSION['token']) && isset($_POST['token']) && $_POST['token'] === $_SESSION['token']){
    //user submitted the form correctly
}
else{
    //something isn't right
}
于 2013-01-25T22:21:42.290 回答