1

我已经使用 PHP 创建了一个登录系统,但是,我还添加了两个因素身份验证。我想登录而无需刷新页面,因此在询问 2FA 代码时看起来更好

我这样做的方法是通过 ajax 发送用户名和密码。我的 php 脚本然后检查这个,然后它会回显登录或错误

这是我的 JavaScript 代码

$(document).ready(function() {
    $('#login-form').submit(function(e) {
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: 'inc/auth.php',
            data: $(this).serialize(),
            dataType: 'text',
            success: function(data)
            {
                alert(data);
                if (data === 'login') {
                    window.location = '/user-page.php';
                }
                else {
                    alert('Invalid Credentials');
                }
            },
        });
    });
});

这很好用,当我提醒数据时我得到“登录”(显然不带引号)但是它不会将我发送到 user-page.php,而是给我无效凭据警报。尽管 php 页面返回登录,但 javascript 就像“不!” 我究竟做错了什么?这是我的表格

<form class="form" id="login-form" name="login-form" method="post" role="form" accept-charset="UTF-8">
  <div class="form-group">
    <label class="sr-only" for="exampleInputEmail2">Gebruikersnaam</label>
    <input type="username" class="form-control" id="gebruikersnaam" name="gebruikersnaam" placeholder="gebruikersnaam" required>
  </div>
  <div class="form-group">
    <label class="sr-only" for="exampleInputPassword2">Wachtwoord</label>
    <input type="password" class="form-control" id="wachtwoord" name="wachtwoord" placeholder="Password" required>
    <div class="help-block text-right"><a href="">Forget the password ?</a></div>
  </div>
  <div class="form-group">
    <button type="submit" class="btn btn-primary btn-block">Sign in</button>
  </div>
</form>

我通过这个页面运行 javascript <script src="auth.js"></script>。我也尝试将它直接放在脚本标签中,女巫也失败了。

4

1 回答 1

1

这是出于测试目的,我相信您的dataType应该是htmljson

$(document).ready(function() {
    $('#login-form').submit(function(e) {
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: 'inc/auth.php',
            data: $(this).serialize(),
            dataType: 'html',
            success: function(data)
            {
                alert(data);
                if (data == 'login') {
                    window.location = '/user-page.php';
                }
                if (data == 'failed') {
                    alert('Invalid Credentials');
                }

            },
        });
    });
});

在没有您的服务器逻辑的情况下您的 php inc/auth.php FOR 测试目的

//$gebruikersnaam= $_POST['gebruikersnaam'];
//$wachtwoord= $_POST['wachtwoord'];


$gebruikersnaam= 'nancy';
$wachtwoord= 'nancy123';

if($gebruikersnaam=='nancy' && $wachtwoord=='nancy123')
{
    echo "login";
}
else
{
    echo "failed";
}

至于 SO Scholar 在评论中提到的 CSRF 攻击。您将需要生成类似 md5 令牌的东西,并将其存储在会话中。您现在将与每个请求一起发送它,例如。在隐藏的表单输入中并验证它是否与服务器端的匹配。如果匹配允许登录,否则触发模拟

更新

$(document).ready(function() {
    $('#login-form').submit(function(e) {
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: 'inc/auth.php',
            data: $(this).serialize(),
            dataType: 'JSON',
            success: function(data)
            {
                alert(data);
                if (data.login == 'success') {
                    window.location = '/user-page.php';
                }
                if (data.login == 'failed') {
                    alert('Invalid Credentials');
                }

            },
        });
    });
});

PHP

<?php
error_reporting(0);
$gebruikersnaam= 'nancy';
$wachtwoord= 'nancy123';

if($gebruikersnaam=='nancy' && $wachtwoord=='nancy123')
{
    $return_arr = array('login'=>'success');
}
else
{
    $return_arr = array('login'=>'failed');
}
echo json_encode($return_arr);
于 2019-10-08T23:16:59.420 回答