ASP.NET thực hiện các biện pháp đối phó chuẩn bị yêu cầu liên trang web (XSRF/CSRF) trên lõi

Trang Cập Nhật :
Ngày tạo trang :

Môi trường

Visual Studio-giường
  • Visual Studio 2019
ASP.NET lõi
  • 3,0
  • 3,1

Forgeri yêu cầu Cross-Site là gì?

Giả mạo yêu cầu trên trang web (CSRF/XSRF) là dành cho những người được xử lý chỉ trong trang web quan tâm. Một cuộc tấn công vào một lỗ hổng bảo mật thực hiện như một quá trình Cập Nhật từ một trang web bên ngoài.

Ví dụ: giả sử bạn có khả năng đăng nhận xét trên trang web. Thông thường, tôi nghĩ rằng bạn sẽ đăng bài bằng cách nhập một bình luận từ trang web, Quy trình gửi này thường được sử dụng để ném dữ liệu vào URL mục tiêu.

Do đó, nếu bạn gửi dữ liệu tương tự đến URL từ một người khác với trang web mục tiêu, Đó là điều tương tự bạn đăng.

Nếu chỉ có một kẻ tấn công sẽ làm điều này, nó sẽ không phải là một mối đe dọa. Điều đáng sợ về CSRF là kẻ tấn công có thể xây dựng các trang web giả mạo hoặc nhúng các URL ẩn trong trang web. Đó là nơi người khác vô tình truy cập nó và trở thành kẻ tấn công.

Tôi sẽ không đi sâu vào đây, vì vậy hãy tìm hiểu thêm về forgeri yêu cầu qua trang web.

ASP.NET Core kết hợp này countermeasure vào khuôn khổ.

Kiểm tra yêu cầu qua trang web giả mạo để làm việc

Hãy thử xem quá trình Cập Nhật thực sự được thực hiện từ các trang web bên ngoài hoặc các công cụ.

Index. cshtml tạo một biểu mẫu nhập liệu gửi văn bản bạn đã nhập vào máy chủ. Sau đó, nơi viewdata để máy chủ Hiển thị các thông điệp mà bạn đã tạo ra để phù hợp với văn bản đầu vào.

Index. cshtml

@{
  ViewData["Title"] = "Home Page";
}

<div class="text-center">
  <h1 class="display-4">Welcome</h1>
  <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<form method="post">
  <input type="text" name="text" />
  <button type="submit">送信</button>
</form>

<p>@ViewData["Message"]</p>

Phía máy chủ HomeController.cs xử trí văn bản đã gửi và kết quả đầu ra theo dõi Visual Studio. Đặt cùng một văn bản với ViewData để nó có thể được hiển thị cho khách hàng.

HomeController.cs

public class HomeController : Controller
{
  // 省略

  [HttpPost]
  public IActionResult Index(string text)
  {
    System.Diagnostics.Trace.WriteLine($"「{text}」が入力されました。");
    ViewData["Message"] = $"「{text}」が入力されました。";
    return View();
  }

  // 省略
}

Cố gắng thực hiện chức năng bạn vừa tạo trong các bước bình thường. Khi bạn chạy gỡ lỗi và màn hình xuất hiện, nhập văn bản và nhấp vào nút Submit.

Văn bản đã xử lý xuất hiện trên màn hình như mong đợi.

Vì nó cũng là đầu ra theo dõi, cửa sổ Visual Studio ra cũng hiển thị văn bản. Trong thực tế, chúng tôi làm những việc như đăng ký dữ liệu đầu vào trong một cơ sở dữ liệu, nhưng chúng tôi sẽ không để đơn giản hóa mã ở đây.

Bây giờ, cố gắng truy cập vào chương trình từ bên ngoài các trang web mục tiêu trong khi gỡ lỗi và chạy. Để đơn giản, tôi sẽ đăng bài bằng cách sử dụng một công cụ gọi là Visual Studio code. Nếu bạn có thể gửi POST, bạn có thể sử dụng các công cụ khác hoặc xây dựng một chương trình trang web khác cho cuộc tấn công.

Khi bạn cài đặt phần mở rộng được gọi là khách hàng còn lại trong Visual Studio mã, Bạn có thể sử dụng một tính năng cho phép bạn dễ dàng kiểm tra hoạt động của REST API chỉ bằng cách mở tệp. http.

Khi bạn tạo một tệp. http tương tự như sau trong tệp văn bản, và sau đó mở tệp trong Visual Studio mã, Bạn có thể gửi GET hoặc POST bằng cách nhấp vào gửi yêu cầu.

