Hướng dẫn dangerouslysetinnerhtml la gì - risklysetinnerhtml la gì

Có vẻ như nguy hiểm rằng comeroSsetInnerHTML không ảnh hưởng đến vòng đời thành phần. Tôi đặt dòng này vào thành phầnDidMount, nhưng nó trả về kết quả sai:

Nếu tôi cố gắng chạy trên dòng trong công cụ console dev, nó sẽ trả về kết quả thật vì thành phần đã được hiển thị hoàn toàn.

1.7483 huy hiệu vàng21 Huy hiệu bạc40 Huy hiệu đồng3 gold badges21 silver badges40 bronze badges3 gold badges21 silver badges40 bronze badges

Có vẻ như sự kiện DomsubTreemodified đã không được ủng hộ vì API của người quan sát đột biến.

PS.

Bài viết này bao gồm lý do đằng sau việc sử dụng thuộc tính

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1 trong ứng dụng React, tương đương với thuộc tính
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
3 trong trình duyệt DOM.

let b = $["#product-content"].height[]; // wrong: 600, true: 6500 1 là gì?

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1 là một thuộc tính mà bạn có thể sử dụng trên các phần tử HTML trong ứng dụng React để lập trình đặt nội dung của chúng. Thay vì sử dụng bộ chọn để lấy phần tử HTML, sau đó đặt
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
3 của nó, bạn có thể sử dụng thuộc tính này trực tiếp trên phần tử.

Khi

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1 được sử dụng, React cũng biết rằng nội dung của yếu tố cụ thể đó là động và đối với trẻ em của nút đó, nó chỉ đơn giản bỏ qua so sánh với DOM ảo để đạt được hiệu suất bổ sung.

Như tên của tài sản cho thấy, có thể rất nguy hiểm khi sử dụng vì nó làm cho mã của bạn dễ bị tấn công trong các cuộc tấn công kịch bản chéo trang [XSS]. Điều này trở thành một vấn đề đặc biệt nếu bạn đang tìm nạp dữ liệu từ nguồn của bên thứ ba hoặc nội dung kết xuất được gửi bởi người dùng.

Khi nào nên sử dụng let b = $["#product-content"].height[]; // wrong: 600, true: 6500 1

Một trường hợp sử dụng trong đó bạn cần đặt nội dung HTML của phần tử DOM là khi bạn điền vào phần tử

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
9 với dữ liệu đến từ trình chỉnh sửa văn bản phong phú. Hãy tưởng tượng bạn có một trang web nơi mọi người có thể gửi nhận xét và bạn cho phép họ sử dụng trình soạn thảo văn bản phong phú. Trong trường hợp này, đầu ra của trình soạn thảo văn bản phong phú đó có thể là HTML với các thẻ như
class ContentRenderer extends React.Component {
  componentDidMount[] {
      this.observer = new MutationObserver[this.handleMutation];
      this.observer.observe[this.myElement, {
        // Check config in //developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        childList: true,
        attributes: true,
        characterData: true
      }];
    }
  
    componentWillUnmount[] { 
      this.observer.disconnect[];
    }
    
    handleMutation[] {
      console.log['mutation'];
    }
    
    render[] {
      return [
        
{ this.myElement = myElement; }} /> ]; } }
0,
class ContentRenderer extends React.Component {
  componentDidMount[] {
      this.observer = new MutationObserver[this.handleMutation];
      this.observer.observe[this.myElement, {
        // Check config in //developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        childList: true,
        attributes: true,
        characterData: true
      }];
    }
  
    componentWillUnmount[] { 
      this.observer.disconnect[];
    }
    
    handleMutation[] {
      console.log['mutation'];
    }
    
    render[] {
      return [
        
{ this.myElement = myElement; }} /> ]; } }
1 và
class ContentRenderer extends React.Component {
  componentDidMount[] {
      this.observer = new MutationObserver[this.handleMutation];
      this.observer.observe[this.myElement, {
        // Check config in //developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        childList: true,
        attributes: true,
        characterData: true
      }];
    }
  
    componentWillUnmount[] { 
      this.observer.disconnect[];
    }
    
    handleMutation[] {
      console.log['mutation'];
    }
    
    render[] {
      return [
        
{ this.myElement = myElement; }} /> ]; } }
2.

Hãy xem xét đoạn mã sau, sẽ hiển thị chuỗi mà không nhận thức được thẻ

class ContentRenderer extends React.Component {
  componentDidMount[] {
      this.observer = new MutationObserver[this.handleMutation];
      this.observer.observe[this.myElement, {
        // Check config in //developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        childList: true,
        attributes: true,
        characterData: true
      }];
    }
  
    componentWillUnmount[] { 
      this.observer.disconnect[];
    }
    
    handleMutation[] {
      console.log['mutation'];
    }
    
    render[] {
      return [
        
{ this.myElement = myElement; }} /> ]; } }
1 trong đó - có nghĩa là đầu ra sẽ chỉ là chuỗi mà không có bất kỳ văn bản in đậm nào, như SO: Lorem ipsum.
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
0

Nhưng khi

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1 được sử dụng, React trở nên nhận thức được các thẻ HTML và hiển thị chúng đúng cách. Lần này, đầu ra sẽ được hiển thị chính xác bằng văn bản in đậm [nghĩa là, lorem ipsum].ipsum].
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
2ipsum].
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
2

Lưu ý rằng nó phải là một đối tượng có khóa

