Chuyển đến nội dung
Tài liệu

Hướng dẫn cho nhà phát triển

Quy tắc bảo mật

Đây là các quy tắc bảo mật mà tài nguyên bên thứ ba phải tuân thủ. Các mục ở đây xuất phát từ những dạng sự cố thực tế.

Đầu ra: XSS

  • Khi xuất dữ liệu người dùng nhập, luôn dùng {{ }} (có thoát ký tự).
  • Chỉ dùng {!! !!} cho HTML đã được lõi làm sạch (nội dung trình soạn thảo getContent()). Ngay khi đưa vào giá trị chưa làm sạch là thành XSS.
  • Khi đưa giá trị vào ngữ cảnh JS, hãy dùng @json($value) hoặc bộ lọc |escapejs. Đừng tạo script bằng cách nối chuỗi.

Đầu vào: kiểm tra ở máy chủ

  • Kiểm tra trên màn hình (JS) chỉ để tiện lợi. Hãy kiểm tra lại mọi thứ trong action proc (máy chủ).
  • Số thì ép kiểu (int), giá trị có danh sách cho phép thì kiểm tra bằng in_array(..., true).
  • Chừng nào dùng binding của query XML thì SQL injection bị chặn, nhưng hãy siết thêm một lớp bằng filter="number" và notnull. Để không trở thành update/delete không điều kiện, nhất định phải gắn notnull cho điều kiện cốt lõi.

CSRF và thiết kế action

  • Thao tác thay đổi dữ liệu nhất định phải làm bằng action proc + POST. Lõi tự động kiểm tra token CSRF.
  • Không được thay đổi dữ liệu bằng GET (disp). Cấu trúc mà chỉ một đường link là thực hiện xóa sẽ vượt qua cả kiểm tra CSRF.
  • Chỉ những callback do máy chủ bên ngoài gọi mới gắn standalone="true" check-csrf="false", và trong action đó hãy tự kiểm tra (chữ ký, token trạng thái, xác nhận lại giữa các máy chủ). Đừng tin giá trị đi qua trình duyệt.

Kiểm tra quyền

  • Đừng chỉ dựa vào thuộc tính permission của module.xml; với thao tác cần xác nhận chủ sở hữu (sửa bài của mình, v.v.), hãy đối chiếu member_srl bên trong action.
  • Chức năng quản lý hãy khóa hai lớp: permission="manager" + phân nhánh quyền cả trên màn hình. Chỉ ẩn nút trên màn hình không phải là bảo vệ.

Tải tệp lên

  • Kiểm tra phần mở rộng theo kiểu danh sách cho phép (danh sách cấm sẽ bị vượt qua).
  • Đặt giới hạn kích thước, và tên tệp lưu trữ đừng dùng tên gốc mà hãy tạo mới.
  • Để các tệp có thể thực thi (.php, v.v.) không chạy được từ đường dẫn tải lên, hãy dùng đường dẫn của mô-đun tệp trong lõi (files/attach). Cấu hình máy chủ web chặn thực thi PHP ở đường dẫn này.

Lưu giữ giá trị bí mật

  • Khi lưu token, khóa vào DB, hãy lưu dưới dạng băm (để tra cứu) hoặc mã hóa (khi cần giải mã). Zittme\Framework\Security của lõi có công cụ mã hóa.
  • Nếu tạo tệp trạng thái tạm dưới files/cache, hãy xác nhận không truy cập trực tiếp được qua web. Nếu là đường dẫn mới không có trong quy tắc chặn của máy chủ web thì phải thêm quy tắc. Thực tế đã có sự cố đường dẫn này bị lộ với HTTP 200.
  • Đừng viết cứng thông tin xác thực trong mã. Hãy lưu vào cài đặt mô-đun (insertModuleConfig) và hiển thị có che trên màn hình.

Tích hợp bên ngoài

  • Callback máy chủ của chúng ta nhận: đừng tin giá trị đi qua trình duyệt, hãy kiểm tra lại bằng giao tiếp giữa các máy chủ (số tiền thanh toán, kết quả xác thực, v.v.).
  • Khi đổi mã xác thực, hãy dùng các biện pháp bảo vệ chuẩn như token trạng thái (state) và PKCE.
  • Kiểm tra xem phản hồi có gửi kèm Set-Cookie không cần thiết không. Nếu cookie phiên được cấp mới trong callback liên trang, nó có thể ghi đè phiên hiện có của người dùng.

Danh sách kiểm tra cuối cùng

  • Có chỗ nào xuất dữ liệu người dùng nhập mà không thoát ký tự không
  • Có chỗ nào dữ liệu bị thay đổi qua GET mà không qua proc không
  • Có query update/delete không điều kiện không
  • Việc kiểm tra phần mở rộng, kích thước tệp tải lên có nằm ở máy chủ không
  • Giá trị bí mật có bị lưu dạng văn bản thuần hoặc nằm ở đường dẫn lộ ra web không