|
|
Zeile 13: |
Zeile 13: |
| Der Evaluator prüft, ob alle Eingaben aus nicht vertrauenswürdigen Quellen vor ihrer Verwendung dem Stand der Technik entsprechend geprüft werden. Eingaben meinen jegliche Art von Daten, die in die Anwendung hineinfließen. Das sind zum Beispiel Nutzereingaben, Eingaben aus Drittanbieterkomponenten etc. | | Der Evaluator prüft, ob alle Eingaben aus nicht vertrauenswürdigen Quellen vor ihrer Verwendung dem Stand der Technik entsprechend geprüft werden. Eingaben meinen jegliche Art von Daten, die in die Anwendung hineinfließen. Das sind zum Beispiel Nutzereingaben, Eingaben aus Drittanbieterkomponenten etc. |
| == Lösungsansätze == | | == Lösungsansätze == |
| === Implementierung ===
| |
| ==== Best Practices und Standards ====
| |
| ;Input Validation
| |
| :;Whitelisting Validation
| |
| :Whitelisting Validation ERLAUBT nur eine gewisse Palette an Eingaben, die der Applikation bereits bekannt sind. Gemäß der OWASP gilt Whitelisting Validation als als empfohlener Minimalansatz [https://owasp-top-10-proactive-controls-2018.readthedocs.io/en/latest/c5-validate-all-inputs.html#whitelisting-vs-blacklisting].
| |
| <syntaxhighlight lang="python" style="border: 3px dashed blue;">
| |
| # Python
| |
| # Definiere eine Funktion für die Whitelisting-Validierung
| |
| def validate_input(input_value):
| |
| # Definiere eine Liste von erlaubten Zeichen
| |
| whitelist = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
| |
|
| |
| # Überprüfe, ob alle Zeichen in der Eingabe in der Whitelist enthalten sind
| |
| for char in input_value:
| |
| if char not in whitelist:
| |
| return False
| |
|
| |
| # Rückgabe True, wenn die Eingabe den Validierungsregeln entspricht
| |
| return True
| |
|
| |
| # Beispielaufruf der Validierungsfunktion
| |
| input_value = "Hello123"
| |
| if validate_input(input_value):
| |
| print("Eingabe gültig.")
| |
| else:
| |
| print("Ungültige Eingabe.")
| |
| </syntaxhighlight>
| |
|
| |
| <br />
| |
|
| |
| :;Blacklisting Validation
| |
| :Blacklisting Validation besitzt eine Auswahl an Eingaben, die explizit VERBOTEN sind. Aufgrund der Fehleranfälligkeit dieser Methode rät die OWASP von der Blacklisting Validation ab [https://owasp-top-10-proactive-controls-2018.readthedocs.io/en/latest/c5-validate-all-inputs.html#whitelisting-vs-blacklisting].
| |
|
| |
| <syntaxhighlight lang="go" style="border: 3px dashed blue;">
| |
| // GOLang
| |
| package main
| |
|
| |
| import (
| |
| "fmt"
| |
| "strings"
| |
| )
| |
|
| |
| // Funktion zur Überprüfung von Eingaben anhand einer Blacklist
| |
| func isBlacklisted(input string, blacklist []string) bool {
| |
| for _, blacklistedWord := range blacklist {
| |
| if strings.Contains(input, blacklistedWord) {
| |
| return true
| |
| }
| |
| }
| |
| return false
| |
| }
| |
|
| |
| func main() {
| |
| // Definiere eine Blacklist von verbotenen Wörtern oder Zeichenfolgen
| |
| blacklist := []string{"spam", "malicious", "dangerous"}
| |
|
| |
| // Beispiel für eine Benutzereingabe
| |
| userInput := "This is a spam message."
| |
|
| |
| // Überprüfe, ob die Benutzereingabe auf der Blacklist steht
| |
| if isBlacklisted(userInput, blacklist) {
| |
| fmt.Println("Die Eingabe enthält verbotene Wörter.")
| |
| } else {
| |
| fmt.Println("Die Eingabe ist in Ordnung.")
| |
| }
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
|
| |
| <br />
| |
|
| |
| Allgemein sollte die Input Validation stets serverseitig angewendet werden, um Sicherheitsrisiken entgegenzuwirken.
| |
|
| |
| <br />
| |
|
| |
| ;Parameterized Queries
| |
| :Parameterized Queries sollen SQL-Injections vorbeugen, indem sie die SQL-Queries parametrisieren und Abfragen dadurch nicht direkt in die Datenbank gesendet werden. In Java kann dazu beispielsweise PreparedStatements genutzt werden [https://www.sciencedirect.com/topics/computer-science/input-validation#:~:text=Input%20validation%20is%20the%20process,standard%20defined%20within%20the%20application.].
| |
|
| |
| <syntaxhighlight lang="java" style="border: 3px dashed blue;">
| |
| // Java
| |
| import java.sql.Connection;
| |
| import java.sql.DriverManager;
| |
| import java.sql.PreparedStatement;
| |
| import java.sql.ResultSet;
| |
| import java.sql.SQLException;
| |
|
| |
| public class ParametrizedQueryExample {
| |
| public static void main(String[] args) {
| |
| // Verbindung zur Datenbank herstellen
| |
| try (Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password")) {
| |
| // SQL-Abfrage mit Platzhaltern für Parameter
| |
| String sql = "SELECT * FROM users WHERE username = ?";
| |
|
| |
| // Vorbereiten der parametrisierten Abfrage
| |
| try (PreparedStatement statement = connection.prepareStatement(sql)) {
| |
| // Wert für den Parameter setzen
| |
| statement.setString(1, "john_doe");
| |
|
| |
| // Ausführen der Abfrage
| |
| try (ResultSet resultSet = statement.executeQuery()) {
| |
| // Verarbeitung der Abfrageergebnisse
| |
| while (resultSet.next()) {
| |
| String username = resultSet.getString("username");
| |
| String email = resultSet.getString("email");
| |
| System.out.println("Username: " + username + ", Email: " + email);
| |
| }
| |
| }
| |
| }
| |
| } catch (SQLException e) {
| |
| e.printStackTrace();
| |
| }
| |
| }
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
|
| |
| <br />
| |
|
| |
| ;Input Sanitization
| |
| :Input Sanitization bezeichnet den Prozess der Bereinigung von Eingabedaten. Anders als die Validation zielt die Sanitization nicht darauf ab die Gültigkeit von Daten ab, sondern versucht die Sicherheit der Anwendung zu gewährleisten, indem potenziell gefährliche Eingaben neutralisiert werden [https://www.sciencedirect.com/topics/computer-science/input-validation#:~:text=Input%20validation%20is%20the%20process,standard%20defined%20within%20the%20application.].
| |
|
| |
| <syntaxhighlight lang="javascript" style="border: 3px dashed blue;">
| |
| // JavaScript
| |
| // Funktion zur Validierung und Bereinigung einer E-Mail-Adresse
| |
| function validateAndSanitizeEmail(email) {
| |
| // Validierung: Überprüfe, ob die E-Mail-Adresse ein gültiges Format hat
| |
| if (!isValidEmailFormat(email)) {
| |
| return null; // Ungültige E-Mail-Adresse, Rückgabe von null
| |
| }
| |
|
| |
| // Sanitization: Bereinige die E-Mail-Adresse von potenziell schädlichen Zeichen
| |
| var sanitizedEmail = sanitizeEmail(email);
| |
|
| |
| return sanitizedEmail;
| |
| }
| |
|
| |
| // Funktion zur Überprüfung des E-Mail-Formats
| |
| function isValidEmailFormat(email) {
| |
| // Einfache Überprüfung des E-Mail-Formats mit einem regulären Ausdruck
| |
| var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
| |
| return emailRegex.test(email);
| |
| }
| |
|
| |
| // Funktion zur Bereinigung einer E-Mail-Adresse von potenziell schädlichen Zeichen
| |
| function sanitizeEmail(email) {
| |
| // Verwendung von JavaScript's replace()-Funktion mit einem regulären Ausdruck,
| |
| // um potenziell schädliche Zeichen zu entfernen
| |
| var sanitizedEmail = email.replace(/[^\w\s@.-]/g, '');
| |
| return sanitizedEmail;
| |
| }
| |
|
| |
| // Beispielaufruf der Validierungs- und Bereinigungsfunktion für eine E-Mail-Adresse
| |
| var userInputEmail = "example@mail.com<script>alert('XSS');</script>";
| |
| var sanitizedEmail = validateAndSanitizeEmail(userInputEmail);
| |
| console.log("Sanitized Email: " + sanitizedEmail);
| |
| </syntaxhighlight>
| |
|
| |
| <br />
| |
|
| |
| ==== Tools ====
| |
| ;Escape Untrusted Data
| |
| :Escape Untrusted Data bezieht sich vor Allem auf den Schutz vor Cross-Site-Scripting (XSS). Hierbei ist es wichtig potenziell gefährliche Zeichen oder Symbole aus der Applikation zu entfernen oder zu maskieren. Dabei können eine Vielzahl an guten Frameworks oder Bibliotheken helfen:
| |
| <br />
| |
| :::: {|class:"wikitable" border="1"
| |
| | Name || Technologie
| |
| |-
| |
| | [https://owasp.org/www-project-enterprise-security-api/ OWASP ESAPI (Enterprise Security API)] || Java & JavaScript
| |
| |-
| |
| | [https://github.com/cure53/DOMPurify DOMPurify] || JavaScript
| |
| |-
| |
| | [https://www.npmjs.com/package/helmet Helmet] || JavaScript
| |
| |-
| |
| | [http://htmlpurifier.org/ HTMLPurifier] || PHP
| |
| |-
| |
| | [https://content-security-policy.com/ Content Security Policy (CSP)] || Security Header
| |
| |-
| |
| |}
| |
|
| |
| <br />
| |
|
| |
| ;[https://semediwiki.labs.inf.fh-dortmund.de/index.php/O.Arch_9 Security Headers]
| |
| :Security Headers sind HTTP-Header, die auf Webseiten und Webanwendungen verwendet werden, um die Sicherheit und den Schutz vor verschiedenen Arten von Angriffen und Sicherheitslücken zu verbessern. Sie bieten eine wichtige Sicherheitsebene, um Benutzer und Daten vor Bedrohungen zu schützen [https://www.tutkit.com/de/blog/200-security-headers-fuer-deine-website-gut-fuer-sicherheit-und-seo].
| |
|
| |
| <br />
| |
|
| |
| == Siehe auch ==
| |
|
| |
| [https://semediwiki.labs.inf.fh-dortmund.de/index.php/O.Arch_9 Arch_9]
| |
|
| |
|
| == Weblinks == | | == Weblinks == |
| * [https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html OWASP Validation CheatSheet]
| |
| * [https://cheatsheetseries.owasp.org/cheatsheets/HTTP_Headers_Cheat_Sheet.html OWASP Header CheatSheet]
| |
| * [https://developer.android.com/privacy-and-security/security-tips Android Security Tips]
| |
|
| |
|
| == Ressourcen und Einzelnachweise == | | == Ressourcen und Einzelnachweise == |
| [https://www.sciencedirect.com/topics/computer-science/input-validation#:~:text=Input%20validation%20is%20the%20process,standard%20defined%20within%20the%20application. Justin Clarke: SQL Injection Attacks and Defense ] Clarke, J. (2009). SQL Injection Attacks and Defense. Elsevier Inc. [ISBN 978-1-59749-424-3]
| |
|
| |
| [https://wiki.sei.cmu.edu/confluence/display/java/Input+Validation+and+Data+Sanitization Robert Seacord: Input Validation and Data Sanitization] Seacord, R. (Manager). (2015, April 28). Input Validation and Data Sanitization. Abrufdatum: 30.04.2024.
| |
|
| |
|
| [https://owasp-top-10-proactive-controls-2018.readthedocs.io/en/latest/c5-validate-all-inputs.html C5: Validate All Inputs] C5: Validate All Inputs, aufgerufen am 07.05.2024 | | [[Category:Pruefaspekt]] |
| | [[Category:CHECK]] |