Php 防止多页表单攻击机器人程序

Php 防止多页表单攻击机器人程序,php,forms,security,Php,Forms,Security,我尝试为我的脚本设计一个保存重置密码页面。我走了很远,但现在我需要一些帮助。我已经得到了: 用户将他的邮件放入表单中,脚本向他发送一封带有用户必须打开的url的邮件。参数:usertype、userid、token 如果用户访问该url,他将进入一个页面,其中包含一个已插入令牌的表单。他只需要点击“继续” 第三页显示更改密码的表单 现在我对这个脚本的安全性有点怀疑。假设攻击者知道邮件、用户类型和用户ID(只会是登录的人,但可能知道所有这些)。他现在可以向用户邮件发送密码重置链接。到目前为止还没有

我尝试为我的脚本设计一个保存重置密码页面。我走了很远,但现在我需要一些帮助。我已经得到了:

  • 用户将他的邮件放入表单中,脚本向他发送一封带有用户必须打开的url的邮件。参数:usertype、userid、token
  • 如果用户访问该url,他将进入一个页面,其中包含一个已插入令牌的表单。他只需要点击“继续”
  • 第三页显示更改密码的表单
  • 现在我对这个脚本的安全性有点怀疑。假设攻击者知道邮件、用户类型和用户ID(只会是登录的人,但可能知道所有这些)。他现在可以向用户邮件发送密码重置链接。到目前为止还没有问题。 但他知道现在已经生成了一个令牌,可以尝试对其进行强制。为此,他使用已知参数调用第2或第3页,并尝试每个令牌

    为了防止这种情况发生,我在第二页添加了验证码

    但是现在我需要保护第三页/表单。现在,我给了代币,并第二次检查它。这不太好,使得第一次验证码毫无用处。给它另一个验证码是可能的,但不是用户友好的。填写第三张表格后检查验证码也不方便用户使用

    因此,我如何确保用户在我的脚本中通过了令牌页面(带有验证码)。因此,用户不能只发送带有我的第三个表单(密码更改表单)输入数据的帖子(例如,使用curl)

    先谢谢你

    第二表格

    <form name="confirm" method="GET">
    <p>
    <label for="confirm">Token
    <input type="text" name="confirm" id="confirm_code"
    <?php
    if(isset($_GET['confirm'])) echo ' value="'.$_GET['confirm'].'"';
    ?>
    ></label>
    </p>
    <p><div class="g-recaptcha" data-sitekey="X" data-callback="checked" data-size="invisible"></div></p>
    <p style="text-align:center;">
    <input type="submit" value="Proceed">
    </p>
    <?php
    echo '<input type="hidden" name="usertype" value="'.$_GET['usertype'].'">';
    echo '<input type="hidden" name="userid" value="'.$_GET['userid'].'">';
    echo '</form>';
    
    <form name="change" method="post">
    <p>
    <label for="pw">New pw
    <input type="password" name="pw" id="pw"></label>
    </p><p><label for="pw_repeat">Repeat
    <input type="password" name="pw_r" id="pw_repeat"></label>
    </p><p style="text-align:center;">
    <input type="hidden" name="usertype" value="<?php echo $_GET['usertype']; ?>">
    <input type="hidden" name="userid" value="<?php echo $_GET['userid']; ?>">
    <input type="submit" name="change" value="Change now">
    </p>
    </form>
    
    
    
    代币
    
    嘿,我也是一个刚开始工作的程序员,我的工作主要是登录之类的。 以下是我的建议:

  • 添加一个纯随机生成自动密钥的算法
  • 根据随机密钥和指定值集生成链接(保密),并确保最终生成的链接非常大
  • 在第二个页面上,确保您请求一个密钥(您可以将此密钥与页面链接一起直接发送到他的电子邮件),即随机生成的密钥,然后算法神奇地解密,以查看基础数据是否与他帐户上附加的某些值或其他内容相同
  • 确保链接在强行通过页面所需的时间内过期
  • 如果您能确保正确遵循上述步骤,那么即使用户有点不舒服,您的安全性也会相当好。你觉得怎么样

    干杯,
    Rj

    查找i)双因素身份验证。ii)防止跨站点请求伪造,iii)跨页面使用会话数据。谢谢!我忘了。我将阅读XSRF,并用我认为合适的会话来阻止它。对不起,我的问题是noob。