2010-08-05 44 views
19

Tôi đang tìm lớp/util vv để khử trùng mã HTML, tức là xóa các thẻ, thuộc tính và giá trị nguy hiểm để tránh XSS và các cuộc tấn công tương tự.Làm thế nào để khử trùng mã HTML trong Java để ngăn chặn các cuộc tấn công XSS?

Tôi nhận mã html từ trình soạn thảo văn bản phong phú (ví dụ: TinyMCE) nhưng nó có thể được gửi theo cách độc hại xung quanh, chấp nhận xác thực TinyMCE ("Dữ liệu gửi biểu mẫu ngoài trang web").

Có điều gì đơn giản để sử dụng làm InputFilter trong PHP không? giải pháp hoàn hảo tôi có thể tưởng tượng công trình như thế (giả khử trùng được đóng gói trong lớp HtmlSanitizer):

String unsanitized = "...<...>...";   // some potentially 
               // dangerous html here on input 

HtmlSanitizer sat = new HtmlSanitizer();  // sanitizer util class created 

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe... 

Cập nhật - giải pháp đơn giản hơn, thì càng tốt! Lớp util nhỏ với ít phụ thuộc bên ngoài trên các thư viện/khung công tác khác càng tốt - sẽ tốt nhất cho tôi.


Làm thế nào về điều đó?

+0

Vì vậy, những gì bạn về cơ bản muốn là cho khách hàng để có thể gửi biểu mẫu sau đó được hiển thị trong hình dạng của fx. một lưu bút? Và bạn muốn họ có thể sử dụng html nhưng bạn vẫn muốn có khả năng chặn người dùng độc hại hacking-tries? Hay tôi đã sai ở đây ...? – Latze

+0

@Latze: Tôi muốn khách hàng (người dùng thông qua trình duyệt của họ) gửi nội dung richtext (định dạng html qua trình chỉnh sửa văn bản phong phú - TinyMCE) nhưng để kiểm tra và xóa mọi nội dung nguy hiểm (không an toàn). Tôi không biết fx và sổ lưu bút mà bạn đề cập đến trong ngữ cảnh này là gì. – WildWezyr

+0

Ah! Tôi sẽ cung cấp cho nó một shot, cho tôi một vài phút – Latze

Trả lời

12

Bạn có thể sử dụng OWASP ESAPI for Java, thư viện bảo mật được xây dựng để thực hiện các thao tác đó.

Không chỉ có bộ mã hóa cho HTML, nó cũng có bộ mã hóa để thực hiện mã hóa JavaScript, CSS và URL. Sample uses of ESAPI có thể được tìm thấy trong bảng gian lận ngăn ngừa XSS do OWASP xuất bản.

Bạn có thể sử dụng dự án OWASP AntiSamy để xác định chính sách trang web nêu rõ nội dung được cho phép trong nội dung do người dùng gửi. Chính sách trang web có thể được sử dụng sau này để lấy HTML "sạch" được hiển thị lại. Bạn có thể tìm thấy một mẫu TinyMCE policy file trên AntiSamy downloads page.

+0

điều này sẽ yêu cầu để xây dựng lại kiến ​​trúc của toàn bộ dự án của tôi. Tôi không sẵn sàng làm điều đó. tôi cần một cái gì đó đơn giản mà không cần nhiều phụ thuộc và không cần phải thay đổi cách mã của tôi được tổ chức (tôi thích nó theo cách nó bây giờ). vì vậy - tôi chỉ cần một lớp util để thực hiện công việc. câu hỏi của tôi bây giờ được cập nhật để làm rõ yêu cầu đó. – WildWezyr

+2

Tôi không chắc chắn những gì bạn có ý nghĩa bằng cách xây dựng lại kiến ​​trúc của dự án. AntiSamy phù hợp hoàn toàn với yêu cầu của bạn bằng cách cho phép đầu vào trình soạn thảo văn bản được đưa vào thư viện lọc được điều khiển bởi chính sách trang web. –

+0

Hmmm. Có vẻ như bạn đã đúng! Tôi chỉ nghĩ rằng nó là lớn và nặng khung như thanh chống, mùa xuân vv và hoạt động như một số loại bộ lọc servlet ;-). Có lẽ chữ cái lớn trong tên ("OWASP") đã lừa tôi ở đây. BTW: phụ thuộc chính xác của OWASP AntiSamy - những gì khác tôi sẽ cần phải sử dụng nó? – WildWezyr

6

HTML thoát đầu vào hoạt động rất tốt. Nhưng trong một số trường hợp, các quy tắc kinh doanh có thể yêu cầu bạn KHÔNG được thoát khỏi HTML. Sử dụng REGEX không phù hợp với nhiệm vụ và quá khó để đưa ra một giải pháp tốt bằng cách sử dụng nó.

Giải pháp tốt nhất tôi thấy được sử dụng: http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

Nó xây dựng một cây DOM với đầu vào cung cấp và lọc bất kỳ yếu tố không previosly phép bởi một Whitelist. API cũng có các chức năng khác để dọn dẹp html.

Và nó cũng có thể được sử dụng với javax.validation @SafeHtml (whitelistType =, additionalTags =)

9

Bạn có thể thử OWASP Java HTML Sanitizer. Nó rất đơn giản để sử dụng.

PolicyFactory policy = new HtmlPolicyBuilder() 
    .allowElements("a") 
    .allowUrlProtocols("https") 
    .allowAttributes("href").onElements("a") 
    .requireRelNofollowOnLinks() 
    .build(); 

String safeHTML = policy.sanitize(untrustedHTML); 
3

Nhờ @ Saljack answer. Chỉ cần xây dựng thêm để OWASP Java HTML Sanitizer. Nó làm việc rất tốt (nhanh) cho tôi. Tôi chỉ cần thêm những điều sau đây vào pom.xml trong dự án Maven của tôi:

<dependency> 
     <groupId>com.googlecode.owasp-java-html-sanitizer</groupId> 
     <artifactId>owasp-java-html-sanitizer</artifactId> 
     <version>20150501.1</version> 
    </dependency> 

Kiểm tra here để phát hành mới nhất.

Sau đó, tôi đã thêm chức năng này cho sanitization:

private String sanitizeHTML(String untrustedHTML){ 
     PolicyFactory policy = new HtmlPolicyBuilder() 
      .allowAttributes("src").onElements("img") 
      .allowAttributes("href").onElements("a") 
      .allowStandardUrlProtocols() 
      .allowElements(
      "a", "img" 
      ).toFactory(); 

     return policy.sanitize(untrustedHTML); 
    } 

More thẻ có thể được bổ sung bằng cách mở rộng dấu phẩy tham số được phân định trong phương pháp allowElements.

Chỉ cần thêm dòng này trước khi đi qua các đậu tắt để lưu dữ liệu:

bean.setHtml(sanitizeHTML(bean.getHtml())); 

Vậy là xong!

Đối với logic phức tạp hơn, thư viện này rất linh hoạt và có thể xử lý việc thực hiện vệ sinh tinh vi hơn.

Các vấn đề liên quan