防止针对机器人的多页表单

时间:2017-01-07 13:25:28

标签: php forms security

我尝试为我的脚本设计一个save reset-password-page。我走得很远,但现在我需要一些帮助。我已经得到了什么:

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

    为了防止这种情况,我在第2页放了验证码。

    但现在我需要保护第3页/表格。现在我给出令牌并第二次检查它。多数民众赞成并不好,使得1st-captcha毫无用处。给它另一个验证码是可能的,但不是用户友好的。填写第3个表单后检查验证码也不是用户友好的。

    那么我怎样才能确保用户在我的脚本中传递了令牌页面(带有验证码)。因此,用户不能仅使用我的第三种形式的输入数据(密码更改形式)发送POST(例如,使用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>
    

1 个答案:

答案 0 :(得分:0)

嘿,我也是一名正在上手的程序员,我主要从事登录和工作。 以下是我的建议:

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

    干杯, RJ