ASP.NET προστασία πλαστογραφίας αίτησης (XSRF/CSRF) σε αυτόν τον πυρήνα

Σελίδα ενημέρωση :
Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον

Οπτικό Στούντιο
  • Οπτικό Στούντιο 2019
ASP.NET πυρήνας
  • 3.0
  • 3.1

Τι είναι η αίτηση διασταύρωσης πλαστών;

Η παραχαράκτη αίτησης μεταξύ τοποθεσιών (CSRF/XSRF) είναι για εκείνους που υποβάλλονται σε επεξεργασία μόνο εντός του τόπου ενδιαφέροντος. Μια επίθεση σε ένα θέμα ευπάθειας που εκτελεί μια τέτοια διαδικασία ενημέρωσης από μια εξωτερική τοποθεσία.

Για παράδειγμα, ας υποθέσουμε ότι έχετε τη δυνατότητα να δημοσιεύσετε σχόλια σε έναν Ιστότοπο. Κανονικά, νομίζω ότι θα δημοσιεύσετε με την είσοδο σε ένα σχόλιο από το site, Αυτή η διαδικασία αποστολής χρησιμοποιείται συχνότερα για την απόρριψη δεδομένων στη διεύθυνση URL προορισμού.

Επομένως, εάν στείλετε παρόμοια δεδομένα στη διεύθυνση URL από κάποιον άλλο εκτός από την τοποθεσία προορισμού, Είναι η ίδια θεραπεία που δημοσιεύτηκε.

Αν μόνο ένας εισβολέας θα το έκανε αυτό, δεν θα ήταν απειλή. Το τρομακτικό πράγμα για CSRF είναι ότι οι επιτιθέμενοι μπορούν να οικοδομήσουν πλαστές τοποθεσίες ή να ενσωματώσετε κρυφές διευθύνσεις URL στην ιστοσελίδα. Είναι όπου κάποιος άλλος έχει πρόσβαση ακούσια σε αυτό και γίνεται εισβολέας.

Δεν θα υπεισέλθω σε βάθος εδώ, γι 'αυτό παρακαλώ μάθετε περισσότερα σχετικά με διατομεακή αίτηση πλαστογραφίας.

ASP.NET Πυρήνας ενσωματώνει αυτό το αντίμετρο στο πλαίσιο.

Έλεγχος πλαστογραφίας αίτησης μεταξύ τοποθεσιών για εργασία

Προσπαθήστε να δείτε εάν η διαδικασία ενημέρωσης εκτελείται στην πραγματικότητα από εξωτερικές τοποθεσίες ή εργαλεία.

Το index.cshtml δημιουργεί μια φόρμα εισόδου που στέλνει το κείμενο που πληκτρολογήσατε στο διακομιστή. Στη συνέχεια, τοποθετήστε δεδομένα προβολής, ώστε ο διακομιστής να εμφανίζει μηνύματα που έχετε δημιουργήσει ώστε να ταιριάζουν με το κείμενο εισόδου.

Ευρετήριο.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>

Το HomeController.cs διακομιστή επεξεργάζεται το απεσταλμένο κείμενο και το εκπαράγει σε μια ανίχνευση του Visual Studio. Ορίστε το ίδιο κείμενο σε ViewData, ώστε να μπορεί να εμφανιστεί στον υπολογιστή-πελάτη.

HomeController.cs

public class HomeController : Controller
{
  // 省略

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

  // 省略
}

Προσπαθήστε να εκτελέσετε τη λειτουργικότητα που μόλις δημιουργήσατε στα κανονικά βήματα. Όταν εκτελείτε τον εντοπισμό σφαλμάτων και εμφανίζεται η οθόνη, πληκτρολογήστε το κείμενο και κάντε κλικ στο κουμπί Υποβολή.

Το επεξεργασμένο κείμενο εμφανίζεται στην οθόνη όπως αναμένεται.

Επειδή είναι επίσης έξοδος στην ανίχνευση, το παράθυρο εξόδου του visual studio εμφανίζει επίσης κείμενο. Στην πραγματικότητα, κάνουμε πράγματα όπως η καταχώρηση δεδομένων εισόδου σε μια βάση δεδομένων, αλλά δεν πρόκειται να απλοποιήσουμε τον κώδικα εδώ.

Τώρα, προσπαθήστε να αποκτήσετε πρόσβαση στο πρόγραμμα έξω από την τοποθεσία προορισμού κατά τον εντοπισμό σφαλμάτων και την εκτέλεση. Για την απλότητα, θα ταχυδρομήσω μια θέση χρησιμοποιώντας ένα εργαλείο αποκαλούμενο οπτικό κώδικα στούντιο. Εάν μπορείτε να στείλετε post, μπορείτε να χρησιμοποιήσετε άλλα εργαλεία ή να δημιουργήσετε ένα άλλο πρόγραμμα τοποθεσίας για την επίθεση.

Όταν εγκαθιστάτε μια επέκταση που ονομάζεται πρόγραμμα-πελάτηREST στον κώδικα του Visual Studio, Μπορείτε να χρησιμοποιήσετε μια δυνατότητα που σας επιτρέπει να ελέγχετε εύκολα τη λειτουργία του REST API απλά ανοίγοντας το αρχείο .http.

