Kurse:Model Binding und Schwachstellen:Hauptseite: Unterschied zwischen den Seiten

Aus ahrensburg.city
(Unterschied zwischen Seiten)
Zur Navigation springen Zur Suche springen
Die Seite wurde neu angelegt: „== Model Binding == '''Model Binding''' ist eine Funktion von ASP.NET Core, die Werte aus HTTP-Anfragen liest und sie als Argumente an die Aktionsmethode übergibt. === QueryString vs. RouteData === ==== [FromQuery] und [FromRoute] ==== '''[FromQuery]''' <syntaxhighlight lang="csharp"> // liest den Wert nur aus dem Query-String public IActionResult ActionMethodName( [FromQuery] type parameter) { } </syntaxhighlight> '''[FromRoute]''' <syntaxhighlight l…“
 
// via Wikitext Extension for VSCode
 
Zeile 1: Zeile 1:
== Model Binding ==
==Schwachstellen==
'''Model Binding''' ist eine Funktion von ASP.NET Core, die Werte aus HTTP-Anfragen liest und sie als Argumente an die Aktionsmethode übergibt.
===Sprachmodell===
 
* [https://airiskdatabase.com AI Risk Database] – Eine Datenbank mit Risiken und Schwachstellen im Bereich Künstliche Intelligenz.
=== QueryString vs. RouteData ===
* [https://github.com/advisories GitHub CVE & Security Advisories] – Offizielle Sicherheitswarnungen und CVE-Meldungen von GitHub für Open-Source-Projekte.
==== [FromQuery] und [FromRoute] ====
* [https://cve.mitre.org/ MITRE CVE Database] – Zentrale Datenbank für öffentlich bekannte Schwachstellen (Common Vulnerabilities and Exposures, CVE).
 
* [https://nvd.nist.gov/ National Vulnerability Database (NVD)] – Die US-amerikanische nationale Datenbank für Schwachstellen, gepflegt vom NIST.
'''[FromQuery]'''
* [https://www.cvedetails.com/ CVE Details] – Eine benutzerfreundliche Übersicht und Analyse von CVE-Einträgen.
<syntaxhighlight lang="csharp">
* [https://www.exploit-db.com/ Exploit Database] – Sammlung von Exploits und Proof-of-Concept-Code für bekannte Schwachstellen.
// liest den Wert nur aus dem Query-String
* [https://www.securityfocus.com/vulnerabilities SecurityFocus Vulnerability Database] – Archiv von Schwachstellen und Sicherheitsmeldungen.
public IActionResult ActionMethodName( [FromQuery] type parameter)
* [https://www.openwall.com/lists/oss-security/ Open Source Security (oss-security)] – Mailingliste und Archiv zu Schwachstellen in Open-Source-Software.
{
* [https://vuldb.com VulDB] – Community-basierte Schwachstellendatenbank mit aktuellen Informationen und Analysen.
}
* [https://www.zerodayinitiative.com/advisories/published/ Zero Day Initiative Advisories] – Veröffentlichte Schwachstellen und Exploits aus dem Zero Day Initiative Programm.
</syntaxhighlight>
 
'''[FromRoute]'''
<syntaxhighlight lang="csharp">
// liest den Wert nur aus den Routenparametern
public IActionResult ActionMethodName( [FromRoute] type parameter)
{
}
</syntaxhighlight>
 
=== Modelle ===
Ein '''Modell''' ist eine Klasse, die die Struktur von Daten (als Eigenschaften) darstellt, die Sie von der Anfrage empfangen und/oder an die Antwort senden möchten.
Auch bekannt als '''POCO''' (Plain Old CLR Objects).
 
==== Modell ====
<syntaxhighlight lang="csharp">
class ClassName
{
  public type PropertyName { get; set; }
}
</syntaxhighlight>
 
=== form-urlencoded und form-data ===
==== form-urlencoded (Standard) ====
'''Request-Header'''
<pre>
Content-Type: application/x-www-form-urlencoded
</pre>
 
'''Request-Body'''
<pre>
param1=value1&param2=value2
</pre>
 
==== form-data ====
'''Request-Header'''
<pre>
Content-Type: multipart/form-data
</pre>
 
'''Request-Body'''
<pre>
--------------------------d74496d66958873e
Content-Disposition: form-data; name="param1"
value1
--------------------------d74496d66958873e
Content-Disposition: form-data; name="param2"
value2
</pre>
 
=== Modellvalidierung ===
<syntaxhighlight lang="csharp">
class ClassName
{
  [Attribute] // wendet eine Validierungsregel auf diese Eigenschaft an
  public type PropertyName { get; set; }
}
</syntaxhighlight>
 
==== ModelState ====
* '''IsValid''': Gibt an, ob mindestens ein Validierungsfehler vorliegt oder nicht (<code>true</code> oder <code>false</code>).
* '''Values''': Enthält den Wert jeder Modelleigenschaft mit der entsprechenden "Errors"-Eigenschaft, die eine Liste der Validierungsfehler dieser Modelleigenschaft enthält.
* '''ErrorCount''': Gibt die Anzahl der Fehler zurück.
 
==== Validierungsattribute ====
; [Required(ErrorMessage = "Wert")]
: Gibt an, dass der Eigenschaftswert erforderlich ist (darf nicht leer oder null sein).
 
; [StringLength(int maximumLength, MinimumLength = Wert, ErrorMessage = "Wert")]
: Gibt die minimale und maximale Länge (Anzahl der Zeichen) an, die in der Zeichenfolge zulässig ist.
 
; [Range(int minimum, int maximum, ErrorMessage = "Wert")]
: Gibt den minimal und maximal zulässigen numerischen Wert an.
 
; [RegularExpression(string pattern, ErrorMessage = "Wert")]
: Gibt das gültige Muster (regulärer Ausdruck) an.
 
; [EmailAddress(ErrorMessage = "Wert")]
: Gibt an, dass der Wert eine gültige E-Mail-Adresse sein muss.
 
; [Phone(ErrorMessage = "Wert")]
: Gibt an, dass der Wert eine gültige Telefonnummer sein muss. Bsp.: <code>(999)-999-9999</code> oder <code>9876543210</code>
 
; [Compare(string otherProperty, ErrorMessage = "Wert")]
: Gibt an, dass die Werte der aktuellen Eigenschaft und einer anderen Eigenschaft übereinstimmen müssen.
 
; [Url(ErrorMessage = "Wert")]
: Gibt an, dass der Wert eine gültige URL (Website-Adresse) sein muss. Bsp.: <code>http://www.example.com</code>
 
; [ValidateNever]
: Gibt an, dass die Eigenschaft nicht validiert werden soll (schließt die Eigenschaft von der Modellvalidierung aus).
 
=== Benutzerdefinierte Validierungen ===
<syntaxhighlight lang="csharp">
class ClassName : ValidationAttribute
{
  public override ValidationResult? IsValid(object? value, ValidationContext validationContext)
  {
    // return ValidationResult.Success;
    // [oder] return new ValidationResult("Fehlermeldung");
  }
}
</syntaxhighlight>
 
* '''ValidationAttribute''': Basisklasse für alle Validierungsattribute wie <code>RequiredAttribute</code>, <code>RegularExpressionAttribute</code>, <code>RangeAttribute</code>, <code>StringLengthAttribute</code>, <code>CompareAttribute</code> usw. Stellt Eigenschaften wie <code>ErrorMessage</code> & Methoden wie <code>Validate()</code>, <code>IsValid()</code> etc. bereit.
 
* '''ValidationContext''': Dient als Parameter für die <code>IsValid()</code>-Methode von benutzerdefinierten Validierungsattribut-Klassen. Stellt Eigenschaften wie <code>ObjectType</code>, <code>ObjectInstance</code> bereit.
 
==== Benutzerdefinierte Validierungen mit mehreren Eigenschaften ====
==== IValidatableObject ====
<syntaxhighlight lang="csharp">
class ClassName : IValidatableObject
{
  // Modelleigenschaften hier
  public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
  {
    if (Bedingung)
    {
      yield return new ValidationResult("Fehlermeldung");
    }
  }
}
</syntaxhighlight>
 
* '''IValidatableObject''': Basis-Interface für Modellklassen mit Validierung. Stellt eine Methode namens <code>Validate()</code> zur Verfügung, um Validierungslogik auf Klassenebene zu definieren. Die <code>Validate()</code>-Methode wird ausgeführt, nachdem alle Validierungen auf Eigenschaftsebene ausgeführt wurden; sie wird jedoch nicht ausgeführt, wenn mindestens eine Validierung auf Eigenschaftsebene einen Fehler ergibt.
 
* '''ValidationContext''': Dient als Parameter für die <code>Validate()</code>-Methode von Modellklassen, die <code>IValidatableObject</code> implementieren. Stellt Eigenschaften wie <code>ObjectType</code>, <code>ObjectInstance</code> bereit.
 
=== [Bind] und [BindNever] ===
==== [Bind] ====
<syntaxhighlight lang="csharp">
class ClassNameController
{
  public IActionResult ActionMethodName( [Bind(nameof(ClassName.PropertyName), nameof(ClassName.PropertyName) )]  ClassName parameterName)
  {
  }
}
</syntaxhighlight>
Das '''[Bind]'''-Attribut gibt an, dass nur die angegebenen Eigenschaften in die Modellbindung einbezogen werden sollen. Verhindert Over-Posting (das Senden von Werten an unerwartete Eigenschaften), insbesondere in "Create"-Szenarien.
 
==== [BindNever] ====
<syntaxhighlight lang="csharp">
class ModelClassName
{
  [BindNever]
  public type PropertyName { get; set; }
}
</syntaxhighlight>
Das '''[BindNever]'''-Attribut gibt an, dass die angegebene Eigenschaft NICHT in die Modellbindung einbezogen werden soll. Nützlich, wenn Sie weniger Eigenschaften von der Modellbindung ausschließen müssen.
 
=== [FromBody] ===
<syntaxhighlight lang="csharp">
// ermöglicht es den Input-Formattern, Daten nur aus dem Request-Body (als JSON, XML oder benutzerdefiniert) zu lesen
public IActionResult ActionMethodName( [FromBody] type parameter)
{
}
</syntaxhighlight>
 
=== Input-Formatter ===
 
=== Benutzerdefinierte Model-Binder ===
==== Benutzerdefinierter Model-Binder ====
<syntaxhighlight lang="csharp">
class ClassName : IModelBinder
{
  public Task BindModelAsync(ModelBindingContext bindingContext)
  {
    // liest den Wert aus der Anfrage
    bindingContext.ValueProvider.GetValue("FirstName");
    // gibt das Modellobjekt zurück, nachdem die Daten aus der Anfrage gelesen wurden
    bindingContext.Result = ModelBindingResult.Success(your_object);
  }
}
</syntaxhighlight>
 
* '''IModelBinder''': Basis-Interface für alle benutzerdefinierten Model-Binder. Stellt eine Methode namens <code>BindModelAsync</code> zur Verfügung, um die Logik für das Binden (Lesen) von Daten aus der Anfrage und das Erstellen eines Modellobjekts zu definieren, das als Parameter in der Aktionsmethode empfangen wird.
 
* '''ModelBindingContext''': Dient als Parameter für die <code>BindModelAsync()</code>-Methode von benutzerdefinierten Model-Binder-Klassen. Stellt Eigenschaften wie <code>HttpContext</code>, <code>ModelState</code>, <code>ValueProvider</code>, <code>Result</code> etc. bereit.
 
==== Benutzerdefinierte Model-Binder-Provider ====
<syntaxhighlight lang="csharp">
class ClassName : IModelBinderProvider
{
  public IModelBinder GetBinder(ModelBinderProviderContext providerContext)
  {
    // gibt den Typ der aufzurufenden benutzerdefinierten Model-Binder-Klasse zurück
    return new BinderTypeModelBinder(typeof(YourModelBinderClassName));
  }
}
</syntaxhighlight>
 
* '''IModelBinderProvider''': Basis-Interface für alle benutzerdefinierten Model-Binder-Provider. Stellt eine Methode namens <code>GetBinder</code> zur Verfügung, um den Typ der benutzerdefinierten Model-Binder-Klasse zurückzugeben.
 
* '''ModelBinderProviderContext''': Dient als Parameter für die <code>GetBinder()</code>-Methode von benutzerdefinierten Model-Binder-Provider-Klassen. Stellt Eigenschaften wie <code>BindingInfo</code>, <code>Services</code> etc. bereit.

Version vom 24. Juni 2025, 15:18 Uhr

Schwachstellen

Sprachmodell