Security rule: Treat anything from the client (sessions, form fields, query params, template-bound values) as untrusted at runtime. Enforce safety on the server and use framework safe defaults for output encoding/sanitization. Only use “bypass”/escape hatches when you can prove the value’s origin and safety, and document that proof.
How to apply
Example patterns
const LoginSchema = z.object({ email: z.string().email(), password: z.string().min(1), });
export function parseLogin(body: unknown) { return LoginSchema.parse(body); // runtime validation }
- XSS-safe output (Angular):
- Prefer normal template bindings/interpolation so Angular sanitizes/escapes by default.
- Risky bypass guarded by proof (Angular):
```ts
import { DomSanitizer } from "@angular/platform-browser";
export class ExampleComponent {
trustedUrl: any;
constructor(private sanitizer: DomSanitizer) {
// Only bypass when you *proved* the value is not attacker-controlled
// and you constructed it from trusted sources.
const trusted = "https://example.com/safe-path";
this.trustedUrl = this.sanitizer.bypassSecurityTrustUrl(trusted);
}
}
Team checklist
Enter the URL of a public GitHub repository