
security-headers
by madsstoumann
How I think browser default styles should be ๐
SKILL.md
name: security-headers description: Analyzes HTTP security headers for a given URL and provides a comprehensive security score. Checks for critical headers like HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and Permissions-Policy. Returns detailed scoring and recommendations. allowed-tools: Bash(curl:*), WebFetch
Security Headers Analyzer
This skill performs a comprehensive security headers analysis of any website by examining HTTP response headers and calculating a security score based on industry best practices.
When to Use
digraph when_to_use {
"User asks about security headers?" [shape=diamond];
"User provides URL?" [shape=diamond];
"security-headers" [shape=box style=filled fillcolor=lightgreen];
"Ask for URL" [shape=box];
"Use other skill" [shape=box];
"User asks about security headers?" -> "User provides URL?" [label="yes\n(headers, HSTS,\nCSP, security score)"];
"User asks about security headers?" -> "Use other skill" [label="no"];
"User provides URL?" -> "security-headers" [label="yes"];
"User provides URL?" -> "Ask for URL" [label="no"];
}
Use this skill when:
- User asks about website security headers
- User wants to check HTTP security configuration
- User mentions HSTS, CSP, X-Frame-Options, or other security headers
- User wants to improve their website's security posture
- User asks for a security audit of HTTP headers
Process Flow
digraph process_flow {
rankdir=TB;
subgraph cluster_fetch {
label="Step 1: Fetch Headers";
style=filled;
fillcolor=lightblue;
"Make HEAD request to URL" [shape=box];
"Follow redirects" [shape=box];
"Extract all response headers" [shape=box];
}
subgraph cluster_analysis {
label="Step 2: Header Analysis";
style=filled;
fillcolor=lightgreen;
"Check HSTS (25pts)" [shape=box];
"Check CSP (25pts)" [shape=box];
"Check X-Frame-Options (10pts)" [shape=box];
"Check X-Content-Type-Options (10pts)" [shape=box];
"Check Referrer-Policy (10pts)" [shape=box];
"Check Permissions-Policy (10pts)" [shape=box];
"Check COEP/COOP/CORP (10pts)" [shape=box];
}
subgraph cluster_quality {
label="Step 3: Quality Assessment";
style=filled;
fillcolor=lightyellow;
"Validate HSTS directive values" [shape=box];
"Parse and validate CSP policy" [shape=box];
"Check for insecure headers" [shape=box];
"Identify security issues" [shape=box];
}
subgraph cluster_scoring {
label="Step 4: Score Calculation";
style=filled;
fillcolor=lightcoral;
"Sum header scores" [shape=box];
"Apply penalties for issues" [shape=box];
"Calculate final grade (A+ to F)" [shape=box];
}
"Start: Receive URL" [shape=oval style=filled fillcolor=lightgray];
"Request failed?" [shape=diamond];
"Return error message" [shape=box];
"Format report" [shape=box];
"End: Return security report" [shape=oval style=filled fillcolor=lightgray];
"Start: Receive URL" -> "Make HEAD request to URL";
"Make HEAD request to URL" -> "Follow redirects";
"Follow redirects" -> "Extract all response headers";
"Extract all response headers" -> "Request failed?";
"Request failed?" -> "Return error message" [label="yes"];
"Return error message" -> "End: Return security report";
"Request failed?" -> "Check HSTS (25pts)" [label="no"];
"Check HSTS (25pts)" -> "Check CSP (25pts)";
"Check CSP (25pts)" -> "Check X-Frame-Options (10pts)";
"Check X-Frame-Options (10pts)" -> "Check X-Content-Type-Options (10pts)";
"Check X-Content-Type-Options (10pts)" -> "Check Referrer-Policy (10pts)";
"Check Referrer-Policy (10pts)" -> "Check Permissions-Policy (10pts)";
"Check Permissions-Policy (10pts)" -> "Check COEP/COOP/CORP (10pts)";
"Check COEP/COOP/CORP (10pts)" -> "Validate HSTS directive values";
"Validate HSTS directive values" -> "Parse and validate CSP policy";
"Parse and validate CSP policy" -> "Check for insecure headers";
"Check for insecure headers" -> "Identify security issues";
"Identify security issues" -> "Sum header scores";
"Sum header scores" -> "Apply penalties for issues";
"Apply penalties for issues" -> "Calculate final grade (A+ to F)";
"Calculate final grade (A+ to F)" -> "Format report";
"Format report" -> "End: Return security report";
}
Instructions
1. Fetch HTTP Headers
Make a HEAD request to the provided URL to fetch headers:
curl -I -L -s "[url]"
Options:
-I: HEAD request (headers only)-L: Follow redirects-s: Silent mode
Extract all headers from the response, especially security-related ones.
2. Analyze Security Headers
Check for presence and quality of each security header:
Strict-Transport-Security (HSTS) - 25 points
Scoring:
- Not present: 0 points
- Present without directives: 10 points
- Present with
max-ageonly: 15 points - Present with
max-ageandincludeSubDomains: 20 points - Present with
max-age,includeSubDomains, andpreload: 25 points
Quality checks:
max-ageshould be at least 31536000 (1 year)- Should include
includeSubDomains - Ideally includes
preload
Penalties:
max-ageless than 10886400 (126 days): -5 points- Missing
includeSubDomains: -2 points
Content-Security-Policy (CSP) - 25 points
Scoring:
- Not present: 0 points
- Present but with
unsafe-inlineorunsafe-eval: 10 points - Present with restrictive policy: 20 points
- Present with strict policy and no unsafe directives: 25 points
Quality checks:
- Should define
default-src,script-src,style-src - Should avoid
unsafe-inlineandunsafe-eval - Should use
nonce-orhash-for inline scripts - Should include
upgrade-insecure-requests - Should define
frame-ancestors
Penalties:
- Contains
unsafe-inlineinscript-src: -10 points - Contains
unsafe-evalinscript-src: -10 points - Contains
*wildcard inscript-srcorobject-src: -5 points - Missing
frame-ancestors: -3 points
X-Frame-Options - 10 points
Scoring:
- Not present: 0 points
- Present with
ALLOW-FROM(deprecated): 5 points - Present with
SAMEORIGIN: 10 points - Present with
DENY: 10 points
Note: Can be replaced by CSP frame-ancestors directive (then award 10 points if CSP properly sets it).
X-Content-Type-Options - 10 points
Scoring:
- Not present: 0 points
- Present with value
nosniff: 10 points - Present with other value: 0 points
Referrer-Policy - 10 points
Scoring:
- Not present: 0 points
- Present with weak policy (
unsafe-url,origin,no-referrer-when-downgrade): 5 points - Present with strong policy (
no-referrer,same-origin,strict-origin,strict-origin-when-cross-origin): 10 points
Permissions-Policy - 10 points
Scoring:
- Not present: 0 points
- Present with at least one directive: 10 points
Common directives to check:
geolocation,microphone,camera,payment,usb,magnetometer,gyroscope,accelerometer
Cross-Origin Policies - 10 points (Bonus)
Cross-Origin-Embedder-Policy (COEP):
- Present with
require-corporcredentialless: +5 points
Cross-Origin-Opener-Policy (COOP):
- Present with
same-originorsame-origin-allow-popups: +3 points
Cross-Origin-Resource-Policy (CORP):
- Present with
same-site,same-origin, orcross-origin: +2 points
3. Identify Security Issues
Check for headers that leak information or pose security risks:
Information Disclosure (Penalties):
Serverheader reveals detailed version: -5 pointsX-Powered-Byheader present: -5 pointsX-AspNet-Versionheader present: -5 pointsX-AspNetMvc-Versionheader present: -5 points
Cookie Security Issues:
- Cookies without
Secureflag: -3 points per cookie (max -9) - Cookies without
HttpOnlyflag: -3 points per cookie (max -9) - Cookies without
SameSiteattribute: -2 points per cookie (max -6)
CORS Issues:
Access-Control-Allow-Origin: *on non-CDN: -5 pointsAccess-Control-Allow-Credentials: truewith wildcard origin: -10 points
4. Calculate Final Score and Grade
Total Score: Sum of all header points minus penalties (0-100+ scale)
Grade Scale:
- A+ (90-100+): Excellent security posture
- A (80-89): Good security with minor improvements needed
- B (70-79): Adequate security with some gaps
- C (60-69): Below average, several improvements needed
- D (50-59): Poor security, major improvements required
- F (0-49): Failing security posture, immediate action needed
5. Format the Results
Present the results in a clear, structured format:
# Security Headers Report: [URL]
## Security Grade: [GRADE] - [SCORE]/100
## Header Analysis
| Header | Status | Score | Details |
|--------|--------|-------|---------|
| **Strict-Transport-Security** | โ Present / โ Missing | [X/25] | [Value or recommendation] |
| **Content-Security-Policy** | โ Present / โ Missing | [X/25] | [Summary or issues] |
| **X-Frame-Options** | โ Present / โ Missing | [X/10] | [Value or recommendation] |
| **X-Content-Type-Options** | โ Present / โ Missing | [X/10] | [Value or recommendation] |
| **Referrer-Policy** | โ Present / โ Missing | [X/10] | [Value or recommendation] |
| **Permissions-Policy** | โ Present / โ Missing | [X/10] | [Value or recommendation] |
## Additional Headers (Bonus)
| Header | Status | Score | Details |
|--------|--------|-------|---------|
| **Cross-Origin-Embedder-Policy** | โ Present / โ Missing | [+X] | [Value if present] |
| **Cross-Origin-Opener-Policy** | โ Present / โ Missing | [+X] | [Value if present] |
| **Cross-Origin-Resource-Policy** | โ Present / โ Missing | [+X] | [Value if present] |
## Security Issues Found
[If no issues found:]
โ No critical security issues detected.
[If issues found:]
### Critical Issues
- [List critical issues with -X points each]
### Warnings
- [List warnings with -X points each]
### Information Disclosure
- [List info disclosure issues with -X points each]
## Recommendations
[Based on grade and missing headers, provide prioritized recommendations:]
### High Priority
1. [Most important missing/misconfigured headers]
2. [Critical security issues to fix]
### Medium Priority
1. [Secondary improvements]
2. [Header optimizations]
### Low Priority
1. [Nice-to-have additions]
2. [Information disclosure cleanup]
## Detailed Header Values
[Show the actual header values for reference:]
...
## Quick Fix Examples
[Provide code snippets for common server configurations:]
### Apache (.htaccess)
```apache
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self'; ..."
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=()"
Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; ..." always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
Cloudflare Workers
response.headers.set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains; preload');
response.headers.set('Content-Security-Policy', "default-src 'self'; ...");
response.headers.set('X-Frame-Options', 'DENY');
response.headers.set('X-Content-Type-Options', 'nosniff');
response.headers.set('Referrer-Policy', 'strict-origin-when-cross-origin');
response.headers.set('Permissions-Policy', 'geolocation=(), microphone=(), camera=()');
### 6. Error Handling
If the URL is unreachable:
- Note that headers could not be fetched
- Provide possible reasons (DNS failure, server down, firewall)
- Skip the analysis
If the URL redirects:
- Follow redirects automatically (already handled by `curl -L`)
- Analyze the final destination's headers
- Note the redirect chain if relevant
### 7. Important Notes
**CSP Complexity:**
- CSP policies can be very complex
- Focus on detecting unsafe directives rather than perfect validation
- Note if CSP is too restrictive (may break functionality)
**Header Precedence:**
- `Content-Security-Policy` `frame-ancestors` takes precedence over `X-Frame-Options`
- Some headers are deprecated but still in use
**Context Matters:**
- Public CDNs may legitimately use `Access-Control-Allow-Origin: *`
- API endpoints may have different requirements than web pages
- Development environments may intentionally have relaxed policies
**HTTPS Requirement:**
- Many security headers only make sense over HTTPS
- Note if the site is not using HTTPS (major issue)
**Regional Differences:**
- Some headers may be required by regulations (GDPR, etc.)
- Check for region-specific security requirements
## Example Usage
User: "Check the security headers for https://browser.style"
User: "Analyze the HTTP security of example.com"
User: "What's the security score for my website https://mysite.com?"
User: "Does github.com have good security headers?"
## Tips
- Use `curl -I -L -s` for efficient header-only requests
- Parse CSP carefully as it can span multiple lines or be split
- Pay special attention to `unsafe-inline` and `unsafe-eval` in CSP
- Check for both old (`X-Frame-Options`) and new (CSP `frame-ancestors`) protection methods
- Consider the context: a CDN may need different headers than a web app
- Provide actionable recommendations, not just scores
- Include code examples for common server configurations
Score
Total Score
Based on repository quality metrics
SKILL.mdใใกใคใซใๅซใพใใฆใใ
ใฉใคใปใณในใ่จญๅฎใใใฆใใ
100ๆๅญไปฅไธใฎ่ชฌๆใใใ
GitHub Stars 100ไปฅไธ
3ใถๆไปฅๅ ใซๆดๆฐใใใ
10ๅไปฅไธใใฉใผใฏใใใฆใใ
ใชใผใใณIssueใ50ๆชๆบ
ใใญใฐใฉใใณใฐ่จ่ชใ่จญๅฎใใใฆใใ
1ใคไปฅไธใฎใฟใฐใ่จญๅฎใใใฆใใ
Reviews
Reviews coming soon