Email Doanh NghiệpSSLFirewall Anti DDoSTối ưu tốc độ website

NỘI DUNG

Banner blog lễ 30.4 và 1.5

SQL Injection là gì? Ví dụ và cách giảm thiểu, ngăn chặn tấn công SQLi

Cao Lê Viết Tiến

Đã kiểm duyệt nội dung

Ngày đăng:14/07/2025
Lượt xem

Đánh giá

5/5 - (115 bình chọn)

SQL Injection (SQLi) là một trong những lỗ hổng bảo mật web lâu đời nhưng vẫn cực kỳ nguy hiểm và phổ biến. Bằng cách chèn các đoạn mã SQL độc hại vào ứng dụng web, kẻ tấn công có thể đánh cắp thông tin nhạy cảm, chiếm quyền quản trị và thậm chí kiểm soát hoàn toàn máy chủ. Bài viết này sẽ cung cấp một cái nhìn toàn diện về SQL Injection, từ khái niệm, cách thức hoạt động, hậu quả, cho đến các phương pháp phát hiện và phòng chống hiệu quả nhất.

banner vps vietnix hỗ trợ n8n

Những điểm chính

  • Hiểu rõ SQL Injection là gì và cơ chế kẻ tấn công lợi dụng đầu vào của người dùng để thao túng cơ sở dữ liệu.
  • Nhận thức được các hậu quả khôn lường của SQLi, từ việc rò rỉ dữ liệu khách hàng đến việc mất quyền kiểm soát hoàn toàn hệ thống.
  • Phân biệt các loại tấn công SQL Injection phổ biến như In-band, Inferential (Blind SQLi), và Out-of-band để có phương án đối phó phù hợp.
  • Nắm vững các phương pháp phát hiện lỗ hổng, bao gồm cả kiểm tra thủ công và sử dụng công cụ tự động.
  • Trang bị các kỹ thuật phòng chống SQLi hiệu quả nhất.
  • Biết đến Vietnix là nhà cung cấp VPS uy tín, là môi trường lý tưởng để triển khai các ứng dụng web an toàn.
  • Giải đáp một số câu hỏi thượng gặp trong quá trình phòng chống SQL injection.

SQL Injection là gì?

SQL Injection (viết tắt là SQLi) là một kỹ thuật tấn công chèn mã, trong đó kẻ tấn công lợi dụng các lỗ hổng trong khâu xử lý dữ liệu đầu vào của một ứng dụng web để chèn (inject) các câu lệnh SQL độc hại vào một truy vấn đã được định sẵn. Mục đích là để lừa database thực thi những lệnh không mong muốn, từ đó cho phép kẻ tấn công truy cập, sửa đổi, hoặc xóa dữ liệu mà không được phép.

SQL Injection là gì
Khái niệm SQL Injection

Mối đe dọa này không phân biệt nền tảng, có thể ảnh hưởng đến bất kỳ trang web hay ứng dụng nào sử dụng các hệ quản trị cơ sở dữ liệu phổ biến như MySQL, Oracle hay SQL Server. Điều này cho thấy SQL Injection không phải là vấn đề của một công nghệ cụ thể, mà là một lỗ hổng mang tính hệ thống trong cách ứng dụng tương tác với dữ liệu.

Chính vì vậy, việc tuân thủ các nguyên tắc bảo mật cơ bản trong xử lý đầu vào là tối quan trọng. SQL Injection được xem là một trong những lỗ hổng ứng dụng web lâu đời, phổ biến và nguy hiểm nhất, từng được OWASP xếp hạng là mối đe dọa hàng đầu trong danh sách Top 10 năm 2017.  

Trong bối cảnh các cuộc tấn công SQL Injection ngày càng tinh vi, việc bảo vệ dữ liệu không chỉ nằm ở mã nguồn ứng dụng mà còn ở nền tảng hạ tầng. Một máy chủ mạnh mẽ và an toàn như VPS NVMe là yếu tố then chốt giúp ứng dụng của bạn hoạt động ổn định và giảm thiểu rủi ro. Với ổ cứng NVMe siêu tốc, VPS NVMe không chỉ tăng cường hiệu suất xử lý dữ liệu mà còn cung cấp môi trường cách ly, giúp hạn chế tác động của các cuộc tấn công, đảm bảo dữ liệu của bạn luôn được an toàn và truy cập nhanh chóng.

