SQL Injection là gì?

Mình không hiểu chính xác SQL injection là gì, và SQL injection liên quan tới bảo mật của trang như thế nào. Ai biết giải thích giùm mình thông qua ví dụ cụ thể (sử dụng PHP và MySQL) với?

Được hỏi 1 năm trước
Bình chọn bởi: Yanell Bự, Hoang Anh, Đinh Quang Huy, Thu Hang, Quang Nguyen, Vân Trần, Thành Công, Phuong Jenny, Bao Ngoc, Thu Thủy, Roy Trịnh, Lê Anh, Nguyễn Duy Tuấn, Hằng Đỗ, Hoàng Tùng, Torrest Vũ, Anh Tuấn, Huy Pro, Ngô Thanh Hải, Thủy Ruby, Nguyen Thuy Trang, Đức Tuấn, Trung Quân, Hanh Kute, Hani Ngoc, Đình Anh

SQL Injection Là Gì

SQL Injection là một kỹ thuật tấn công vào hệ thống cơ sở dữ liệu của ứng dụng (bao gồm các ứng dụng web, mobile hoặc desktop...) thông qua việc khai thác các lỗ hổng bảo mật với mục đich lấy về, thay đổi hoặc thậm chí là phá huỷ hệ thống cơ sở dữ liệu của ứng dụng.

SQL Injection Hoạt Động Như Thế Nào

SQL Injection được thực hiện bằng thông qua các trường nhập dữ liệu của ứng dụng để thêm vào các đoạn mã SQL nguy hại.

Ví dụ trên một trang web có một trường nhập dữ liệu cho phép tìm kiếm người dùng dựa trên tên đăng nhập

<input type="text" name="username">

Sau đó trên ứng dụng đoạn mã SQL được sử dụng để thực hiện việc tìm kiếm như sau:

$sql = "SELECT * FROM Users WHERE username='{input_value}'"

Trong đó {input_value} là giá trị được người dùng nhập vào trường input và gửi lên server.

Khi đó nếu người dùng nhập giá trị như sau:

value_1' or username='value_2'

Thì câu SQL lúc này sẽ như sau:

$sql = "SELECT * FROM Users WHERE username='value_1' or username='value_2'"

Khi đó kết quả trả về sẽ không chính xác.

Nguy hiểm hơn nữa nếu người dùng nhập vào trường input với giá trị như sau:

value_1'; DROP TABLE users;

Khi đó câu lệnh SQL từ ứng dụng gửi lên database server sẽ như sau:

$sql = "SELECT * FROM Users WHERE username='value_1'; DROP TABLE users;"

Và toàn bộ các bản ghi trên bảng users sẽ bị xoá bỏ!

Ví Dụ Sử Dụng PHP và MySQL

Ví dụ trong một ứng dụng web PHP sử dụng bảng users để lưu danh sách người dùng đăng ký tài khoản trên trang trong đó bảng users có trường như sau:

  • Trường username là tên đăng nhập của người dùng.
  • Trường firstname là họ của người dùng.
  • Trường fastname là tên người dùng.

SQL để tạo bảng users:

CREATE TABLE `users` (
  `id` int(10) NOT NULL,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Đồng thời chúng ta cũng thêm hai bảng ghi có giá trị như sau:

INSERT INTO `users` (`id`, `firstname`, `lastname`, `username`) VALUES
(1, 'Cristiano', 'Ronaldo', 'cr7'),
(2, 'Lionel', 'messi', 'leomessi');

Tiếp theo ứng dụng web này cung cấp một trang giao diện để giúp tìm kiếm người dùng theo trường username. Trong trang này có một form biểu mẫu với trường input để nhập tên người dùng mà bạn muốn tìm kiếm. Mã HTML sẽ như sau:

<?php
include("header.php"); // xem "header.php" ở dưới
?>
<form method="GET" action="search_users.php">
    <div>
        <label>Tên người dùng:</label>
        <input type="text" name="username">
    </div>
    <div>
        <input type="submit" value="Gửi">
    </div>
<form>
<?php
include("footer.php"); // xem "footer.php" ở dưới
?>

Trong đó tập tin header.php có nội dung như sau:

<DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
</head>
</body>

footer.php:

</body>
</html>

Tiếp theo trên máy chủ tập tin PHP search.php được dùng để xử lý thao tác tìm kiếm người dùng theo tên đăng nhập có nội dung như sau:

<?php
include("header.php");
include("db_connect.php"); // xem "db_connect.php" ở dưới
?>

<?php if (!isset($_GET["username"])): ?>
    <div style="color: brown;">Tên người dùng không được trống!</div>
    <div>Vui lòng nhập tên người dùng.</div>
<?php else: ?>
    <?php
    $username = $_GET["username"];
    $sql = "SELECT * FROM users WHERE username = '$username'";
    $result = $connection->query($sql);
    ?>

    <?php if ($result->num_rows > 0): ?>
        <table border=1>
            <thead>
                <tr>
                    <td>Họ</td>
                    <td>Tên</td>
                    <td>Tên Đăng Nhập</td>
                </tr>
            </thead>
            <tbody>
                <?php while ($row = $result->fetch_object()): ?>
                    <tr>
                        <td><?= $row->firstname; ?></td>
                        <td><?= $row->lastname; ?></td>
                        <td><?= $row->username; ?></td>
                    </tr>
                <?php endwhile; ?>
            </tbody>
        </table>
    <?php else: ?>
       <div style="color: brown">Không tìm thấy người dùng với tên đăng nhập tìm kiếm</div>
    <?php endif; ?>
<?php endif; ?>

<?php $connection->close(); ?>
<a href="/">Quay lại</a>
<?php include("footer.php"); ?>

Tập tin db_connect.php

<?php
$host = "127.0.0.1";
$username = "root";
$pass = "root-password";
$db = "sql_injection";
$connection = new mysqli($host, $username, $pass, $db);

if ($connection->connect_error) {
    die("Lỗi kết nối tới DB: " . $conn->connect_error);
}
?>

Khi đó nếu người dùng nhập vào ô tìm kiếm giá trị cr7' or username='leomessi và bấm Enter thì kết quả sẽ hiển thị cả Ronaldo và Messi trong kết quả tìm kiếm.

Trả lời 2 ngày trước

Thêm Trả Lời