// Câu lệnh SELECT Kiểm tra đăng nhập...
$sqlSelect = <<<EOT
SELECT *
FROM khachhang kh
WHERE kh.kh_tendangnhap = '$kh_tendangnhap' AND kh.kh_matkhau = '$kh_matkhau';
EOT;
a' or 't'='tNhư vậy câu truy vấn của ta có được hiểu như sau:
SELECT * FROM khachhang kh WHERE kh.kh_tendangnhap = 'zzxxcc' AND kh.kh_matkhau = 'a' or 't'='t';Câu truy vấn trên có ý nghĩa là gì? Mệnh đề WHERE của câu truy vấn trên luôn đúng, lí do là vì ‘t’=’t’ luôn cho ra giá trị đúng. Như vậy, thay vì trả về kết quả của 1 dòng dữ liệu mong muốn, câu truy vấn này trả về kết quả là toàn bộ dữ liệu của bảng users.
a' or 't'='t'; DROP TABLE users;Khi đó câu lệnh SQL từ ứng dụng gửi lên database server sẽ như sau:
SELECT * FROM users WHERE name = 'a' or 't'='t'; DROP TABLE users;Và toàn bộ các bản ghi trên bảng
users sẽ bị xoá bỏ!
\ nếu phát hiện trong dữ liệu gởi đến có các ký tự sau:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SQL Injection và cách phòng chống - Nền tảng .vn</title>
</head>
<body>
<form name="frmDangNhap" id="frmDangNhap" method="post" action="">
Tên tài khoản: <input type="text" name="kh_tendangnhap" id="kh_tendangnhap" /><br />
Mật khẩu: <input type="text" name="kh_matkhau" id="kh_matkhau" /><br />
<input type="submit" name="btnLogin" id="btnLogin" value="Đăng nhập" />
</form>
<?php
// Hiển thị tất cả lỗi trong PHP
// Chỉ nên hiển thị lỗi khi đang trong môi trường Phát triển (Development)
// Không nên hiển thị lỗi trên môi trường Triển khai (Production)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Truy vấn database
// 1. Include file cấu hình kết nối đến database, khởi tạo kết nối $conn
include_once(__DIR__ . '/../../../dbconnect.php');
// Chưa đăng nhập -> Xử lý logic/nghiệp vụ kiểm tra Tài khoản và Mật khẩu trong database
if (isset($_POST['btnLogin'])) {
// Phân tách thông tin từ người dùng gởi đến qua Request POST
// Bổ sung hàm addslashes để chống SQL Injection
$kh_tendangnhap = addslashes( $_POST['kh_tendangnhap'] );
$kh_matkhau = addslashes( $_POST['kh_matkhau'] );
// var_dump($kh_tendangnhap);
// var_dump($kh_matkhau);die;
// Câu lệnh SELECT Kiểm tra đăng nhập...
$sqlSelect = <<<EOT
SELECT *
FROM khachhang kh
WHERE kh.kh_tendangnhap = '$kh_tendangnhap' AND kh.kh_matkhau = '$kh_matkhau';
EOT;
// var_dump($sqlSelect);die;
// Thực thi SELECT
$result = mysqli_query($conn, $sqlSelect);
// In ra màn hình câu lệnh vừa thực thi
echo 'Câu lệnh vừa thực thi: <br />';
echo $sqlSelect;
echo '<br />';
// Sử dụng hàm `mysqli_num_rows()` để đếm số dòng SELECT được
// Nếu có bất kỳ dòng dữ liệu nào SELECT được <-> Người dùng có tồn tại và đã đúng thông tin USERNAME, PASSWORD
if (mysqli_num_rows($result) > 0) {
echo '<h2>Đăng nhập thành công!</h2>';
} else {
echo '<h2 style="color: red;">Đăng nhập thất bại!</h2>';
}
}
?>
</body>
</html>
a' or 't'='t
Cùng nhau học tập, khám phá các kiến thức nền tảng về Lập trình web, mobile, database nhé.
Nền tảng kiến thức - Hành trang tới tương lai hân hạnh phục vụ Quý khách!
Khám phá, trải nghiệm ngay
Vui lòng đăng nhập để gởi bình luận!
Đăng nhậpChưa có bình luận nào!