col vps nmve 2

VPS NVME – Ổ CỨNG VÀ CPU THẾ HỆ MỚI

Khả năng xử lý siêu khủng với ổ cứng NVMe và CPU Platinum, đa lớp bảo mật, an toàn cho dữ liệu của bạn

SQL Injection hoạt động như thế nào?

Cơ chế cốt lõi của SQL Injection nằm ở sự nhầm lẫn tai hại: một trường truy vấn SQL, vốn chỉ được thiết kế để nhận dữ liệu (ví dụ: một con số), lại vô tình được tiếp nhận một đoạn mã lệnh SQL. Khi đoạn mã này được thực thi, nó thoát khỏi giới hạn ban đầu, gây ra những hành động không mong muốn và tiềm ẩn nguy hiểm. Trường truy vấn này thường được điền thông tin từ các biểu mẫu nhập liệu trên trang web.  

Một cuộc tấn công SQL Injection bắt đầu khi kẻ tấn công nhận thấy các trường nhập liệu dễ bị tổn thương trên một trang web hoặc ứng dụng, nơi dữ liệu người dùng được sử dụng trực tiếp trong một truy vấn SQL. Sau đó, kẻ tấn công sẽ tạo ra một “payload” độc hại – một chuỗi ký tự chứa các lệnh SQL.

Khi payload này được gửi đi, các lệnh SQL ẩn chứa bên trong sẽ được thực thi trong cơ sở dữ liệu. SQLi thường nhắm vào các API yếu kém, vốn là cầu nối để máy chủ nhận và phản hồi các yêu cầu. Kẻ tấn công có thể sử dụng các công cụ tự động để rà soát các biểu mẫu và thử nghiệm nhiều truy vấn SQL khác nhau nhằm khai thác cơ sở dữ liệu.

Cơ chế hoạt động của SQL Injection
Cơ chế hoạt động của SQL Injection

SQL Injection được phân thành ba loại chính dựa trên cách kẻ tấn công tương tác với hệ thống.

Các loại SQL Injection
Các loại SQL Injection

In-band SQLi (SQLi trong băng tần)

Đây là loại tấn công phổ biến và đơn giản nhất, nơi kẻ tấn công sử dụng cùng một kênh liên lạc để thực hiện tấn công và lấy kết quả:

  • Error-based SQLi: Kẻ tấn công gửi các truy vấn cố tình gây ra lỗi. Thông báo lỗi do database trả về có thể vô tình tiết lộ thông tin về cấu trúc của nó.
  • Union-based SQLi: Kẻ tấn công sử dụng toán tử UNION trong SQL để kết hợp kết quả từ một truy vấn độc hại với kết quả từ một truy vấn hợp lệ, sau đó hiển thị dữ liệu đánh cắp được ngay trên trang web.

Inferential SQLi (SQLi suy luận hay Blind SQLi)

Hacker . Trong trường hợp này, ứng dụng web không trả về dữ liệu trực tiếp trong phản hồi. Kẻ tấn công sẽ gửi các data payload đến server và quan sát phản ứng, hành vi của server để tìm hiểu cấu trúc và suy luận thông tin.

Blind SQL injection dựa trên phản ứng và các hành vi hoạt động của server. Do đó chúng thường thực thi chậm hơn, nhưng có thể gây ảnh hưởng tương tự. Blind SQL injection có thể được phân loại thành:

  • Boolean-based SQLi: Kẻ tấn công gửi một câu hỏi SQL buộc ứng dụng trả về kết quả Đúng hoặc Sai, và quan sát sự thay đổi trong nội dung trang để suy ra câu trả lời.
  • Time-based SQLi: Kẻ tấn công gửi một truy vấn yêu cầu database tạm dừng trong một khoảng thời gian nhất định nếu một điều kiện là đúng. Bằng cách đo thời gian phản hồi, kẻ tấn công có thể suy ra câu trả lời.

Out-of-band SQLi (SQLi ngoài băng tần)

