我正在尝试动态填充隐藏的输入,并在每次用户提交表单时使用Ajax来获取它

时间:2019-01-27 15:14:57

标签: php ajax server-side-attacks

我正在使用PHP根据某些条件回显具有动态输入值的表单:

<?php

//when user lands on the login page, he is presented with a form.
//if he logged in with the incorrect password, the variable $attempts will increment by 1.

$failed_attempt = $attempts > 10 ? 'failed' : '' ;

echo '
    <form id="form_login">
    <input type="hidden" name="failed_attempt" id="failed_attempt" value="'.$failed_attempt.'" />
    <input type="hidden" name="current_time" id="current_time" value="'.date('Y-d-m H:i:s').'" />
    <input type="text" name="uid" id="uid" placeholder="Username/e-mail">
    <input type="password" name="pwd" id="pwd" placeholder="password"> 
    <button type="submit" name="login_submit" id="login_submit">Login</button>
    </form>';
    echo '<p id="result"></p>';
?>

...和表单上的Ajax提交以获取错误和成功消息,而无需刷新页面:

$(document).ready(function(){
    $('#login_submit').click(function(event) {
        // document.location.reload(true);
        event.preventDefault();
        $.ajax({
            url: "includes/login.inc.php",
            //'<?php echo $form_action; ?>',
            method: "post",
            data: $('#form_login').serialize() + "&submit_login",
            dataType: "text",
            success: function (html, data) {
                $('#result').html("Ajax Success Status:" + data + "<br>Result:" + html);
            }
        });
    });
});

但是,由于使用Ajax提交表单,因此页面永远不会“刷新”,因此用户始终看到相同的表单,并且无论$ failed_attempts值是多少,输入都保持不变。用户单击带有无效密码的“提交”。

我的问题是,在用户提交表单之前,如何“刷新”表单或仅一次输入?如果我取消对该部分的评论

// document.location.reload(true);

那么用户将永远看不到错误/成功消息,而且他也不知道出了什么问题。

我尝试了不同的方法,没有一个是正确的(即,无论采用哪种方法,我总是会遇到这样的情况。一旦我最终得到了一个非详细的方法,我仍然遇到问题输入字段保持不变,除非用户实际上自己刷新页面!)。

P.S。原因是:恐怕僵尸程序或DoS攻击者将能够多次提交该表单,并且如果它在x分钟内达到10次以上的尝试,我就必须停止登录。

0 个答案:

没有答案