Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khắc phục sự cố đăng nhập PHP SQL đơn giản

Đầu tiên, việc xử lý các lỗi trong quá trình phát triển là rất quan trọng, vì vậy chúng tôi kiểm tra xem bài đăng của chúng tôi có xuất hiện hay không, chúng tôi kiểm tra xem chúng tôi đã kết nối với cơ sở dữ liệu chưa, chúng tôi kiểm tra xem truy vấn của chúng tôi có được thông qua không và có thể chạy hay không, chúng tôi kiểm tra các tham số chúng tôi đang cung cấp cho truy vấn và cuối cùng chúng tôi thực hiện truy vấn.

Sau đó, bạn có thể sử dụng bind_result đặt tên cho một biến để nhận các trường từ truy vấn của bạn, giống như tôi đã làm.

Lưu ý về truy vấn của tôi mà tôi đang sử dụng như thế nào? đó là một câu lệnh được chuẩn bị sẵn mà chúng tôi xác định bằng cách sử dụng bind_param điều này là để tránh SQL injection, trong mã hiện tại của bạn, SQL Injection vẫn có thể thực hiện được vì bạn không làm sạch các biến của mình.

Một sai lầm khác mà tôi tin rằng bạn đang làm là lưu trữ mật khẩu dưới dạng văn bản thuần túy RẤT SAI LẦM, bạn nên luôn mã hóa mật khẩu để bảo vệ người dùng và chính mình. Đó là lý do tại sao tôi không đưa mật khẩu vào truy vấn MySQL của mình, trước tiên tôi chỉ sử dụng người dùng, nếu người dùng được tìm thấy thì tôi sử dụng mật khẩu mà anh ta đã đăng để khớp với mật khẩu đã truy xuất từ ​​cơ sở dữ liệu, trong trường hợp này tôi đang sử dụng bcrypt để thực hiện tác vụ vốn là một thư viện mã hóa rất an toàn.

Xem tại đây cách sử dụng bcrypt .

Chỉ sau khi tôi thấy rằng mật khẩu hợp lệ, tôi mới đặt dữ liệu vào phiên và chuyển hướng người dùng.

Ngoài tất cả các lỗi tôi đã chỉ ra ở cuối câu trả lời của mình, đây là cách tôi viết mã của bạn.

<?php
session_start();
include_once('bcrypt.php');
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';

if (!isset($_POST['Username']))
{
    echo 'Fill in the username...';
    exit;
}

if (!isset($_POST['Password']))
{
    echo 'Fill in your password...';
    exit;
}

$con = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
    die('Connect Error (' . $con->connect_errno . ') ' . $con->connect_error);
}

$sql = "SELECT Username, Password FROM `Members` WHERE Username = ?";
if (!$result = $con->prepare($sql))
{
    die('Query failed: (' . $con->errno . ') ' . $con->error);
}

if (!$result->bind_param('s', $_POST['Username']))
{
    die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}

if (!$result->execute())
{
    die('Execute failed: (' . $result->errno . ') ' . $result->error);
}

$result->store_result();
if ($result->num_rows == 0)
{
    die('No username found...');
}

$result->bind_result($db_username, $db_password);
$result->fetch();
$result->close();
$con->close();

$bcrypt = new Bcrypt(15);
if ($bcrypt->verify($password, $db_password))
{
    $_SESSION['Username'] = $db_username;
    header('location:login_success.php');
    exit;
}
else
{
    echo 'Wrong Username or Password';
}

LƯU Ý:Đoạn mã trên chỉ là một ví dụ và chưa được kiểm tra, nếu bạn nhận thấy bất kỳ lỗi nào với nó, hãy cho tôi biết.

Một số lỗi tôi đã nhận thấy trên mã bạn đã đăng:

Bạn đang thiếu ; đóng ở đây:

$sql = "SELECT * FROM $Members WHERE Username = '$Username' and Password = '$Password'"

Ngoài ra trong truy vấn của bạn, bạn có $Members nhưng bạn không có $Members biến được xác định ở bất kỳ đâu trong mã của bạn, có lẽ bạn muốn nói Members thay vào đó, như trong:

$sql = "SELECT * FROM `Members` WHERE Username = '$Username' and Password = '$Password'";

Điều này không nên

$count = mysql_num_rows($result);

Hãy

$count = mysqli_num_rows($result);‌

$result=mysqli_query($sql); 

Hãy

$result=mysqli_query($sql_connection, $sql);

Bạn không có truy vấn nào ở phần bên dưới của mysqli_query

if (!mysqli_query($sql_connection)) 



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách sử dụng STRCMP () để so sánh 2 chuỗi trong MySQL

  2. Sử dụng JDeveloper với Cơ sở dữ liệu MySQL và Cơ sở dữ liệu Oracle trên AWS RDS, Phần 2

  3. PostgreSQL so với MySQL

  4. Làm cách nào để tạo cơ sở dữ liệu nhiều người thuê với cấu trúc bảng được chia sẻ?

  5. Làm cách nào để biết giao dịch nào đang gây ra trạng thái khóa siêu dữ liệu bảng Đang chờ?