Hacker chỉ có thể thực hiện hình thức này khi có một số tính năng nhất định được kích hoạt trên server Cơ sở dữ liệu được ứng dụng web sử dụng. Hình thức này chủ yếu được dùng để thay thế cho khác kỹ thuật in-band và inferential SQLi.

Out-of-band SQLi được thực hiện khi hacker không thể sử dụng cùng một kênh để khởi động tấn công và thu thập thông tin. Hoặc do server quá chậm, không ổn định tấn thực hiện hành động. Các kỹ thuật này dựa vào khả năng server tạo ra các DNS hay HTTP request để chuyển dữ liệu cho kẻ tấn công.

Second-order SQL injection (SQL Injection bậc hai)

Còn được gọi là SQL Injection được lưu trữ, loại tấn công này xảy ra khi dữ liệu đầu vào của người dùng ban đầu được lưu trữ an toàn, nhưng sau đó lại được truy xuất và đưa vào một truy vấn SQL một cách không an toàn. Điều này thường do các nhà phát triển nhầm lẫn coi dữ liệu đã lưu trữ là đáng tin cậy.

Ví dụ về cách sử dụng SQL Injection

Kẻ tấn công muốn thực hiện SQL injection sẽ thao túng một truy vấn SQL tiêu chuẩn, để khai thác các lỗ hổng input không được xác thực trong Cơ sở dữ liệu. Có nhiều cách để thực hiện vector tấn công này. Sau đây là một số cách để vận hành SQLi:

Lấy ví dụ về input ở trên. Nó sẽ lấy thông tin cho một sản phẩm cụ thể, có thể được đổi thành

http://www.estore.com/items/items.asp?itemid=999 or 1=1

Và truy vấn SQL sẽ có dạng như sau:

truy vấn SQL
SQL Injection là gì? Ví dụ và cách giảm thiểu, ngăn chặn tấn công SQLi 29

Vì lệnh 1=1 là luôn đúng, nên truy vấn trả về tất cả tên và mô tả sản phẩm trong Cơ sở dữ liệu, ngay cả những tên mà bạn không đủ điều kiện truy cập.

Những hacker cũng có thể lợi dụng các ký tự được lọc không chính xác để thay đổi các lệnh SQL. Trong đó gồm cả việc sử dụng dấu chấm phẩy để tách hai trường.

Ví dụ, có input:

http://www.estore.com/items/iteams.asp?itemid=999; DROP TABLE USERS

Người dùng sẽ tạo truy vấn SQL như sau:

Truy vấn SQL 1
SQL Injection là gì? Ví dụ và cách giảm thiểu, ngăn chặn tấn công SQLi 30

Lúc đó, toàn bộ Cơ sở dữ liệu có thể bị xóa.

Một cách khác để thao túng truy vấn SQL là sử dụng lệnh UNION SELECT. Nó kết hợp hai truy vấn SELECT không liên quan để lấy dữ liệu từ các bảng Cơ sở dữ liệu khác nhau.

Ví dụ, có input:

http://www.estore.com/items/items.asp?itemid=999 UNION SELECT user-name, password FROM USERS

Input này sẽ tạo truy vấn SQL sau:

truy vấn SQL 2
SQL Injection là gì? Ví dụ và cách giảm thiểu, ngăn chặn tấn công SQLi 31

Bằng cách sử dụng lệnh UNION SELECT, truy vấn này kết hợp request cho tên và mô tả mục item 999 với một request khác, pull tên và password cho mọi người dùng trong Cơ sở dữ liệu.

Hậu quả của tấn công SQL Injection