Όταν δημιουργείτε ένα αρχείο .http παρόμοιο με το ακόλουθο σε ένα αρχείο κειμένου και, στη συνέχεια, ανοίγετε το αρχείο στον Κώδικα του Visual Studio, Μπορείτε να στείλετε GET ή POST κάνοντας κλικ στην επιλογή αποστολή αίτησης.

Εάν δημιουργήσετε τα ακόλουθα δεδομένα POST, θα σας αποσταλούν σχεδόν η ίδια ποσότητα δεδομένων που πληκτρολογείτε κείμενο στην οθόνη και πατήστε το κουμπί υποβολής. (Ο αριθμός θύρας Localhost πρέπει να είναι ίδιος με το περιβάλλον εκτέλεσης.)

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

Όταν το στέλνετε, μπορείτε να δείτε ότι ο διακομιστής λαμβάνει κείμενο και το επεξεργάζεται.

Ο Κώδικας του Visual Studio μπορεί να λάβει τα αποτελέσματα. Εάν ρίξετε μια πιο προσεκτική ματιά στον κώδικα αποτελεσμάτων, μπορείτε να δείτε ότι εμφανίζεται η τιμή που έχει οριστεί για το ViewData. (Εμφανίζεται στο Unicode, αλλά το κείμενο εμφανίζεται σωστά εάν προβάλλεται σε ένα πρόγραμμα περιήγησης στο Web.)

Διεύθυνση διατοποθεσιακή αίτηση πλαστογραφία ευπάθειας

Όπως ανέφερα στην αρχή, ASP.NET Core ενσωματώνει μέτρα κατά της διατομεακής πλαστογραφίας αιτημάτων στο πλαίσιο. Ένα κοινό μέτρο είναι να εκδώσει ένα μοναδικό διακριτικό για τον πελάτη εκ των προτέρων σε μια οθόνη που απαιτεί θέση, κλπ. Δεν χρειάζεται να αποδεχτείτε την επεξεργασία, εκτός αν ρίξετε το διακριτικό στο διακομιστή.

Φυσικά, εάν έχετε πρόσβαση στο URL απευθείας από μια εξωτερική τοποθεσία, το διακριτικό είναι άγνωστο και δεν θα δέχεται επεξεργασία.

Πρώτον, θα ήθελα να μιλήσω για την έκδοση μαρκών στον πελάτη (HTML), αλλά το γεγονός είναι ότι το πλαίσιο δεν είναι σε θέση να το κάνει αυτό. Θα πάω. Εάν καθορίσετε μια μέθοδο POST στο tag φόρμας, μπορείτε να ενσωματώσετε παραμέτρους διακριτικού σε HTML χωρίς άδεια.

Στο HTML παρακάτω, είναι το όνομα εισόδου = "__RequestVerificationToken" type = "κρυφό". Αυτό αποστέλλεται στο διακομιστή μαζί όταν πατηθεί το κουμπί αποστολής. Με την ευκαιρία, δεν επισυνάπτεται με τη μέθοδο GET.

Από την πλευρά του διακομιστή, Startup.cs υπηρεσίες. Επιλογές μεθόδου "Προσθήκη ελεγκτώνμε προβολές". Φίλτρα για Αυτόματο έγκυροαντιπλαστογράφοςΧαρακτηριστικό, όλες οι ενέργειες Αυτός ο διακριτικός έλεγχος προστίθεται αυτόματα (για να είμαστε ακριβείς μόνο οι μέθοδοι HTTP post, PUT, PATCH και DELETE).

Εάν θέλετε να προσθέσετε αυτόν τον περιορισμό μόνο σε συγκεκριμένες ενέργειες, όχι σε όλες τις ενέργειες, ανά ελεγκτή, ανά ενέργεια Είναι επίσης δυνατό να τεθεί.

Αντίθετα, εάν θέλετε να επιβάλετε περιορισμούς στις περισσότερες ενέργειες, αλλά θέλετε να εξαιρέσετε συγκεκριμένες Εάν ορίσετε το χαρακτηριστικό IgnoreAntiforgeryToken στο χειριστήριο και την ενέργεια, είναι εντάξει.

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());
  });
}

Ας δούμε πώς θα πάει. Πρώτα απ 'όλα, η διαδικασία μετάδοσης γίνεται από την οθόνη κανονικά.

Τα αποτελέσματα αντανακλώνται στην οθόνη όπως αναμενόταν.

Είναι επίσης έξοδος στο ίχνος.

Τώρα, ας προσπαθήσουμε να έχουμε πρόσβαση σε αυτό από έξω.

Πρόσβαση ed, αλλά κακή αίτηση επιστράφηκε. Είναι διαφορετικό αποτέλεσμα από όταν δεν λαμβάνεις μέτρα. Εννοείται ότι φυλάσσεται επειδή δεν είναι έξοδος στο ίχνος.

Περίληψη

Αυτή τη φορά προσπάθησα να εφαρμόσουν μέτρα κατά της διατοποθεσιακής αίτησης πλαστογραφίας. Ήταν πολύ εύκολο να εφαρμοστεί, διότι είχε ήδη ενσωματωθεί στο πλαίσιο.

Η δημιουργία μιας τοποθεσίας Web απαιτεί πολύ μεγαλύτερη ευπάθεια από το CSRF. Μπορείτε να ελέγξετε τι υπάρχει εκεί έξω ή μπορείτε να χρησιμοποιήσετε εργαλεία όπως το OWASP για να ελέγξετε για ευπάθειες στον ιστότοπό σας.