Ở bài Kết nối cơ sở dữ liệu với PHP, chúng ta đã cùng nhau tìm hiểu cách kết nối và truy vấn cơ sở dữ liệu trong PHP. Với bài này, chúng ta sẽ cùng nhau tìm hiểu về các biện pháp bảo mật trong PHP. Bất kỳ ứng dụng nào cũng đều có thể có những lỗ hổng bảo mật, nếu như các lập trình viên không có các biện pháp tốt để bảo vệ ứng dụng PHP khỏi các lỗ hổng bảo mật thì có thể gây ra những hậu quả không thể lường trước được.

>>> Xem thêm các bài viết trong chuỗi bài về ngôn ngữ lập trình PHP:

1. Lỗ hổng bảo mật trong PHP là gì?

Trong các ngôn ngữ lập trình nói chung và trong PHP nói riêng, việc xuất hiện các lỗ hổng bảo mật là điều không thể tránh khỏi. Nó có thể đến từ rất nhiều nguyên nhân khác nhau và thường thì chúng sẽ phụ thuộc vào cách mà ứng dụng được phát triển. Sau đây, chúng ta sẽ cùng nhau tìm hiểu một số lỗ hổng bảo mật phổ biến thường xuất hiện trong PHP:

Vấn đề

Mô tả

SQL Injection (SQLi)Đây là lỗ hổng gặp phải khi dữ liệu đầu vào không được kiểm soát một cách chặt chẽ, những giá trị đầu vào đó có thể khiến cho việc thực thi mã SQL trở nên không an toàn.
Cross-Site Scripting (XSS)XSS cũng là một lỗi xảy ra khi các lập trình viên không kiểm soát tốt dữ liệu đầu vào của người dùng, khi hiển thị những dữ liệu đầu vào mà không kiểm soát kỹ càng người dùng có thể thực thi các mã JavaScript độc hại gây phát sinh lỗi cho hệ thống.
Cross-Site Request Forgery (CSRF)Đây là kỹ thuật tấn công khi người dùng không thao tác nhưng kẻ tấn công lại có thể giả mạo các yêu cầu (request) được gửi từ máy của người dùng.
File Inclusion VulnerabilitiesViệc sử dụng các hàm như include hoặc require mà dữ liệu đầu vào không có sự kiểm soát nhất định thì cũng có thể gây ra những lỗ hổng cho phép tấn công bằng cách chèn mã độc vào những tập tin này.
Insecure Session ManagementNgười tấn công có thể chiếm đoạt phiên đăng nhập không an toàn của người dùng thông qua đó giả mạo danh tính người dùng.
Insecure Direct Object References (IDOR)Cần kiểm tra quyền truy cập của người dùng một cách chính xác, việc này rất quan trọng trong việc kiểm soát các đối tượng người dùng có thể truy cập phù hợp với quyền của mình.
Remote Code Execution (RCE)Việc có khả năng thực thi mã từ xa thường xảy ra khi ứng dụng chấp nhận các đầu vào không an toàn và thực thi nó mà không kiểm tra chúng một cách thích hợp.

Phía trên là một số lỗ hổng bảo mật thường gặp, chúng ta sẽ cùng nhau tìm hiểu chi tiết hơn về các lỗ hổng bảo mật trên cũng như cách phòng ngừa chúng sau đây.

2. SQL Injection (SQLi)

Lỗ hổng này thường xuất hiện khi ứng dụng PHP không kiểm soát được dữ liệu đầu vào từ phía người dùng. Điều này có thể dẫn đến việc người dùng sử dụng lỗi để triển khai tấn công ứng dụng thông qua việc thực thi trái phép các mã SQL không an toàn trên cơ sở dữ liệu.

Ví dụ: Biến $name trong câu query sau không được kiểm tra cũng như xử lý trước khi đưa vào câu SQL.

$sql = "SELECT * FROM posts WHERE name = '" . $name . "'";

