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:

_config.yml

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ụ:

_config.yml

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

_config.yml

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à

_config.yml

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.

_config.yml

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

_config.yml

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

  1. Cài Package AntiXSS vào ứng dụng

  2. 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);

_config.yml

Solution 2

Xử lý một cách tự động thông qua một ModelBinder

  1. Cài package RabbitWebMvc vào ứng dụng

  2. Sử dụng DefaultBinderSafeHtmlModelBinder

ModelBinders.Binders.DefaultBinder = new SafeHtmlModelBinder();

References

Written on October 19, 2015