Hướng dẫn is it good practice to use innerhtml? - sử dụng innerhtml có tốt không?

Không có bất kỳ bối cảnh nào, chỉ có một quy tắc: không có quy tắc.

Không có tình huống nào trong lập trình trong đó người ta tuân theo một số "quy tắc" một cách mù quáng, bất kể bối cảnh. Nếu InsideHTML vốn dĩ là Eval, ý tôi là Evil, nó sẽ không nằm trong đặc điểm kỹ thuật ngôn ngữ để bắt đầu!

Các lựa chọn thay thế cho việc sử dụng bên trong khác nhau tùy thuộc vào những gì bạn đang cố gắng làm, những gì (nếu có) thư viện JavaScript bạn có và những gì (nếu có) trình duyệt bạn đang nhắm mục tiêu.

Khi bạn đang tạo một phần mới của HTML, bạn có thể sử dụng document.createElement (tài liệu) để tạo mỗi phần tử, sử dụng appendChild và muốn thêm các phần tử cho nhau. Nếu bạn đang thay đổi văn bản của một phần tử từ "màu xanh" thành "đỏ", bạn sẽ sử dụng innerHTML để thực hiện điều đó (giả sử bạn không sử dụng bất kỳ khung công tác JavaScript phổ biến nào).

Nhược điểm của bên trong, nó rất chậm bởi vì HTML bên trong đã phân tích nội dung thậm chí chúng ta phải phân tích lại nội dung để đó là lý do tại sao nó cần có thời gian. Khi chúng tôi đã sử dụng trình xử lý sự kiện thì trình xử lý sự kiện không được tự động gắn vào các yếu tố mới được tạo bởi InternalHTML. 3 minutes 🕑

Tôi nên sử dụng InnerHTML hay Internaltext?

Thuộc tính bên trong html-recodes nội dung, chuyển sang & lt; p & gt; , v.v ... Nếu bạn muốn chèn các thẻ HTML bạn cần sử dụng InnerHTML.

Nhưng tính hữu ích này là nguồn gốc của rủi ro bảo mật: nếu được sử dụng trong một số tình huống nhất định, .innerHTML có thể cho phép các tác nhân độc hại chạy JavaScript trực tiếp trên trang web của bạn. Điều này có thể cho phép truy cập vào máy chủ phụ trợ của bạn và bất kỳ thông tin nhạy cảm nào được lưu trữ ở đó, chẳng hạn như dữ liệu người dùng và mật khẩu. Trong một kịch bản khác, một tập lệnh độc hại có thể được đặt trên trang web của bạn và chạy mỗi khi người dùng truy cập nó, việc đưa người dùng của bạn trực tiếp gặp rủi ro bảo mật.

Trong bài viết này, trước tiên chúng tôi xem xét cách .innerHTML có thể được khai thác theo những cách này. Sau đó, chúng tôi xem xét một số tùy chọn và cách giải quyết để giữ an toàn cho máy chủ và người dùng của bạn.

Làm thế nào .innerhtml có thể làm cho trang web của bạn dễ bị tổn thương

Nguy cơ sử dụng .innerHTML là nó có thể cho phép ai đó chạy JavaScript trên trang web của bạn. Làm thế nào điều này có thể xảy ra?

Lỗ hổng xảy ra khi có cơ hội cho đầu vào của người dùng. Ví dụ, hãy xem xét ví dụ mã trực tiếp sau:

Xem bút không có tiêu đề của James (@openjavascriptadmin) trên Codepen.

Nội dung của trường văn bản đầu vào được in bên dưới nó khi người dùng nhấp vào gửi. Có nhiều trường hợp sử dụng cho điều này: ứng dụng trò chuyện, phương tiện truyền thông xã hội và chỉnh sửa hồ sơ.

Bây giờ, thay vào đó, việc nhập một văn bản vô tội về tôi, hãy nhập những điều sau: .

Và chỉ như vậy, JavaScript đang được điều hành từ trang web của chủ nhà. Trong trường hợp này, chúng tôi chỉ tạo một cảnh báo. Nhưng vấn đề ở đây là những gì có thể được chạy.

Lỗ hổng số 1: Truy cập vào máy chủ phụ trợ

Một yêu cầu tìm nạp có thể được thực hiện cho máy chủ phụ trợ sẽ không bị từ chối là nước ngoài vì nó đang được tạo từ trang web máy chủ. Điều này cung cấp một cổng để truy cập vào mọi thứ được lưu trữ trên máy chủ của bạn.

Lỗ hổng #2: Kịch bản độc hại nhắm mục tiêu người dùng cuối

Cơ hội cho đầu vào người dùng có thể được sử dụng để đặt tập lệnh trên trang sẽ chạy mỗi khi trang được truy cập trong tương lai. Tập lệnh này có thể xóa thông tin người dùng khỏi trình duyệt, bao gồm thông tin người dùng nhạy cảm như tên người dùng và mật khẩu.

Các giải pháp

Các kịch bản này phải đủ để cung cấp cho bất kỳ quản trị trang web nào chạy một trang web với các khả năng đầu vào của người dùng là một sự sợ hãi. Trong hầu hết các trường hợp, việc loại bỏ tương tác người dùng khỏi trang web của bạn là không thể tưởng tượng được.

