Khi nào bạn nên dọn dẹp HTML?
Bây giờ chúng ta biết cách lấy đầu vào của người dùng bằng cách sử dụng các biểu mẫu HTML và các yêu cầu POST kích hoạt hàm Show
Nhưng chúng tôi phải rất cẩn thận khi hiển thị đầu vào của người dùng đó, đặc biệt là với những người dùng khác. Chúng tôi không thể chỉ cho phép nội dung tùy ý, vì khi đó những người dùng ác ý có thể thực hiện những hành vi xấu như đưa HTML hoặc JavaScript vào trang của chúng tôi, điều này sẽ cho phép họ chuyển hướng trình duyệt, lấy cắp thông tin hoặc khai thác tập lệnh chéo trang trên trang web của bạn Thay vào đó, chúng tôi phải làm sạch dữ liệu mà chúng tôi nhận được từ người dùng của mình để dữ liệu đó chỉ chứa nội dung an toàn. Không có một cách tốt nhất để làm điều này mặc dù. Nó giống như một loạt câu hỏi mà bạn phải trả lời và câu trả lời phụ thuộc vào chính xác cách bạn muốn trang web của mình hoạt động và loại nội dung nào bạn muốn cho phép Ứng dụng web mẫuHãy bắt đầu với một ứng dụng web mẫu lấy đầu vào từ người dùng và sau đó hiển thị nó. Đây là lớp servlet của chúng ta
Trong chức năng Tệp JSP trông như thế này
Tệp này chỉ hiển thị nội dung và sau đó là biểu mẫu cho phép người dùng thay đổi nội dung Cuối cùng, đây là tệp 1
Tệp 1 ánh xạ URL 3 tới servlet của chúng tôi. Chạy servlet này và truy cập http. //máy chủ cục bộ. 8080/home, và bạn sẽ thấy cái nàyBạn có thể nhập một số văn bản để đảm bảo nó hoạt động Ở đây tôi đã gõ 4 và nhấp vào nút 5. servlet đã lưu trữ nội dung đó và bây giờ trang JSP hiển thị nội dung đó. Bạn có thể coi đây là một phiên bản rất đơn giản của trang web cho phép bạn gửi bài đăng, như Twitter hoặc Facebook hoặc bất kỳ thứ gìĐầu vào của người dùng không hợp lệNhưng điều gì xảy ra nếu bạn nhập html? Hãy thử nhập một cái gì đó như 6 vào phần nhập văn bản và nhấp vào nút 5. Bạn sẽ thấy rằng html được hiển thị trong trangĐiều này là do JSP của chúng tôi chỉ xuất nội dung trực tiếp sang HTML trên dòng này Vì vậy, nếu 8 là 6, thì HTML được hiển thị trên màn hình là 0Cho phép người dùng nhập HTML tùy ý có thể gây ra sự cố trên trang web của bạn. Hãy tưởng tượng một trang web như Twitter hoặc Facebook hoặc Tumblr, nơi các bài đăng của một người dùng được hiển thị cho những người dùng khác. Nếu tôi là một người dùng độc hại, tôi có thể
Một ví dụ khác, hãy thử nhập nội dung này
Nội dung này chỉ là một 1trở thành 2. Hãy nhớ rằng 3 và 4 được hiển thị dưới dạng 3 và 4 thay vì được phân tích cú pháp dưới dạng thẻ HTMLLàm sạch nội dung để chỉ cho phép HTML an toàn thông qua 7trở thành 8Tách nội dung để không cho phép bất kỳ HTML nào 7trở thành 4Thay thế nội dung để người dùng có thể nhập các thẻ không phải HTML mà bạn chuyển đổi sang HTML. 1 trở thành 2, Ví dụ. Lưu ý rằng bạn vẫn phải quyết định phải làm gì với HTML bình thường trộn lẫn với loại nội dung nàyCách tiếp cận bạn chọn tùy thuộc vào cách bạn muốn ứng dụng web của mình hoạt động, mối quan tâm về bảo mật của bạn và thành thật mà nói, bạn muốn đầu tư bao nhiêu thời gian vào phần này trên trang web của mình. (Bạn có làm một việc dễ dàng chỉ mất 5 phút hay bạn dành nhiều thời gian để hoàn thiện quy trình nhập liệu của mình?) Trên thực tế, bạn có thể sẽ sử dụng kết hợp một số tùy chọn ở trên Nội dung không cho phépKhông cho phép nội dung có lẽ là lựa chọn dễ dàng nhất, nhưng ngay cả khi đó, bạn vẫn có nhiều câu hỏi hơn cần trả lời
Sử dụng danh sách trắng an toàn hơn nhưng hạn chế hơn. Thông thường, bạn sẽ sử dụng biểu thức chính quy để không cho phép nội dung, cho dù bạn sử dụng danh sách trắng hay danh sách đen Hãy sửa đổi lớp servlet của chúng ta để sử dụng danh sách trắng chỉ cho phép người dùng nhập chữ cái, số và dấu cách
Giờ đây, hàm 4 để đảm bảo giá trị đầu vào chỉ chứa các chữ cái, số và dấu cách. Nếu nó không khớp với biểu thức chính quy của chúng ta, điều đó có nghĩa là đầu vào chứa các ký tự không hợp lệ và servlet sẽ thêm một thuộc tính lỗi và chuyển tiếp yêu cầu tới JSP. Nếu đầu vào khớp với biểu thức chính quy, điều đó có nghĩa là nó chỉ chứa các chữ cái, số và dấu cách và chúng tôi cho phép yêu cầu thông quaBây giờ JSP chỉ hiển thị lỗi nếu nó xuất hiện
Bây giờ hãy thử nhập những thứ như 5 6 7 để thấy rằng đầu vào này tạo ra lỗi. Biểu thức chính quy trong ví dụ này được đơn giản hóa quá mức, do đó, nó cũng không cho phép dấu chấm câu và các chữ cái không phải mã ascii. Đó có thể là điều bạn muốn hoặc không, vì vậy hãy xem lớp 8 để biết thêm thông tin về biểu thức chính quyCách tiếp cận không cho phép một số nội dung này khá phổ biến đối với tên người dùng, đặc biệt là vì bạn có thể sẽ sử dụng chúng trong các URL có yêu cầu nội dung riêng. Vì vậy, bạn có thể không muốn tên người dùng là 9 hoặc nhiều khoảng trống hoặc nội dung HTMLthoát khỏi nội dungCác thẻ HTML được phân định bằng các ký hiệu 3 và 4, như trong 2Nếu trình duyệt của bạn nhìn thấy một trong những biểu tượng này, nó biết rằng nội dung đó là một thẻ HTML, do đó nên được sử dụng để định dạng văn bản thay vì hiển thị cho người xemNhưng nếu chúng ta muốn văn bản của mình bao gồm ký hiệu 3 hoặc 4 thì sao? 6 mà không có phần 7 được phân tích dưới dạng HTML?Chúng ta cần thoát những ký tự này bằng các thực thể HTML. Các thực thể HTML là một chuỗi ký tự đặc biệt được hiển thị dưới dạng một ký tự và không được phân tích cú pháp dưới dạng thẻ HTML
Các thực thể 3 và 4 phù hợp để hiển thị nội dung dưới dạng văn bản thuần túy thay vì HTML cần được phân tích cú pháp. Thực thể 2 là cần thiết vì ký hiệu và dấu ____28_______2 bình thường được coi là phần đầu của thực thể (vì vậy nếu bạn muốn văn bản của mình hiển thị dưới dạng 3 thay vì 3, bạn phải sử dụng 4). Các thực thể 4 và 6 rất hữu ích khi bạn muốn đặt nội dung người dùng bên trong các thuộc tính phần tử (ví dụ: nếu bạn muốn thực hiện, điều gì sẽ xảy ra nếu 7 chứa ký hiệu 4?)Vì vậy, nếu chúng tôi chỉ muốn hiển thị nội dung của người dùng chính xác như khi họ nhập nội dung đó mà không bị phân tích cú pháp thành HTML, thì chúng tôi chỉ cần thay thế bất kỳ ký hiệu nào có thể được phân tích cú pháp thành HTML hoặc can thiệp vào định dạng của chúng tôi bằng thực thể HTML tương ứng của chúng. Chúng ta có thể làm điều này bằng cách sử dụng các hàm 9 và 0, nhưng thay vì phát minh lại bánh xe, hãy sử dụng một libary thực hiện việc này cho chúng taThư viện Apache Commons Lang cung cấp một số chức năng hữu ích để thoát khỏi nội dung. Tải xuống tệp 1 của thư viện và sao chép tệp đó vào thư mục 2 trong thư mục ứng dụng web của bạn. Bây giờ chúng ta có thể sử dụng thư viện đó trong servlet của mình
Bây giờ, hàm 4 để thoát khỏi nội dung, hàm này hiển thị dưới dạng văn bản thuần túy thay vì nội dung HTMLPhương pháp thoát nội dung này rất hữu ích nếu bạn muốn có một trình soạn thảo văn bản rất cơ bản không cung cấp bất kỳ kiểu dáng nào và bạn muốn hiển thị văn bản chính xác như cách người dùng đã nhập nó Nội dung làm sạchKhông phải tất cả các thẻ hoặc thuộc tính HTML đều nguy hiểm, vì vậy bạn có thể cho phép một số HTML, miễn là bạn không cho phép nội dung nguy hiểm. Ví dụ: bạn có thể muốn cho phép và
5Bây giờ chúng tôi tải thư viện CKEditor, sau đó gọi hàm 6 để thay thế vùng văn bản cơ bản bằng vùng văn bản đa dạng thứcLưu ý rằng chúng tôi vẫn cần xử lý nội dung phía máy chủ, ngay cả khi chúng tôi đang sử dụng trình soạn thảo văn bản đa dạng thức. Điều này là để ngăn người dùng độc hại làm những việc như
Vấn đề là, bạn không bao giờ nên tin tưởng bất kỳ nội dung nào đến từ phía khách hàng. Luôn thực hiện kiểm tra phía máy chủ
Bây giờ nếu chúng tôi chạy máy chủ của mình, chúng tôi sẽ thấy trình soạn thảo văn bản đa dạng thức Lưu ý rằng trình chỉnh sửa hiện có một thanh công cụ cho phép người dùng thay đổi định dạng của văn bản, được hiển thị trong trình chỉnh sửa WYSIWYG Khi biểu mẫu được gửi, nội dung xuất hiện dưới dạng văn bản HTML thông thường, chúng tôi có thể xử lý chính xác cách chúng tôi xử lý văn bản HTML trong tất cả các ví dụ trên. Hiện tại, chúng tôi chỉ hiển thị nó trong trang Có rất nhiều thư viện để hiển thị các trình chỉnh sửa trên máy khách và phân tích nội dung trên máy chủ, vì vậy bạn sẽ phải tìm một sự kết hợp phù hợp nhất với bạn và trang web của bạn Thuộc tính và URLHãy nhớ rằng các URL và thuộc tính có giới hạn nội dung riêng Ví dụ: HTML hoàn toàn có thể chứa ký tự dấu chấm hỏi 8, nhưng hãy nhớ rằng ký hiệu 8 trong URL đại diện cho tham số chuỗi truy vấn. Vì vậy, nếu bạn đang sử dụng tên người dùng do người dùng nhập và xây dựng các URL như doPost() 0, điều gì sẽ xảy ra nếu người dùng đăng ký với tên doPost() 1 và bạn đã sử dụng tên đó trong URL của mình? Hoặc nếu bạn đang xây dựng html như , điều gì sẽ xảy ra nếu tên người dùng là Vấn đề là, bạn phải suy nghĩ cẩn thận về chính xác cách bạn đang sử dụng nội dung. Các loại nội dung khác nhau có các loại hạn chế khác nhau và nội dung tốt ở nơi này có thể không ổn ở nơi khác Chúng tôi đã thấy khá nhiều giải pháp cho vấn đề này. chúng tôi cần thoát khỏi nội dung bằng cách mã hóa nội dung đó thành các ký tự an toàn cho bất kỳ mục đích gì chúng tôi đang sử dụng Bản tóm tắtCó rất nhiều cách để phân tích cú pháp văn bản và không có một cách tiếp cận đúng nào. Những gì bạn chọn tùy thuộc vào bạn và cách bạn muốn trang web của mình hoạt động, nhưng quy trình chung mà bạn sẽ tuân theo là
Bạn có thể sẽ có sự kết hợp của các loại trình chỉnh sửa và hạn chế nội dung khác nhau. tên người dùng có thể có các giới hạn nội dung khác với nội dung của bài đăng, có thể có các giới hạn nội dung khác với nhận xét Hãy chắc chắn rằng bạn thực hiện rất nhiều thử nghiệm đầu vào của người dùng. Hãy thử phá cách với những ký tự lạ. Hãy thử phá vỡ nó bằng cách tiêm HTML và JavaScript. Tốt hơn là dành vài giờ để đảm bảo mọi thứ hoạt động ngay bây giờ hơn là dành nhiều thời gian để khắc phục thiệt hại sau khi hoàn thành Bài tập về nhà
|