Building Your Learning Module...
Getting things ready for you!
Find videos you like?
Save to resource drawer for future reference!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HTML Security Best Practices</title>
<!-- Content Security Policy -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';">
<!-- Prevent MIME type sniffing -->
<meta http-equiv="X-Content-Type-Options" content="nosniff">
<!-- Prevent clickjacking -->
<meta http-equiv="X-Frame-Options" content="DENY">
</head>
<body>
<div class="container">
<h1>🔒 HTML Security</h1>
<!-- XSS Protection -->
<div class="threat-card">
<h2>1. Cross-Site Scripting (XSS)</h2>
<p style="color: #6b7280; margin-bottom: 15px;">
Malicious scripts injected into web pages
</p>
<h3 style="color: #ef4444; margin-top: 20px; margin-bottom: 10px;">
❌ Vulnerable Code
</h3>
<div class="vulnerability">
<!-- Never insert user input directly -->
<div>Welcome <script>document.write(userInput)</script></div>
<!-- Dangerous innerHTML -->
element.innerHTML = userInput;
</div>
<h3 style="color: #10b981; margin-top: 20px; margin-bottom: 10px;">
✅ Secure Code
</h3>
<div class="solution">
<!-- Escape user input -->
<div>Welcome <span id="username"></span></div>
<script>
// Use textContent, not innerHTML
document.getElementById('username').textContent = userInput;
</script>
</div>
</div>
<!-- CSRF Protection -->
<div class="threat-card">
<h2>2. Cross-Site Request Forgery (CSRF)</h2>
<p style="color: #6b7280; margin-bottom: 15px;">
Unauthorized commands from trusted users
</p>
<h3 style="color: #10b981; margin-top: 20px; margin-bottom: 10px;">
✅ Protection
</h3>
<div class="solution">
<!-- Include CSRF token in forms -->
<form method="POST" action="/transfer">
<input type="hidden" name="csrf_token" value="random_token">
<input type="text" name="amount">
<button type="submit">Transfer</button>
</form>
</div>
</div>
<!-- Security Headers -->
<h2 style="color: #dc2626; margin-top: 40px; margin-bottom: 20px;">
🛡️ Security Headers
</h2>
<div class="security-grid">
<div class="security-item">
<h4>Content Security Policy</h4>
<p style="font-size: 0.85rem; color: #6b7280; margin-bottom: 10px;">
Prevents XSS by restricting resource sources
</p>
<code style="font-size: 0.7rem; background: #e5e7eb; padding: 4px; border-radius: 4px; display: block;">
Content-Security-Policy: default-src 'self'
</code>
</div>
<div class="security-item">
<h4>X-Frame-Options</h4>
<p style="font-size: 0.85rem; color: #6b7280; margin-bottom: 10px;">
Prevents clickjacking attacks
</p>
<code style="font-size: 0.7rem; background: #e5e7eb; padding: 4px; border-radius: 4px; display: block;">
X-Frame-Options: DENY
</code>
</div>
<div class="security-item">
<h4>X-Content-Type-Options</h4>
<p style="font-size: 0.85rem; color: #6b7280; margin-bottom: 10px;">
Prevents MIME type sniffing
</p>
<code style="font-size: 0.7rem; background: #e5e7eb; padding: 4px; border-radius: 4px; display: block;">
X-Content-Type-Options: nosniff
</code>
</div>
<div class="security-item">
<h4>Strict-Transport-Security</h4>
<p style="font-size: 0.85rem; color: #6b7280; margin-bottom: 10px;">
Forces HTTPS connections
</p>
<code style="font-size: 0.7rem; background: #e5e7eb; padding: 4px; border-radius: 4px; display: block;">
Strict-Transport-Security: max-age=31536000
</code>
</div>
</div>
<div style="background: #dcfce7; padding: 20px; border-radius: 12px; border-left: 4px solid #10b981; margin-top: 30px;">
<h3 style="color: #065f46; margin-bottom: 10px;">🔐 Security Checklist</h3>
<ul style="list-style: none; line-height: 2; color: #166534;">
<li>✓ Validate and sanitize all user input</li>
<li>✓ Use HTTPS everywhere</li>
<li>✓ Implement Content Security Policy</li>
<li>✓ Add CSRF tokens to forms</li>
<li>✓ Escape output (textContent not innerHTML)</li>
<li>✓ Set security headers</li>
<li>✓ Keep dependencies updated</li>
<li>✓ Use SameSite cookies</li>
</ul>
</div>
</div>
</body>
</html>Loading preview...
Attacker injects malicious scripts into web pages
❌ element.innerHTML = userInput;
✅ element.textContent = userInput;
Unauthorized actions performed on behalf of authenticated users
✅ Include CSRF token in all forms
Tricking users into clicking hidden elements
✅ X-Frame-Options: DENY
Redirecting users to malicious sites
✅ Validate redirect URLs against whitelist
Controls which resources can be loaded
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com;Prevents site from being embedded in iframe
X-Frame-Options: DENY or SAMEORIGINPrevents MIME-sniffing attacks
X-Content-Type-Options: nosniffForces HTTPS connections
Strict-Transport-Security: max-age=31536000; includeSubDomainsControls referrer information sent
Referrer-Policy: strict-origin-when-cross-origin