Nếu bạn tạo dữ liệu POST sau đây, bạn sẽ được gửi gần như cùng một lượng dữ liệu khi bạn gõ văn bản trên màn hình và nhấn nút Submit. (Số cổng localhost phải giống với môi trường thực hiện.)

RestTest. http://www.restTest.http

### Form で POST 送信
POST https://localhost:44372/home/index HTTP/1.1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="text"

なんらかのテキスト
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Khi bạn gửi nó, bạn có thể thấy rằng các máy chủ đang nhận được văn bản và xử lý nó.

Visual Studio mã có thể nhận được kết quả. Nếu bạn xem xét kỹ hơn mã kết quả, bạn có thể thấy rằng bộ giá trị cho ViewData được hiển thị. (Nó được hiển thị trong Unicode, nhưng văn bản được hiển thị đúng nếu xem trong trình duyệt web.)

Địa chỉ qua trang web yêu cầu forgeri lỗ hổng bảo mật

Như tôi đã đề cập ở phần đầu, ASP.NET Core kết hợp các biện pháp chống lại các yêu cầu qua trang web giả mạo trong khuôn khổ. Một biện pháp phổ biến là phát hành một mã thông báo duy nhất cho khách hàng trước trên màn hình yêu cầu đăng, v.v. Bạn không cần phải chấp nhận xử lý trừ khi bạn ném token vào máy chủ.

Tất nhiên, nếu bạn truy cập URL trực tiếp từ một trang web bên ngoài, mã thông báo là không xác định và sẽ không chấp nhận xử lý.

Trước tiên, tôi muốn nói về việc phát hành token cho khách hàng (HTML), nhưng thực tế là khuôn khổ là không thể làm điều này. Sẽ đi. Nếu bạn chỉ định một phương pháp POST trong thẻ biểu mẫu, bạn có thể kết hợp các tham số token vào HTML mà không được phép.

Trong HTML dưới đây, nó là tên nhập = "__RequestVerificationToken" loại = "ẩn". Điều này được gửi đến máy chủ với nhau khi nhấn nút gửi. Bằng cách này, nó không được gắn thêm bằng phương pháp GET.

Ở phía máy chủ, Dịch vụ Startup.cs. AddControllersWithViews phương pháp tùy chọn. Bộ lọc để Autovalidateantiforgerytokenthuộc tính, tất cả các hành động Kiểm tra mã thông báo này được tự động thêm vào (để được chính xác chỉ các phương pháp HTTP POST, PUT, PATCH, và DELETE).

Nếu bạn muốn thêm ràng buộc này chỉ cho các hành động cụ thể, không phải tất cả các hành động, mỗi bộ điều khiển, mỗi hành động Cũng có thể thiết lập.

Ngược lại, nếu bạn muốn áp đặt các hạn chế về hầu hết các hành động, nhưng bạn muốn loại trừ các hành động cụ thể, Nếu bạn đặt thuộc tính Ignoreantiforgerytoken cho bộ điều khiển và hành động, đó là OK.

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews(options =>
  {
    // 全ての「POST, PUT, PATCH, DELETE」アクションに自動で ValidateAntiForgeryToken を付与。
    // 個別に除外したい場合は「IgnoreAntiforgeryToken」属性を指定すること
    // API では HTML 側にトークンを発行できないのでコントローラーに「IgnoreAntiforgeryToken」を指定する必要がある。
    options.Filters.Add(new Microsoft.AspNetCore.Mvc.AutoValidateAntiforgeryTokenAttribute());
  });
}

Hãy xem cách nó hoạt động. Trước hết, quá trình truyền tải được thực hiện từ màn hình bình thường.

Kết quả được phản ánh trên màn hình như mong đợi.

Nó cũng là đầu ra để theo dõi.

Bây giờ, chúng ta hãy cố gắng truy cập nó từ bên ngoài.

Truy cập Ed, nhưng yêu cầu Bad đã được trả lại. Đó là một kết quả khác nhau hơn khi bạn không dùng các biện pháp. Nó được hiểu rằng nó được bảo vệ bởi vì nó không phải là đầu ra để theo dõi.

Tóm tắt

Thời gian này tôi đã cố gắng để thực hiện các biện pháp chống lại forgeri yêu cầu qua trang web. Nó đã được rất dễ dàng để thực hiện bởi vì nó đã được xây dựng vào khuôn khổ.

Xây dựng một trang web đòi hỏi nhiều lỗ hổng hơn CSRF. Bạn có thể kiểm tra những gì hiện có, hoặc bạn có thể sử dụng các công cụ như OWASP để kiểm tra các lỗ hổng trong trang web của bạn.