Thiết lập An Toàn Asp.Net MVC.

By
Advertisement
Trong bài viết này mình nêu một số điểm mình biết để hạn chế bị Hacker tấn công. Các hiệu chỉnh này tuy nhỏ nhưng có thể giúp bạn kha khá thứ trong nhiều trường hợp, tránh được các lỗi an ninh cho website.

1. Cấu hình trang cho lỗi:


Bạn có chắc là trang Bạn code ra không có lỗi không? Bạn lấy căn cứ nào cho niềm tin đó? Vậy khi trang gặp lỗi mà Bạn chưa tìm ra thì rất có thể sẽ bị người khác tận dụng mà tấn công. Tốt nhất là cấu hình toàn cục, khi gặp lỗi không hoạt động bình thường thì ném ra trang lỗi, tất nhiên là Bạn phải ghi log để lâu lâu vào xem kiếm việc mà làm.

Giải pháp:

- Cấu hình "Custom Error page" cho  file "web.config".
Như trong hình trên thì khi gặp lỗi sẽ tự động chuyển sang trang Error.htm.
Nội dung file Error.html như thế nào thì bạn tự soạn nhé vì chỉ cần html đơn giản thôi.

2. Cross-Site Request Forgery (CSRF)

CSRF ( Cross Site Request Forgery) là kĩ thuật tấn công bằng cách sử dụng quyền chứng thực của người sử dụng đối với 1 website khác, Có thể ví dụ đơn giản là, website của ta bị lỗi này, Nạn nhân tức người sd đã đăng nhập vào website của chúng ta, hacker gửi 1 email chứa đường link lừa đảo thông qua email cho nạn nhân, Nạn nhân vô tình click vào link lừa đảo, hacker có được thông tin session của website chúng ta của Nạn nhân mà nạn nhân không biết, hoặc chúng lấy thêm vài thông tin khác nữa như cookie..., hacker dùng thông tin này làm n thứ[ăn cắp thông tin, lừa đảo, spam....]=> Nạn nhân lãnh đủ vì website chúng ta). Các ứng dụng web hoạt động theo cơ chế nhận các câu lệnh HTTP từ người sử dụng, sau đó thực thi các câu lệnh này. Cái lỗi này trên PHP thì ghê gớm nhưng trên .Net thì giải quyết cực kỳ đơn giản.

Giải pháp :
- Tất cả các form trên View thêm vào @Html.AntiForgeryToken().
- Thên Annotation [ValidateAntiForgeryToken] vào các Method tương ứng trong controller.

3. Cross-Site Scripting (XSS) attacks

Cross-site Scripting (XSS) là lỗ hổng cho phép hacker có thể chèn những đoạn mã client-script (thường là Javascript hoặc HTML) vào trang web, khi người dùng vào những trên web này, mã độc sẽ được thực thi trên máy của nạn nhân.

Mặc định thì Asp.net sẽ tự động check cho Bạn, nhưng nếu Bạn muốn làm bằng tay hoặc cấu hình cho field cho người dùng nhập HTML thì có thể làm như sau:

Giải Pháp: bạn có thể chọn 1 trong các giải pháp sau được chia thành 2 nhóm:
1.  Nhóm xử lý trên Controller:
   a. sử dụng annotation ValidateInput:

   b. Sử dụng thư viện AntiXSS để lọc trên controller:
Bạn dung Nuget để cài thêm thư viện AntiXSS, trong controller bạn cần lọc field nào thì dùng lệnh Sanitizer.GetSafeHtmlFragment để lọc.
Với thư viện AntiXSS này bạn có thể dùng như module, Bạn làm theo ảnh sau sẽ được.
2. Nhóm cấu hình trên entity object:
a. Dùng Annotation [AllowHtml]

b. Dùng Regular Expression
Mấy cái này dùng chung với nhau được hết nha.

4. Upload shell

Có thể ví dụ đơn giản như thay vì upload 1 ảnh, hacker up lên server của chúng ta một tệp có thể thực thi thông qua trình duyệt, ví dụ upload 1 trang razor có chứa mã độc thực thi trên server chẳng hạn.

Giải pháp:
- Giới hạn đuôi file có thể tải lên ví dụ bạn dùng để up ảnh thì chỉ cho phép các ext như : bmp, jpeg, png, .. Hay upload document thì các fiel như : xls, xlsx, doc, docx, pdf ....
- Giới hạn dung lượng file upload.
- Kiểm tra xem thử các byte đặc trưng của file có đúng với  phần mở rộng hay không. Cái này để tránh trường hợp file abc.cshtml bị đổi đuôi thành abc.txt chẳng hạn, trong đó đuôi txt ta cho phép tải lên. Phương pháp này kiểm tra xem file đặc trưng của tệp txt có trùng với file đặt trưng của file abc.txt hay không !.
Mình ví dụ một vài byte đầu tiên header của các tệp ảnh có đặc trưng :
byte[] chkjpg = { 255, 216, 255, 224 };
byte[] chkbmp = { 66, 77 };
byte[] chkegif = { 71, 73, 70, 56 };
byte[] chkpng = { 137, 80, 78, 71 };

