Cách khắc phục lỗ hổng ASP.NET

Để khắc phục lỗ hổng này người dùng cần kích hoạt tính năng <customErrors> của ASP.NET và cấu hình lại để bắt buộc các ứng dụng luôn luôn phải trả về cùng một thông báo lỗi, bất kể lỗi phát sinh từ đâu trên máy chủ.
Dưới đây là cách khắc phục mà các nhà phát triển ASP khuyến nghị.
Kích hoạt trên ASP.NET từ phiên bản V1.0 đến V3.5
Nếu bạn đang sử dụng các phiên bản ASP.NET 1.0, ASP.NET 1.1, ASP.NET 2.0, or ASP.NET 3.5… Hãy làm theo các bước sau đây để kích hoạt <customErrors> và đưa tất cả các thông báo lỗi về một trang thông báo duy nhất.
Bước 1. Biên tập lại trang gốc của ứng dụng dùng ASP.NET (thông thường là file “Web.Config”). Nếu file này không tồn tại, hãy tạo mới với tên gọi như trên trong thư mục gốc của ứng dụng.
Bước 2. Tạo mới hoặc sửa lại mục <customErrors> trong file web.config theo cú pháp sau đây:
     <configuration>      
        <system.web>
           <customErrors mode="On" defaultRedirect="~/error.html" />
        </system.web>      
     </configuration>
Sau đó bạn có thể thêm file “error.html” vào ứng dụng mà bạn muốn các thông điệp báo lỗi xuất hiện (có thể với bất kỳ nội dung nào mà bạn muốn). File thông báo này sẽ luôn luôn được hiển thị bất kỳ khi nào phát sinh lỗi trên các ứng dụng web của bạn.
Chú ý: Điều quan trọng là “customErrors” phải được thiết lập ở chế độ “Bật” (ON) và tất cả các lỗi sẽ được xử lý và dẫn đến trang thông báo lỗi “defaultRedirect”. Phải đảm bảo không có bất kỳ đoạn mã phụ <error> trong phần <customErrors> để tránh việc kẻ tấn công có thể phân biệt tại sao lỗi phát sinh trên máy chủ và ngăn cản việc rò rỉ thông tin. 

Kích hoạt trên ASP.NET từ phiên bản V3.5 SP1 đến ASP.NET 4.0
Bước 1: thao tác giống như với phần trên.
Bước 2: Tạo mới hoặc sửa phần <customErrors> trong file “web.config” theo cú pháp.  Chú ý là phải sử dụng chế độ redirectMode=”ResponseRewrite” trên .NET 3.5 SP1 và .NET 4.0:
     <configuration> 
        <system.web> 
          <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/error.aspx" /> 
        </system.web>      
</configuration>
Bước 3: Bạn có thể thêm phần Error.aspx vào ứng dụng của mình với thông điệp tùy chọn.
Bước 4: Microsoft khuyến nghị nhà quản trị nên thêm đoạn mã sau đây vào trang Page_Load() khi máy chủ xử  lý file Error.aspx nhằm thêm vào một đoạn “ngủ” ngắn và ngăn chặn các lỗi tiếp theo.
Nhà quản trị không cần đóng gói đoạn mã này vào ứng dụng và chỉ cần lưu file Error.aspx này vào thư mục trên máy chủ web-server.
VB code
<%@ Page Language="VB" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>
<script runat="server">
    Sub Page_Load()
        Dim delay As Byte() = New Byte(0) {}
        Dim prng As RandomNumberGenerator = New RNGCryptoServiceProvider()
     
        prng.GetBytes(delay)
        Thread.Sleep(CType(delay(0), Integer))
     
        Dim disposable As IDisposable = TryCast(prng, IDisposable)
        If Not disposable Is Nothing Then
            disposable.Dispose()
        End If
    End Sub
</script>
<html>
<head runat="server">
    <title>Error</title>
</head>
<body>
    <div>
        Sorry - an error occured
    </div>
</body>
</html>
C# code
<%@ Page Language="C#" AutoEventWireup="true" %>
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Threading" %>
<script runat="server">
   void Page_Load() {
      byte[] delay = new byte[1];
      RandomNumberGenerator prng = new RNGCryptoServiceProvider();
      prng.GetBytes(delay);
      Thread.Sleep((int)delay[0]);
     
      IDisposable disposable = prng as IDisposable;
      if (disposable != null) { disposable.Dispose(); }
    }
</script>
<html>
<head runat="server">
    <title>Error</title>
</head>
<body>
    <div>
        An error occurred while processing your request.
    </div>
</body>
</html>
Cách kiểm tra biện pháp khắc phục này đã hoạt động hay chưa
Sau khi đã áp dụng các biện pháp khắc phục như trên, Microsoft khuyến nghị nhà quản trị nên kiểm tra lại để đảm bảo <customErrors> đã được cấu hình đúng và hoạt động chính xác bằng cách gọi một địa chỉ có dạng
http://mysite.com/pagethatdoesnotexist.aspx
(ví dụ: http://ictnews.vn/trangkhongcothuc.aspx)

Nếu thông báo lỗi mà bạn vừa soạn thảo xuất hiện (bởi thực tế là trang mà bạn vừa gọi không có thực), có nghĩa cấu hình mà bạn vừa thiết lập đã hoạt động đúng. Nếu bạn chỉ thấy một thông báo lỗi thông thường của ASP.NET xuất hiện, có nghĩa là bạn đã bỏ sót một trong các bước trên.
Nguồn: ICTnews

Nhận xét

Bài đăng phổ biến từ blog này

Sử dụng cursors trong Oracle

Khắc phục lỗi An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

Web Service thao tác với cơ sở dữ liệu part 1