Hậu quả của một cuộc tấn công SQLi thành công vô cùng nghiêm trọng, ảnh hưởng đến cả doanh nghiệp và người dùng:

  • Truy cập và đánh cắp dữ liệu nhạy cảm: Kẻ tấn công có thể truy cập, đọc và đánh cắp bất kỳ dữ liệu nào trong database, bao gồm thông tin cá nhân của người dùng (tên, email, số điện thoại, mật khẩu), thông tin tài chính (số thẻ tín dụng, số tài khoản ngân hàng), bí mật kinh doanh, hoặc sở hữu trí tuệ.
  • Thao túng và xóa dữ liệu: Không chỉ đọc, kẻ tấn công có thể thay đổi, thêm mới hoặc xóa hoàn toàn dữ liệu, các bản ghi, hoặc thậm chí là toàn bộ bảng trong database. Điều này có thể dẫn đến việc thay đổi giao dịch, số dư tài khoản, hoặc làm hỏng dữ liệu quan trọng, gây ảnh hưởng nghiêm trọng đến hoạt động kinh doanh.
  • Bỏ qua xác thực và chiếm quyền: Kẻ tấn công có thể vượt qua các cơ chế xác thực và ủy quyền, đăng nhập vào hệ thống dưới danh nghĩa của người dùng hợp lệ, bao gồm cả các tài khoản quản trị database (DBA), từ đó chiếm quyền kiểm soát hệ thống.
  • Chiếm quyền kiểm soát máy chủ: Trong một số trường hợp, lỗ hổng SQLi có thể cho phép kẻ tấn công thực thi các lệnh trên hệ điều hành của máy chủ, dẫn đến việc cài đặt mã độc và chiếm toàn quyền kiểm soát hệ thống. Một cuộc tấn công thành công có thể làm sập toàn bộ hệ thống, do đó bạn nên chọn dịch vụ VPS ổn định, bảo mật đa lớp như Vietnix để đảm bảo khả năng phục hồi và hoạt động liên tục.
  • Thiệt hại về danh tiếng và tài chính: Một cuộc tấn công thành công có thể dẫn đến mất niềm tin từ khách hàng, thiệt hại lớn về tài chính do chi phí khắc phục, bồi thường, và các án phạt pháp lý.

Việc phát hiện sớm các lỗ hổng SQL Injection là rất quan trọng để ngăn chặn các cuộc tấn công. Có nhiều phương pháp để xác định các điểm yếu này, từ kiểm tra thủ công đến sử dụng các công cụ tự động chuyên nghiệp.