5. Giấu thông tin phiên bản

Phiên bản ở đây có thể hiểu là phiên bản của .net framework, phiên bản của máy chủ server ví dụ IIS6 hay II7, phiên bản của MVC framework nói chung là các properties thể hiện số phiên bản trong header khi website trả về cho trình duyệt. Cái này thì hack cái gì?? :D 

Bạn thử nghĩ vấn đề sau: Các chuyên gia của M$ đã phát hành bản vá cho IIS7.5 nhưng mà bạn không cập nhật bản vá, Hacker sẽ tấn công vào webserver của bạn thông qua lỗi đó, vì đã có bản vá nên lỗi đó được miêu tả rất rõ ràng trên các website an ninh. Giờ thì hiểu rồi nhé.

Giải pháp:

1. Trong Global.asax thêm dòng sau vào trước khi thoát hàm Application_start():
MvcHandler.DisableMvcResponseHeader = true
2. Cũng trong Global.asax thêm method Application_PreSendRequestHeaders()
protectedvoidApplication_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");           //Remove Server Header  
Response.Headers.Remove("X-AspNet-Version"); //Remove X-AspNet-Version Header
}
3. File Web.Config cấu hình như sau:
4. hết rồi bồ tèo.

6. Chống SQL Injection

Cái lỗi này quá nổi tiếng rồi, giờ thì ta làm sao đây:

Giải pháp:
- Kiểm tra giá trị đầu vào, Tốt nhất là các trường cho nhập liệu nên dùng Regex để chơi.
- Đối với CSDL dùng user có quyền hành tối thiểu thôi, đừng chơi user administrator khi release.
- Sử dụng mấy cái ORM thông dụng hiện nay như EF, Dapper, InsignDB...
- Nếu mà không dùng ORM thì truy vấn SQL thông qua parameter, dùng store procedure là ăn chắc.

7. Mã hóa thông tin khi truyền tải

Ví dụ: Người dùng gửi thông tin đăng nhập từ client lên server và thông tin pwd không được mã hóa. hacker dùng phần mềm bắt gói tin, bắt các gói đi qua một router và bắt hết chúng=> đọc được pwd lẫn username vì chúng đi theo bộ.

Giải pháp:
- Cách tốt nhất hiện nay là cài chứng chỉ SSL (Secure Sockets Layer). Tham khảo bài viết Enabling SSL on IIS 7.0 Using Self-Signed Certificates
- với pwd: Dùng AntiForgeryToken để mã hóa pwd sau khi mã hóa bằng thuật toán mã hóa ví dụ (MD5, SHA256, SHA384, SHA512, Aes,DES,RC2,Rijndael,TripleDES, DSA, ECDiffieHellman, ECDsa, RSA ....- chú ý tốc độ). lên server sẽ lấy token mã hóa với dữ liệu trong db. So sánh cho ra kết quả.
- Không chứa dữ liệu nhạy cảm không mã hóa trong db.

8. Tấn công chuyển hướng

Loại tấn công này có dạng như sau :

Mình không phải là author hay quản trị viên của sinhvienit.net. Vui lòng đừng hiểu nhầm.

Giải pháp:
- Nếu chuyển hướng ra ngoài như trên thì mình chưa biết giải pháp nào hữu hiệu.
- Nếu chuyển hướng local thì chỉ cần dùng function RedirectToLocalAction trong lớp controller là được.

9. Chống ăn cắp Session.

Trước đây mình nghĩ :
Session.Abandon();
Session.Clear();
Session.RemoveAll();
Thế là đủ nhưng mà sau khi một Bạn check cái cookie của website của mình thì phát hiện ra mấy anh chàng Cookies["ASP.NET_SessionId"] và Cookies["AuthenticationToken"] vẫn còn. Hic hic

Thôi thì đành làm tạm:

if (Request.Cookies["ASP.NET_SessionId"] != null)
    {
Response.Cookies["ASP.NET_SessionId"].Value = string.Empty;
Response.Cookies["ASP.NET_SessionId"].Expires = DateTime.Now.AddMonths(-10);
    }
if (Request.Cookies["AuthenticationToken"] != null)
    {
Response.Cookies["AuthenticationToken"].Value = string.Empty;
Response.Cookies["AuthenticationToken"].Expires = DateTime.Now.AddMonths(-10);
    }
TO BE CONTINUE

Lời kết

Dù Bạn có làm gì đi nữa chúng nó vẫn DDOS được. Nên các phương pháp chỉ là hạn chế, không phải là tất cả. Chúc vui nếu Bạn bị hack, vì bị hack mới biết mình thiếu xót như thế nào và hy vọng trúng thằng hack có tâm.

Thân ái.












0 blogger:

Đăng nhận xét