【问题标题】:Check if button was pressed (html -> jquery -> php)检查按钮是否被按下(html -> jquery -> php)
【发布时间】:2013-01-09 23:17:26
【问题描述】:

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

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

【问题讨论】:

    标签: php jquery ajax


    【解决方案1】:

    我会做以下事情:

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

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

    【讨论】:

    • 这在实践中可行吗?我什么时候更新令牌?我有很多用户要同时提交表单
    【解决方案2】:

    您基本上是想防范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
    }
    

    【讨论】:

    • 我可以复制令牌 html 元素。并绕过表格。这行不通。
    • 还要检查推荐人吗?没有万无一失的方法可以防止这种事情发生。
    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多