Phương pháp phát hiện thủ công

  • Kiểm tra ký tự đặc biệt: Nhập ký tự dấu nháy đơn (') vào mọi điểm nhập liệu của ứng dụng để tìm kiếm các lỗi hoặc bất thường trong phản hồi của ứng dụng. Đây là dấu hiệu phổ biến của lỗ hổng SQLi.  
  • Kiểm tra cú pháp SQL: Thử nghiệm với cú pháp SQL cụ thể mà khi đánh giá sẽ trả về giá trị cơ sở và một giá trị khác, sau đó quan sát sự khác biệt có hệ thống trong phản hồi của ứng dụng.  
  • Kiểm tra điều kiện Boolean: Nhập các điều kiện Boolean như OR 1=1 (luôn đúng) và OR 1=2 (luôn sai) vào các trường nhập liệu và tìm kiếm sự khác biệt trong phản hồi của ứng dụng. Nếu ứng dụng phản hồi khác nhau, điều đó cho thấy nó đang xử lý các điều kiện SQL.  
  • Kích hoạt độ trễ thời gian: Sử dụng các payload được thiết kế để gây ra độ trễ thời gian trong một truy vấn SQL (ví dụ: SLEEP() trong MySQL, WAITFOR DELAY trong SQL Server) và quan sát thời gian phản hồi của ứng dụng. Nếu có độ trễ, điều đó xác nhận lỗ hổng.  
  • Kích hoạt tương tác mạng ngoài băng tần (OAST payloads): Sử dụng các payload OAST để kích hoạt các tương tác mạng ngoài băng tần (ví dụ: yêu cầu DNS hoặc HTTP đến một máy chủ do kẻ tấn công kiểm soát) và theo dõi các tương tác kết quả. Điều này giúp xác nhận lỗ hổng ngay cả khi không có phản hồi trực tiếp trên ứng dụng.  
Cách phát hiện lỗ hổng SQL Injection
Cách phát hiện lỗ hổng SQL Injection

Công cụ tự động

Các công cụ quét lỗ hổng như SQLMap, Acunetix, PortSwigger Burp Suite, Burp Scanner có thể tự động hóa quá trình này, rà soát toàn bộ ứng dụng của bạn để tìm kiếm các điểm yếu tiềm tàng một cách nhanh chóng và toàn diện. Trong quá trình kiểm tra và khắc phục lỗ hổng, việc có một đội ngũ hỗ trợ kỹ thuật 24/7 từ nhà cung cấp VPS như Vietnix có thể giúp bạn giải quyết nhanh chóng các vấn đề liên quan đến cấu hình máy chủ.

SQL Injection trong các phần khác nhau của truy vấn

Mặc dù các lỗ hổng SQL Injection thường được tìm thấy trong mệnh đề WHERE của một truy vấn SELECT, chúng có thể xuất hiện ở bất kỳ phần nào của truy vấn và trong các loại truy vấn khác nhau. Điều này đòi hỏi các nhà phát triển phải kiểm tra kỹ lưỡng tất cả các điểm nhập liệu và cách chúng được sử dụng trong các truy vấn SQL.  

Các vị trí thay thế phổ biến mà SQL Injection có thể xảy ra bao gồm:

  • Trong các câu lệnh UPDATE: Kẻ tấn công có thể chèn mã độc vào các giá trị được cập nhật hoặc trong mệnh đề WHERE của câu lệnh UPDATE để thay đổi dữ liệu không mong muốn.  
  • Trong các câu lệnh INSERT: Mã độc có thể được chèn vào các giá trị được chèn vào cơ sở dữ liệu thông qua câu lệnh INSERT.  
  • Trong tên bảng hoặc tên cột của câu lệnh SELECT: Mặc dù ít phổ biến hơn, kẻ tấn công có thể thao túng tên bảng hoặc tên cột nếu chúng được xây dựng động từ đầu vào người dùng.  
  • Trong mệnh đề ORDER BY của câu lệnh SELECT: Nếu mệnh đề ORDER BY được xây dựng động từ đầu vào người dùng, kẻ tấn công có thể chèn mã SQL để thay đổi thứ tự sắp xếp hoặc thậm chí thực hiện các hành động khác.  

Cách hiệu quả nhất để ngăn chặn các cuộc tấn công SQL Injection là thông qua xác thực đầu vào (input validation) và truy vấn tham số hóa (parametrized queries), bao gồm việc sử dụng các câu lệnh đã chuẩn bị (prepared statements).  

Xác thực đầu vào (input validation)

Quá trình xác thực nhằm xác minh xem loại input do người dùng gửi có hợp lệ hay không. Xác thực đầu vào đảm bảo đó là kiểu, độ dài, định dạng… được chấp nhận. Chỉ các giá trị qua được xác thực mới có thể được xử lý. Nó giúp chống lại mọi lệnh được chèn vào trong chuỗi input.

Xác thực nên được áp dụng với các trường cho phép người dùng nhập đầu vào, mà bạn còn nên quan tâm đến các tình huống sau:

  • Sử dụng biểu thức chính quy làm whitelist cho các dữ liệu có cấu trúc (chẳng hạn như tên, tuổi, thu nhập, zip code) để đảm bảo xác thực đầu vào hợp lệ.
  • Trong trường hợp có một bộ giá trị cố định (như drop-down list), hãy xác định giá trị được trả về. Dữ liệu đầu vào phải khớp với một trong các tùy chọn được cung cấp.

Dưới đây là cách xác thực tên bảng:

switswitch ($tableName) {
    case 'fooTable': return true;
    case 'barTable': return true;
    default: return new BadMessageException('unexpected value provided as table name');
}

Biến $tableName có thể được append trực tiếp, bây giờ nó được biết đến là một trong những giá trị hợp pháp cho tên của Table.

Đối với drop-down list, việc xác thực dữ liệu rất đơn giản. Giả sử bạn muốn người dùng chọn xếp hạng từ 1 đến 5, hãy đổi PHP code thành:

<?php
if(isset($_POST["selRating"]))
{
    $number = $_POST["selRating"];
    if((is_numeric($number)) && ($number > 0) && ($number < 6))
    {
        echo "Selected rating: " . $number;
    }
    else
        echo "The rating has to be a number between 1 and 5!";
}

Bạn đã thêm hai check đơn giản:

  1. Phải là một số (hàm is_numeric())
  2. $number phải lớn hơn 0, nhỏ hơn 6. Do đó điểm có phạm vi từ 1 – 5.

Dữ liệu nhận được từ bên ngoài phải được xác thực. Quy tắc này không chỉ áp dụng cho input do người dùng Internet cung cấp, mà còn cho các nhà cung cấp, đối tác, cơ quan quản lý.

Truy vấn tham số hóa (parametrized queries)

Các truy vấn tham số hóa là một phương tiện pre-compile lệnh SQL. Sau đó bạn có thể cung cấp các tham số để câu lệnh được thực thi.

Phương pháp này giúp Cơ sở dữ liệu có thể nhận ra mã và phân biệt nó với dữ liệu đầu vào. Input của người dùng được trích dẫn tự động, và kiểu mã hóa này giúp giảm thiểu tấn công SQL injection.

Ta cũng có thể sử dụng các truy vấn tham số hóa với phần mở rộng MySQLi, nhưng PHP 5.1 đã trình bày một cách tiếp cận tốt hơn khi làm việc với CSDL: PHP Data Objects (PDO). PDO áp dụng các phương pháp đơn giản hóa việc sử dụng các truy vấn tham số hóa. Ngoài ra, nó làm cho code dễ đọc hơn và dễ di chuyển hơn, vì nó còn hoạt động trên một số Cơ sở dữ liệu khác, không chỉ mỗi MySQL.

Code này sử dụng PDO với các truy vấn được tham số hóa để ngăn chặn lỗ hổng SQL injection:

<?php
$id = $_GET['id'];
$db_connection = new PDO('mysql:host=localhost;dbname=sql_injection_example', 'dbuser', 'dbpasswd');
//preparing the query
$sql = "SELECT username 
            FROM users
            WHERE id = :id";
$query = $db_connection->prepare($sql);
$query->bindParam(':id', $id);
$query->execute();
//getting the result
$query->setFetchMode(PDO::FETCH_ASSOC);
$result = $query->fetchColumn();
print(htmlentities($result));

Stored Procedures

Các stored procedures (SP) yêu cầu developer nhóm một hay nhiều lệnh SQL thành một đơn vị logic để có thể tạo một kế hoạch thực thi. Các lần thực thi tiếp theo cho phép các lệnh được tham số hóa tự động. Nói một cách đơn giản, nó là một loại code có thể được lưu trữ để sử dụng sau này.

Vì vậy, bất cứ khi nào bạn cần thực hiện truy vấn, thay vì viết đi viết lại thì có thể gọi một stored procedure. Đây là một quá trình tạo một SP trong server MySQL. Ví dụ bạn có một bảng như sau:

CREATE TABLE `salary` (
		  `empid` int(11) NOT NULL,
		  `sal` int(11) DEFAULT NULL,
		  PRIMARY KEY (`empid`)
		) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Giả sử có một nhân viên cần lấy dữ liệu tổng hợp về lương công ty từ Table đó. Trước tiên, bạn cần tạo một người dùng ‘tr’:

CREATE USER 'tr'@'localhost' IDENTIFIED BY 'mypass';

Người dùng đó sẽ chỉ cần quyền EXECUTE đối với lược đồ nơi có Table:

grant execute on hris.*  to tr@`%`

SP sẽ được tạo như sau:

DELIMITER $$
		
CREATE PROCEDURE `avg_sal`(out avg_sal decimal)
BEGIN
	select avg(sal) into avg_sal from salary;
END

Quá trình phát hành lệnh tạo một avg_sal SP và nó sẽ được lưu trữ trong Cơ sở dữ liệu.

Để gọi một SP từ một ừng dụng PHP, bạn có thể sử dụng PDO:

$db_connection = new PDO('mysql:host=localhost;dbname=hris', 'tr', 'mypass');
		$query = $db_connection->exec('call avg_sal(@out)');
		$res = $query->query('select @out')->fetchAll();
		print_r($res);

$res sẽ hiện thị mức lương trung bình theo yêu cầu người dùng. Sau đó, người dùng có thể thực hiện quá trình output với PHP.

Sử dụng Escaping

Luôn sử dụng các hàm character-escaping cho input do user cung cấp, được cấp bởi mỗi hệ thống quản lý Cơ sở dữ liệu (DBMS). Việc này giúp đảm bảo DBMS không bao giờ nhầm lẫn nó với lệnh SQL do developer cung cấp.

Ví dụ: dùng mysql_real_escape_string() trong PHP để tránh các ký tự có thể dẫn đến lệnh SQL không mong muốn. Một phiên sửa đổi cho login bypass sẽ như sau:

$db_connection = mysqli_connect("localhost", "user", "password", "db");
		$username = mysqli_real_escape_string($db_connection, $_POST['username']);
		$password = mysqli_real_escape_string($db_connection, $_POST['password']);
		$query = "SELECT * FROM users WHERE username = '" . $username. "' AND password = '" . $password . "'"; 

Trước đây, code của bạn có thể dễ bị thêm escape character (\) ở phía trước dấu ngoặc. Tuy nhiên, bằng mã trên bạn sẽ được bảo vệ khỏi người dùng bất hợp pháp và giảm thiểu SQL injection.

Nguyên tắc chiến lược phòng chống SQL injection

Ngoài các biện pháp kỹ thuật, phòng chống SQLi còn là một thách thức về văn hóa bảo mật và quy trình toàn diện của tổ chức. Để thực sự an toàn, doanh nghiệp cần một chiến lược bảo mật đa lớp, tích hợp vào toàn bộ vòng đời phát triển phần mềm (SDLC) và quản lý rủi ro.

  1. Đào tạo và duy trì nhận thức: Tất cả nhân viên tham gia xây dựng ứng dụng web (nhà phát triển, nhân viên QA, DevOps, SysAdmins) phải nhận thức được rủi ro SQL Injection và được đào tạo bảo mật phù hợp. Yếu tố con người là nền tảng để đảm bảo các biện pháp kỹ thuật được triển khai đúng cách và nhất quán.  
  2. Không tin tưởng bất kỳ đầu vào người dùng nào: Coi tất cả đầu vào người dùng là không đáng tin cậy, bất kể nó đến từ người dùng đã xác thực hay người dùng nội bộ. Nguyên tắc này là kim chỉ nam cho mọi biện pháp xác thực và làm sạch đầu vào.  
  3. Sử dụng danh sách trắng (whitelists), không phải danh sách đen (blacklists): Lọc đầu vào người dùng bằng cách sử dụng danh sách trắng nghiêm ngặt (chỉ cho phép những gì được biết là an toàn) thay vì danh sách đen (cố gắng chặn những gì được biết là độc hại), vì danh sách đen thường có thể bị kẻ tấn công thông minh vượt qua.  
  4. Áp dụng các công nghệ mới nhất: Sử dụng các phiên bản mới nhất của môi trường phát triển, ngôn ngữ và các công nghệ liên quan (ví dụ: PDO thay vì MySQLi trong PHP), vì các công nghệ cũ hơn có thể thiếu bảo vệ SQLi tích hợp hoặc đã lỗi thời.  
  5. Sử dụng các cơ chế đã được xác minh: Sử dụng các cơ chế tích hợp sẵn được cung cấp bởi các công nghệ phát triển hiện đại để bảo vệ SQLi, chẳng hạn như truy vấn tham số hóa hoặc stored procedure, thay vì cố gắng tự xây dựng bảo vệ từ đầu. Việc tự xây dựng thường dễ mắc lỗi và khó bảo trì.  
  6. Quét thường xuyên: Thường xuyên quét các ứng dụng web bằng một máy quét lỗ hổng web chuyên nghiệp (như Acunetix) và tích hợp việc quét vào các quy trình xây dựng (ví dụ: sử dụng plugin Jenkins) để phát hiện các lỗ hổng do nhà phát triển hoặc các thành phần bên ngoài đưa vào. Điều này biến bảo mật thành một phần liên tục của vòng đời phát triển.

Vietnix – Nền tảng VPS hàng đầu cho việc triển khai ứng dụng an toàn

Với hơn 13 năm kinh nghiệm trong lĩnh vực cung cấp dịch vụ máy chủ, Vietnix là một trong những nhà cung cấp VPS hàng đầu tại Việt Nam, được hơn 100.000 khách hàng cá nhân và doanh nghiệp tin chọn. Vietnix cam kết cung cấp các gói VPS với công nghệ tiên tiến nhất và phần cứng hiện đại, đảm bảo hiệu suất vượt trội, độ ổn định cao và khả năng mở rộng linh hoạt cho mọi quy mô dự án. Đội ngũ kỹ thuật chuyên môn cao túc trực 24/7 sẵn sàng hỗ trợ bạn giải quyết mọi vấn đề phát sinh.

Thông tin liên hệ:

  • Hotline: 18001093.
  • Email: sales@vietnix.com.vn.
  • Địa chỉ: 265 Hồng Lạc, Phường Bảy Hiền, Thành Phố Hồ Chí Minh.
  • Website: https://vietnix.vn/.

Câu hỏi thường gặp

SQL Injection và Cross-Site Scripting (XSS) khác nhau như thế nào?

SQL Injection là một cuộc tấn công nhắm vào cơ sở dữ liệu của máy chủ, trong khi Cross-Site Scripting (XSS) là một cuộc tấn công nhắm vào người dùng cuối bằng cách chèn mã độc (thường là JavaScript) vào trang web để thực thi trên trình duyệt của họ.

Web Application Firewall (WAF) có thể hoàn toàn ngăn chặn SQLi không?

WAF là một lớp phòng thủ bổ sung quan trọng và có thể giúp ngăn chặn nhiều cuộc tấn công SQLi đã biết. Tuy nhiên, WAF không phải là giải pháp hoàn hảo và không thể ngăn chặn 100% các cuộc tấn công. Kẻ tấn công có thể tìm cách “vượt qua” WAF bằng các kỹ thuật WAF bypass. Do đó, WAF nên được sử dụng kết hợp với các biện pháp phòng chống ở cấp độ mã nguồn như Prepared Statements và input validation.

Tấn công SQL Injection có thể xảy ra trên cơ sở dữ liệu NoSQL không?

Có, nhưng phương pháp này được gọi là NoSQL Injection. Mặc dù cú pháp khác nhau nhưng nguyên tắc tấn công vẫn tương tự: chèn mã độc vào truy vấn để thao túng cơ sở dữ liệu NoSQL (như MongoDB, CouchDB).

Làm cách nào để kiểm tra nhanh trang web của tôi có bị dính SQLi không?

Cách đơn giản nhất là nhập một dấu nháy đơn (‘) vào các ô tìm kiếm hoặc tham số trên URL. Nếu trang web trả về lỗi cơ sở dữ liệu hoặc có hành vi bất thường, đó là dấu hiệu cảnh báo cao cho thấy có thể tồn tại lỗ hổng.

Mình vừa chia sẻ cho bạn về các loại SQL Injection và những cách phòng chống vấn đề này. Hy vọng qua bài viết này bạn sẽ học thêm được nhiều kiến thức mới và biết cách ngăn chăn SQL Injection hiệu quả, chúc bạn thành công!

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Banner group
Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

Icon tab

MAXSPEED HOSTING

TĂNG TỐC WEBSITE TOÀN DIỆN

CÔNG NGHỆ ĐỘC QUYỀN

Vector

PHẦN CỨNG MẠNH MẼ

Vector

HỖ TRỢ 24/7

Vector
ĐĂNG KÝ NGAYGroup icon
khuyến mãi tháng 7
Nhanh tay, số lượng có hạn!
23/06/2025 - 31/07/2025
Pattern

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

icon popup single post

CẢM ƠN BẠN ĐÃ ĐÁNH GIÁ BÀI VIẾT

Vietnix sẽ luôn cố gắng cải thiện chất lượng dịch vụ mỗi ngày

ĐÓNG

Đánh giá mức độ hữu ích của bài viết

icon 1 sao

Thất vọng

icon 2 sao

Chưa hữu ích

icon 3 sao

Bình thường

icon 4 sao

Hữu ích

icon 5 sao

Rất hữu ích

Icon
ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1

ĐĂNG KÝ DÙNG THỬ HOSTING

Asset

7 NGÀY MIỄN PHÍ

Asset 1
Icon
XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG