v2.5Sicherheit

Input Sanitization

Schütze deine Anwendung vor XSS, Path Traversal und anderen Injection-Angriffen durch konsequente Input-Bereinigung.

XSS Prevention

Obwohl Velisch durch JSON-APIs weniger anfällig für XSS ist, sollten Benutzereingaben bereinigt werden, wenn sie HTML enthalten könnten:

use security

fn saveComment(input: string) {
    // Entfernt gefährliche Tags wie <script>, <iframe> etc.
    let safeHtml = security.sanitizeHtml(input);
    
    db.save(Comment { text: safeHtml });
}

// Beispiel:
// Input:  "<script>alert('XSS')</script><p>Hallo</p>"
// Output: "<p>Hallo</p>"

Path Traversal Schutz

Verhindere Directory Traversal Angriffe (../../etc/passwd):

use security

@GET("/api/files/:filename")
fn getFile(filename: string): FileResponse {
    // Entfernt ../ und andere gefährliche Pfad-Komponenten
    let safePath = security.sanitizePath(filename);
    
    // safePath ist jetzt sicher für Dateizugriff
    let basePath = "/var/uploads/";
    return readFile(basePath + safePath);
}

// Beispiel:
// Input:  "../../../etc/passwd"
// Output: "etc/passwd" (../ entfernt)

SQL Injection Prävention

// SICHER: Parameter werden automatisch escaped
db.findMany(User, { name: userInput });

// SICHER: Parameterisierte Raw Queries
db.execute("SELECT * FROM users WHERE name = ?", [userInput]);

// SICHER: Named Parameters
db.execute("SELECT * FROM users WHERE name = :name", { name: userInput });
// UNSICHER - NIEMALS SO MACHEN!
// db.execute("SELECT * FROM users WHERE name = '" + userInput + "'");

// Der Scanner gibt aus:
// [HIGH] Potential SQL Injection in src/users.velin:12
//     -> Use parameterized queries: db.execute("...", [userInput])

Weitere Sanitization-Funktionen

use security

// Email-Adressen validieren
let isValid = security.isValidEmail(email);

// URLs sanitieren
let safeUrl = security.sanitizeUrl(userUrl);

// Dateinamen bereinigen
let safeFilename = security.sanitizeFilename(uploadName);

// HTML komplett entfernen (nur Text)
let plainText = security.stripHtml(htmlInput);

// JSON-Strings escapen
let safeJson = security.escapeJson(input);

// Shell Command Arguments escapen
let safeArg = security.escapeShellArg(userInput);

Validierung vs Sanitization

Validierung

Prüft ob Input gültig ist, lehnt ungültige Eingaben ab.

@Validate(
    email: Email,
    age: Range(18, 120)
)
fn register(email: string, age: number) {
    // Nur gültige Inputs erreichen diese Funktion
}
Sanitization

Bereinigt Input, entfernt gefährliche Teile.

fn saveComment(html: string) {
    // Gefährliche Tags werden entfernt
    let safe = security.sanitizeHtml(html);
    db.save(Comment { text: safe });
}

Best Practices

Immer Server-seitig

Client-seitige Validierung ist nur UX, kein Schutz

Whitelist statt Blacklist

Definiere was erlaubt ist, nicht was verboten

Encoding beachten

Output-Encoding passend zum Kontext (HTML, URL, JS)

Prepared Statements

Niemals SQL-Strings manuell zusammenbauen