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
Strukturell sicher
Das
db-Modul nutzt intern Prepared Statements. SQL Injection ist damit strukturell unmöglich, solange Sie die ORM-Methoden nutzen.// 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 });Warnung: Niemals String-Verkettung!
Der Velisch-Scanner warnt automatisch vor diesem unsicheren Pattern.
// 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