Ngăn chặn kịch bản chéo trang


8

Một trong những nguyên tắc bảo mật là vệ sinh chuỗi và biến được truyền từ máy khách đến máy chủ. Trong PHP đơn giản, có một số chức năng để ngăn ngừa các lỗ hổng XSS ( Cross-site Scripting ):

Chiến lược Drupal 8 để ngăn chặn các cuộc tấn công XSS là gì? Làm cách nào tôi có thể dọn sạch bài đăng dữ liệu khách hàng để bảo vệ trang web của mình khỏi các cuộc tấn công XSS?

Tôi nhớ Drupal 7 filter_xss()phải ngăn ngừa các lỗ hổng XSS, nhưng chiến lược Drupal 8 chống lại các lỗ hổng XSS là gì?


Ngoài ra, xem xét việc xác định tiêu đề Chính sách bảo mật nội dung cho trang web của bạn, dưới dạng một lớp bảo vệ XSS bổ sung ( drupal.org/project/csp ). Thật không may, Drupal 8 vẫn chưa thể chặn hoàn toàn các tập lệnh nội tuyến do nó sử dụng CKEditor 4, nhưng các bản cập nhật gần đây cho thông số CSP ít nhất sẽ cho phép thu hẹp các tập lệnh nội tuyến nào được phép bởi các trình duyệt.
gapple

Câu trả lời:


10

Vệ sinh đầu ra để tránh các cuộc tấn công XSS (Cross Site Scripting)

Sử dụng các mẫu Twig Công cụ chủ đề Twig bây giờ tự động thoát mọi thứ theo mặc định. Điều đó có nghĩa là mọi chuỗi được in từ mẫu Twig (ví dụ: mọi thứ ở giữa {{ }}) sẽ được tự động khử trùng nếu không có bộ lọc nào được sử dụng.

Xem Bộ lọc - Sửa đổi biến trong các mẫu Twig cho các bộ lọc Twig có sẵn trong Drupal.

Để tận dụng thoát tự động của Twig (và tránh thoát khỏi đánh dấu an toàn), lý tưởng nhất là tất cả HTML phải được xuất ra từ các mẫu Twig.

Các hàm API Sử dụng t ()\Drupal::translation()->formatPlural() với @hoặc %giữ chỗ để xây dựng các chuỗi an toàn, có thể dịch. Xem API dịch văn bản mã trong Drupal 8 để biết thêm chi tiết.

  • Sử dụng Html :: esc () cho văn bản thuần túy.
  • Sử dụng Xss :: filter () cho văn bản sẽ cho phép một số thẻ HTML.
  • Sử dụng Xss :: filterAdmin () cho văn bản được nhập bởi người dùng quản trị viên sẽ cho phép hầu hết HTML.

Các chuỗi được khử trùng bởi t (), Html :: esc (), Xss :: filter () hoặc Xss :: filterAdmin () được tự động đánh dấu an toàn, cũng như các chuỗi đánh dấu được tạo từ các mảng kết xuất thông qua Renderer .

Mặc dù nó cũng có thể vệ sinh văn bản, nhưng hầu như không bao giờ đúng khi sử dụng check_markup trong một chủ đề hoặc mô-đun ngoại trừ trong ngữ cảnh của một thứ như khu vực văn bản có định dạng văn bản được liên kết.

Nguồn: Drupal 8: Viết mã bảo mật bởi: Rade, Shyamala, Robert Castelo và Pere Orga.


1

Các mẫu Twig không vệ sinh đầu ra trong ứng dụng của tôi. Một chuỗi script hoặc tấn công XSS được nhập vào trường nhận xét và được lưu được thực thi khi trang được tải. Thay vào đó, tôi đã giải quyết vấn đề bằng cách vệ sinh từng trường nhập chuỗi hook_ENTITY_TYPE_load.

 if(isset($entity->$fieldName)) {  
        $value = $entity->get($fieldName)->value;  
        $value =  htmlspecialchars($value);  
        $entity->set($fieldName, $value);  
 }  

0

Drupal thường áp dụng phương pháp lọc trên đầu ra, không phải đầu vào.

Một mô-đun chấp nhận đầu vào của một người không phải là một phần của hệ thống trường phải lọc nó khi đầu ra nó (ngay cả từ người dùng quản trị viên đặc quyền). Đầu ra thường là một mảng render. Vì vậy, một cách đơn giản để làm điều này là giới hạn các thẻ được phép trên kết xuất. Lấy một ví dụ từ đầu ra của mô-đun phân loại của nhãn hạn :

use Drupal\Component\Utility\Xss;

...

  public function termTitle(TermInterface $taxonomy_term) {
    return [
      '#markup' => $taxonomy_term->getName(),
      '#allowed_tags' => Xss::getHtmlTagList(),
    ];
  }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.