Rất may, có những giải pháp có thể bảo vệ trang web của bạn và người dùng khỏi lỗ hổng này.

✅ #1: Sử dụng .TextContent hoặc .innertext nếu có thể

Khi hiển thị văn bản chỉ với DOM (ví dụ: như trong ví dụ mã trực tiếp của chúng tôi), không cần thiết phải sử dụng .innerhtml. Thay vào đó, chúng tôi có thể sử dụng các phương thức khác có sẵn cho chúng tôi để viết nội dung vào DOM: .TextContent và .innertext. Khi sử dụng những thứ này, nếu HTML được bao gồm trong đầu vào, nó sẽ không được hiển thị như vậy, mà chỉ là văn bản.

Ví dụ: bên dưới chúng tôi sửa đổi mã trực tiếp của chúng tôi từ trước đó để đầu vào của người dùng được hiển thị cho DOM bằng TextContent. Bây giờ, hãy thử nhập lại vào trường đầu vào văn bản: .

Xem bút không có tiêu đề của James (@openjavascriptadmin) trên Codepen.

Nội dung của trường văn bản đầu vào được in bên dưới nó khi người dùng nhấp vào gửi. Có nhiều trường hợp sử dụng cho điều này: ứng dụng trò chuyện, phương tiện truyền thông xã hội và chỉnh sửa hồ sơ.

Bây giờ, thay vào đó, việc nhập một văn bản vô tội về tôi, hãy nhập những điều sau: .

Và chỉ như vậy, JavaScript đang được điều hành từ trang web của chủ nhà. Trong trường hợp này, chúng tôi chỉ tạo một cảnh báo. Nhưng vấn đề ở đây là những gì có thể được chạy.

Lỗ hổng số 1: Truy cập vào máy chủ phụ trợ

Một yêu cầu tìm nạp có thể được thực hiện cho máy chủ phụ trợ sẽ không bị từ chối là nước ngoài vì nó đang được tạo từ trang web máy chủ. Điều này cung cấp một cổng để truy cập vào mọi thứ được lưu trữ trên máy chủ của bạn.

Lỗ hổng #2: Kịch bản độc hại nhắm mục tiêu người dùng cuối

Cơ hội cho đầu vào người dùng có thể được sử dụng để đặt tập lệnh trên trang sẽ chạy mỗi khi trang được truy cập trong tương lai. Tập lệnh này có thể xóa thông tin người dùng khỏi trình duyệt, bao gồm thông tin người dùng nhạy cảm như tên người dùng và mật khẩu.

Xem bút không có tiêu đề của James (@openjavascriptadmin) trên Codepen.

Nội dung của trường văn bản đầu vào được in bên dưới nó khi người dùng nhấp vào gửi. Có nhiều trường hợp sử dụng cho điều này: ứng dụng trò chuyện, phương tiện truyền thông xã hội và chỉnh sửa hồ sơ.

Bây giờ, thay vào đó, việc nhập một văn bản vô tội về tôi, hãy nhập những điều sau: .

Và chỉ như vậy, JavaScript đang được điều hành từ trang web của chủ nhà. Trong trường hợp này, chúng tôi chỉ tạo một cảnh báo. Nhưng vấn đề ở đây là những gì có thể được chạy.

Lỗ hổng số 1: Truy cập vào máy chủ phụ trợ


Nhược điểm của việc sử dụng bên trong là gì?

Nhược điểm của bên trong, nó rất chậm bởi vì HTML bên trong đã phân tích nội dung thậm chí chúng ta phải phân tích lại nội dung để đó là lý do tại sao nó cần có thời gian.Khi chúng tôi đã sử dụng trình xử lý sự kiện thì trình xử lý sự kiện không được tự động gắn vào các yếu tố mới được tạo bởi InternalHTML.It is very slow because as inner HTML already parses the content even we have to parse the content again so that's why it takes time. When we have used the event handlers then the event handlers are not automatically attached to the new elements created by innerHTML.

Tôi nên sử dụng InnerHTML hay Internaltext?

Thuộc tính bên trong html-recodes nội dung, chuyển sang & lt; p & gt;, v.v ... Nếu bạn muốn chèn các thẻ HTML bạn cần sử dụng InnerHTML.If you want to insert HTML tags you need to use InnerHTML .

Tôi có thể sử dụng gì thay vì InnerHTML?

HTML chỉ định rằng một thẻ được chèn bằng bên trong không nên thực thi.Vì lý do đó, chúng tôi khuyến nghị thay vì bên trong bạn sử dụng: Element.sethtml () để vệ sinh văn bản trước khi nó được chèn vào DOM.Element.SetHTML() to sanitize the text before it is inserted into the DOM.

Tại sao bên trong là xấu?

InsideHTML có hàng ngàn div, bảng, danh sách, hình ảnh, v.v., sau đó gọi.InsideHtml += ... sẽ khiến trình phân tích cú pháp lại phân biệt lại tất cả những thứ đó một lần nữa.