class ContentRenderer extends React.Component {
  componentDidMount[] {
      this.observer = new MutationObserver[this.handleMutation];
      this.observer.observe[this.myElement, {
        // Check config in //developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        childList: true,
        attributes: true,
        characterData: true
      }];
    }
  
    componentWillUnmount[] { 
      this.observer.disconnect[];
    }
    
    handleMutation[] {
      console.log['mutation'];
    }
    
    render[] {
      return [
        
{ this.myElement = myElement; }} /> ]; } }
5 được chuyển đến
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1. Ngoài ra, yếu tố bạn sử dụng thuộc tính
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1 trên không nên có bất kỳ con nào, do đó việc sử dụng phần tử
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
9 làm thẻ tự đóng.

Yêu cầu vượt qua một đối tượng chỉ là một biện pháp bảo vệ khác để ngăn chặn các nhà phát triển sử dụng nó mà không cần thông qua tài liệu và nhận thức được mối nguy hiểm tiềm tàng.

Vệ sinh khi sử dụng let b = $["#product-content"].height[]; // wrong: 600, true: 6500 1

Các ví dụ trên không gây nguy hiểm khi kết xuất. Tuy nhiên, có thể có một số trường hợp phần tử HTML thực thi tập lệnh.

Hãy xem xét các ví dụ sau trong đó một sự kiện JavaScript được gắn vào phần tử HTML. Mặc dù đây là những ví dụ vô hại, nhưng chúng là bằng chứng về các khái niệm cho thấy làm thế nào một yếu tố HTML có thể được khai thác để chạy các kịch bản độc hại.

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
7

May mắn thay, có các công cụ vệ sinh cho HTML, phát hiện các bộ phận có khả năng độc hại trong mã HTML và sau đó xuất ra một phiên bản sạch và an toàn của nó. Chất khử trùng phổ biến nhất cho HTML là Dompurify.

Hãy để sử dụng bản demo trực tuyến của mình để vệ sinh các mã HTML đã đề cập ở trên và xem cách nó phát hiện và lọc ra các phần của mã có khả năng nguy hiểm khi được thực thi.

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
8
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
9

Nó thực hành tốt để sử dụng chất khử trùng ngay cả khi chúng ta tin tưởng vào nguồn dữ liệu. Với gói Dompurify được sử dụng, một trong những ví dụ trên sẽ như sau:

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
0

Hàm

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
10 trả về một đối tượng với khóa
class ContentRenderer extends React.Component {
  componentDidMount[] {
      this.observer = new MutationObserver[this.handleMutation];
      this.observer.observe[this.myElement, {
        // Check config in //developer.mozilla.org/en-US/docs/Web/API/MutationObserver
        childList: true,
        attributes: true,
        characterData: true
      }];
    }
  
    componentWillUnmount[] { 
      this.observer.disconnect[];
    }
    
    handleMutation[] {
      console.log['mutation'];
    }
    
    render[] {
      return [
        
{ this.myElement = myElement; }} /> ]; } }
5, có giá trị được trả về từ hàm
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
12.

Đúng như dự đoán, khi chúng ta di chuột qua văn bản in đậm, không có chức năng cảnh báo được thực thi.

Lưu ý rằng vì Dompurify cần một cây DOM và môi trường nút không có, bạn phải sử dụng gói

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
13 để tạo đối tượng
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
14 và khởi tạo
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
15 với nó hoặc sử dụng gói
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
16 một mình, gói gọn cả
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
15 và
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
13 Gói.

Nếu bạn thích tùy chọn đầu tiên, bạn có thể tham khảo đoạn trích sau từ tài liệu của

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
15.
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
0

Sự kết luận

Tóm lại,

let b = $["#product-content"].height[]; // wrong: 600, true: 6500
1 không là gì ngoài việc thay thế
let b = $["#product-content"].height[]; // wrong: 600, true: 6500
3 trong React và nên được sử dụng một cách cẩn thận. Mặc dù tên cho thấy nguy hiểm trong việc sử dụng, nhưng thực hiện các biện pháp cần thiết bằng cách sử dụng chất khử trùng được phát triển tốt đảm bảo mã sạch và không chạy các tập lệnh bất ngờ khi được hiển thị trong nút React.

Khả năng hiển thị đầy đủ vào các ứng dụng phản ứng sản xuất

Gỡ lỗi các ứng dụng React có thể khó khăn, đặc biệt là khi người dùng gặp phải các vấn đề khó sao chép. Nếu bạn quan tâm đến việc theo dõi và theo dõi trạng thái Redux, tự động xuất hiện các lỗi JavaScript và theo dõi các yêu cầu mạng chậm và thời gian tải thành phần, hãy thử logrocket.

Logrocket giống như một DVR cho các ứng dụng web và di động, ghi lại mọi thứ xảy ra trên ứng dụng React của bạn. Thay vì đoán tại sao các vấn đề xảy ra, bạn có thể tổng hợp và báo cáo về trạng thái của ứng dụng của bạn khi xảy ra vấn đề. Logrocket cũng theo dõi hiệu suất của ứng dụng của bạn, báo cáo với các số liệu như tải CPU của máy khách, sử dụng bộ nhớ máy khách và hơn thế nữa.

Gói Logrocket Redux Middleware bổ sung thêm một lớp hiển thị vào các phiên người dùng của bạn. Logrocket ghi lại tất cả các hành động và nêu từ các cửa hàng Redux của bạn.

Hiện đại hóa cách bạn gỡ lỗi ứng dụng React của mình - bắt đầu giám sát miễn phí.

Bài Viết Liên Quan

Chủ Đề