ajax 这种登录方法是否安全?

Is this method of ajax login secure at all?

我正在使用 ajax php 和 MySql 构建登录表单。

我做了相当多的研究,但我不喜欢在网上找到的很多帖子,所以我构建了以下代码。

我的问题是,这完全安全吗?我没有使用任何散列,我不确定如何使用 ajax 来完成。非常感谢所有示例

INDEX.PHP

<script>
$(document).ready(function(){

    $('form[name=loginForm]').submit(function() {

        $.post('ajax.php', {    username: $('[name=username]').val(), 
                                password: $('[name=password]').val()},
        function(data){
            if(data.success){

                alert('welcome');

            }else{  
                alert("incorrect"); 
            }
        }, 'json'); 

        return false;   
    });
});
</script>

ajax.php

<?php
if($_POST){

     /** Fetch data from mysql **/
        $u = $_POST['username'];
        $p = $_POST['password'];

    $sql = "SELECT * FROM users WHERE  username='$u' AND password='$p' ";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                    $_SESSION['userid'] = $row["username"];
                    $_SESSION['userid'] = $row["username"];

                    $data['success'] = true;
                } 
            } 
            else 
            {

                $data['success'] = false;

            }
     /** Fetch data from mysql **/

    echo json_encode($data);
}  ?>

非常感谢

My question is, is this secure at all?

不,它不安全。

I'm not using any hashing and I'm not sure how it would be done with ajax.

ajax实际上无法进行身份验证。恕我直言,您找错人了。

首先阅读 PHP 手册的这一部分。 http://php.net/manual/en/faq.passwords.php现在就去读吧。我们会等。

欢迎回来。您应该永远不要 将您的明文密码存入数据库。如果您不确定为什么是这样,请在线阅读 "Ashley Madison data breach" 或访问 https://haveIBeenPwned.com/

您想让窃取您的用户 table 的网络犯罪分子尽可能难以猜测您用户的密码。如果将它们存储为文本,则很容易猜测。

假设您的用户已经注册。您的密码验证的重点是

  1. 从用户那里收集用户名和密码。
  2. 在您的数据库中按名称查找用户,提取散列密码。
  3. 将数据库中的散列密码与您从用户那里收集到的密码进行比较。 php's password_verify() function 做得很好。
  4. 如果验证失败,则拒绝该用户的信息。 不要 给他们任何提示哪里出了问题。直接告诉他们 "your login failed." 你不想告诉他们 "you gave the right username but the wrong password."
  5. 如果验证成功,您将为该用户生成一个会话,这样他们就可以继续使用您网络应用程序中的其他页面而无需再次登录。 Read about php sessions here
  6. 您使用会话 ID 来表示会话。会话 ID 是一种难以猜测的数据令牌,具有有限的生命周期。 php 提供 session_create_id() method for this.
  7. 您将该会话 ID 放入 cookie 中并将其反馈给您的浏览器。 您无法可靠地向使用 AJAX 的浏览器提供 cookie,因此您的身份验证策略将不起作用。
  8. 对您的网络应用程序的后续请求会在 cookie 中显示会话 ID。您检查它以确保它有效并且没有超时。然后你做用户要求你做的事。