Ở đây, chúng ta có rất nhiều cách để có thể xử lý đầu vào trước khi thực thi câu SQL như sử dụng Prepared Statements hoặc Parameterized Queries thay vì chỉ nối chuỗi như trên, hoặc chúng ta cũng có thể sử dụng các hàm như  mysqli_real_escape_string() để có thể kiểm soát được dữ liệu từ người dùng nhập vào.

// Sử dụng Prepared Statements
$stmt = $conn->prepare("SELECT * FROM posts WHERE name = ?");
$stmt->bind_param("s", $name);
$stmt->execute();

>>> Xem thêm bài viết tương tự tại đây:

3. Cross-Site Scripting (XSS)

Lỗ hổng XSS cũng là một lỗ hổng xảy ra khi mà dữ liệu đầu vào của người dùng không được kiểm soát đúng cách. Gây nên nguy cơ khi mà người dùng hoàn toàn có thể chèn các mã JavaScript độc hại và thực thi nó trên ứng dụng web trong trình duyệt của người sử dụng.

Ví dụ: Dữ liệu được hiển thị lên trang web mà không được xử lý trước

echo "Welcome, " . $user_input;

Ở đây cách thông dụng nhất là sử dụng hàm htmlspecialchars() để có thể xử lý các ký tự đặc biệt thành các HTML entities trước khi hiển thị dữ liệu nhập từ người dùng.

echo "Welcome, " . htmlspecialchars($user_input);

4. Cross-Site Request Forgery (CSRF)

Đây là lỗ hổng mà những hacker có thể lợi dụng để tạo ra những request giả mạo trên máy khách của người dùng mà không cần sự tương tác của họ.

Ví dụ: Dưới đây là một biểu mẫu có thể bị tận dụng bởi lỗi CSRF

<form action='http://stringeex.com/change_password' method='post'>
    <input type='hidden' name='password' value='malicious_password'>
    <input type='submit' value='Submit'>
</form>

Chúng ta có thể ngăn chặn phương pháp tấn công này bằng cách tạo ra một chuỗi token CSRF để xác thực yêu cầu mỗi khi người dùng gửi request lên server để đảm bảo những thao tác đó là do chính người dùng thao tác, chứ không phải là một cuộc tấn công lợi dụng lỗ hổng CSRF.

// Tạo ra token CSRF
$token = bin2hex(random_bytes(32));

// Lưu trữ lại token được tạo ra, ở đây chúng ta sẽ lưu vào $SESSION
$_SESSION['csrf_token'] = $token;

// Kiểm tra token CSRF trước khi xử lý yêu cầu
if ($_POST['csrf_token'] === $_SESSION['csrf_token']) {
    // Xử lý yêu cầu
}

5. Một số lỗi thường gặp khác

  • Sử dụng các phiên bản quá cũ: Với sự phát triển của nhiều cách tấn công phức tạp hiện nay, việc liên tục cập nhật phần mềm cũng có tác dụng không hề nhỏ trong việc cập nhật các phiên bản vá lỗi. Nó sẽ giúp cho các lỗi từ thư viện được khắc phục nhờ đó giúp hệ thống hoạt động tốt và ổn định hơn.
  • Giới hạn quyền truy cập một số tệp tin quan trọng: Trong từng ứng dụng sẽ có những tệp tin không được phép truy cập từ những người dùng thông thường, chúng ta cần tìm hiểu xem hệ thống đang sử dụng có phương pháp nào để giữ an toàn cho những tệp tin này.

Tổng kết

Chúng ta đã cùng nhau tìm hiểu về các lỗ hổng bảo mật có thể gặp phải khi làm việc với các ứng dụng web, cụ thể ở đây là ngôn ngữ lập trình PHP. Những lỗ hổng này hoàn toàn có thể xảy ra ở bất kỳ ứng dụng nào nếu như lập trình viên không có kiến thức hoặc không chủ động phòng ngừa chúng. Công việc ngăn chặn cũng như nâng cao bảo mật này đòi hỏi sự chú ý đặc biệt từ các lập trình viên. 


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: