Ngăn chặn XSS trong ASP.NET
Làm thế nào để ngăn chặn XSS attack trong ứng dụng trên nền tảng ASP.NET ? ASP.NET cung cấp sẵn những khả năng này và chúng ta có thể tùy biến nó theo yêu cầu của ứng dụng. Bài viết này giới thiệu các steps đảm bảo input từ người dùng là an toàn cho ứng dụng.
Giao diện nhập cơ bản
Trong form này có 2 trường cơ bản, một trường Message cho phép nhập freetext, và một trường số.
Khi Message không chứa mã HTML, form như sau:

Nhập Message có mã HTML
Giả sử yêu cầu của ứng dụng là cho phép user nhập “rich text”, ví dụ:

ASP.NET kiểm tra dữ nhiệu submit lên server và blocks request

Tùy biến để cho phép server chấp nhận rich text HTML
Có 2 lựa chọn cho phép làm việc này: sử dụng attribute AllowHtml hoặc ValidationInput,
nhưng lựa chọn #2 sẽ turn-off validation trên server. Vì vậy nên lựa chọn AllowHtml trong nhiều trường hợp có hiệu quả hơn.
(xem thay đổi)
[AllowHtml]
public string Message { get; set; }
Kết quả sẽ là

Khả năng bị tấn công XSS
Việc cho phép mã JavaScript được nhập vào ứng dụng có nguy cơ bị tấn công XSS.
Trên Chrome V45, trình duyệt hiểu và ngăn chặn được nguy cơ này.
-protect-us.png)
Nhưng trên các trình duyệt khác thì không. Hơn nữa ứng dụng phía server cần xử lý được rủi ro này

Xử lý trên server
Solution 1
Việc xử lý thực hiện trên từng trường dữ liệu có nguy cơ bị XSS
-
Cài Package AntiXSS vào ứng dụng
-
Gọi function xử lý trường nhập dữ liệu chứa mã HTML, các thẻ HTML không an toàn sẽ bị loại bỏ. (xem thay đổi)
var safeHtml = Sanitizer.GetSafeHtmlFragment(item.Message);

Solution 2
Xử lý một cách tự động thông qua một ModelBinder
-
Cài package RabbitWebMvc vào ứng dụng
-
Sử dụng
DefaultBinderlàSafeHtmlModelBinder
ModelBinders.Binders.DefaultBinder = new SafeHtmlModelBinder();