如何保护我的登录页面

use*_*091 6 javascript php ajax jquery html5

我有一个login.html网页,允许用户输入他的用户名和密码.当他点击提交时,我使用Javascript收集输入的值,然后对php文件进行Ajax POST调用并发送用户名和密码.

我担心的是,这是一种安全的方式来发送用户名和密码吗?如果不能如何保护这个从html文件发送数据的事务到运行后端的php?

php文件然后连接到MySql Db并检查用户是否退出以及密码是否正确如果是,它只是将有效文本发送回javascript函数的ajax调用,如果不是我确定它是无效用户?

我对这个逻辑不太满意吗?有没有更好的方法来实现这个过程?由于我将我的代码投入生产,我希望尽可能地保护它.

下面的代码工作正常我只需要提示来保护它.

的login.html

<div>
    <h3>Login information</h3>

    <input type="text" name="user" id="usrnm" placeholder="Username/Email">
    <input type="password" name="pswdlogin" id="pswdlogin" placeholder="Password">
    <input type="checkbox" name="keepmeloggedin" id="keepmeloggedin" value="1" data-mini="true">
    <input type="submit" data-inline="false" onclick="logmein()" value="Log in">
    <div id="loginstatus">    </div>
 </div>
Run Code Online (Sandbox Code Playgroud)

logmein.js

function logmein() {

  var usrnm = document.getElementById("usrnm").value;
  var pswdlogin = document.getElementById("pswdlogin").value;

  $.post("http://xyz/mobile/php/logmein.php",
    {
      usrnm: usrnm,
      pswdlogin: pswdlogin
    },
    function(data, status) {

      if (data == 'Valid') {

        window.open("http://xyz/mobile/home.html?email=" + usrnm + "", "_parent");

      } else {
        alert(data);
        document.getElementById("loginstatus").innerHTML = data;
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

logmein.php

<?php

$usrnm_original = $_POST['usrnm'];
$pswdlogin_original = $_POST['pswdlogin'];

$con = mysqli_connect("localhost", "cSDEqLj", "4GFU7vT", "dbname", "3306");

if (mysqli_connect_errno())
    {
    echo "Failed to connect to MySQL: " . mysqli_connect_error();
    }

mysqli_select_db($con, "dbname");
$usrnm = mysqli_real_escape_string($con, $usrnm_original);
$pswdlogin = mysqli_real_escape_string($con, $pswdlogin_original);

$result = mysqli_query($con, "SELECT * FROM registration WHERE email = '" . $usrnm . "' AND password='" . $pswdlogin . "' ");
$rows = mysqli_num_rows($result);

if ($rows == 1)
    {
    echo "Valid";
    }
  else
    {
    echo "In Valid Credentials Entered";
    }

mysqli_close($con);
?>
Run Code Online (Sandbox Code Playgroud)

Ohg*_*why 9

这真的属于codereview.stackexchange.com,但无论如何我都会试一试.

首先,我会在表单中添加一个csrf令牌来阻止这些类型的攻击.

//the most simple type of csrf token
if (!isset($_SESSION['token'])):
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
else:
    $token = $_SESSION['token'];
endif;
Run Code Online (Sandbox Code Playgroud)

然后在您的表单中,包含一个隐藏的输入字段:

<input type="hidden" name="token" id="token" value="<?php echo $token; ?>"/>
Run Code Online (Sandbox Code Playgroud)

然后在你的ajax中添加令牌.

var usrnm = $('#usrnm').val();
var pswdlogin = $('#pswdlogin').val();
var token = $('#token').val();

{
    usrnm: usrnm,
    pswdlogin: pswdlogin,
    token: token
}
Run Code Online (Sandbox Code Playgroud)

然后在你的php中,让我们直接在访问该页面时停止未定义的索引错误.

$usrnm_original = isset($_POST['usrnm'])?$_POST['usrnm']:false;
$pswdlogin_original = isset($_POST['pswdlogin'])?$_POST['pswdlogin']:false;
$token = isset($_POST['token'])$_POST['token']:false;
Run Code Online (Sandbox Code Playgroud)

然后我们需要检查传递的令牌是否与我们的令牌相同

if(!$_SESSION['token'] == $token):
    die('CSRF Attacks are not allowed.');
endif;
Run Code Online (Sandbox Code Playgroud)

然后我们需要mysqli_query在接受用户数据时停止使用,即使使用mysqli_real_escape_string并使用prepared语句进行清理也是如此.此外,程序式代码让我哭泣,所以我们将改变它.此外,让我们返回一个包含状态和消息的数组,这样就可以更轻松地处理错误和成功报告.

$ret = array();
$mysqli = new mysqli("localhost", "cSDEqLj", "4GFU7vT", "dbname");

if($sql = $mysqli->prepare('SELECT * FROM registration WHERE email = ? and password = ?')):
    $sql->bind_param('ss', $usrnm_original, $pswd_original);

    if($sql->execute()):

        $sql->fetch();

        if($sql->num_rows > 0):
            $ret['status'] = true;
            $ret['msg'] = 'You have successfully logged in! Redirecting you now';
        else:
            $ret['status'] = false;
            $ret['msg'] = 'The credentials supplied were incorrect. Please try again';
        endif;
    endif;
    $sql->close();
    return json_encode($ret);
endif;
Run Code Online (Sandbox Code Playgroud)

现在我们需要修改你的帖子功能.

$.post("http://xyz/mobile/php/logmein.php",
{
  usrnm: usrnm,
  pswdlogin: pswdlogin,
  token:token
},
function(data) {

  if (data.status == true) {

    window.open("http://xyz/mobile/home.html?email=" + usrnm + "", "_parent");

  } else {
    alert(data.msg);
    $('#loginstatus').text(data.msg);
  }
}, 'json');
Run Code Online (Sandbox Code Playgroud)

最后,最重要的是,您使用了纯文本密码方法,从安全角度来看,这没有任何意义.这正是你被黑客攻击的方式.相反,您应该至少使用sha256散列方法.更改密码在数据库中的存储方式,sha256然后通过将其传递给SQL选择器进行比较,例如:

$pswdlogin_original = isset($_POST['pswdlogin'])? hash('sha256', $_POST['pswdlogin']):false;
Run Code Online (Sandbox Code Playgroud)

当保存在数据库中时,密码将如下所示fcec91509759ad995c2cd14bcb26b2720993faf61c29d379b270d442d92290eb.

我的回答是为了清楚起见,但实际上,你甚至不应该重新发明事物.有大量的应用程序和框架已经花费了无数的时间来保护他们的身份验证系统.我建议您仔细研究所有这些内容,因为它们有助于构建您的核心编程技能并教授基本的OOP实践

希望这有用.