Sample report using demonstration data.
Website Security Remediation Report
Sample Website Security Report
Example Retail Co. (demonstration) · www.client-shop.example
- Report ID
- DEMO-2026-0001
- Assessment date
- 2026-10-01
- Verification scan
- 2026-10-08
- Prepared by
- NeoShieldSecurity QUANTUM X Agency branding: planned
Download sample PDF report The same report as a client-ready PDF: cover, executive summary, findings, platform fixes and remediation timeline.
Reports carry NeoShield branding today. Agency branding is planned. Every name, finding and score on this page is demonstration data for a fictional client.
Executive summary
Observed configuration score
55/100 · Grade D
After verified fixes: 73/100, grade C
This score covers only the publicly observable configuration checks completed in this assessment. It does not measure application vulnerabilities or overall business risk.
Action required
Severity distribution
High 1 · Medium 3 · Low 2
4 open · 2 verified fixed · 11 checks passed
What this means for the business
The website is reachable over HTTPS with a valid certificate, but several browser security controls are missing. The most important open gaps are the missing Content-Security-Policy, a defense-in-depth control, and session cookies without the Secure and HttpOnly flags. Two issues were fixed and verified by a follow-up scan on 2026-10-08. Four issues remain open and are listed in priority order with configuration examples.
Technical summary
Passive assessment of publicly observable HTTP response headers, TLS configuration, cookies, redirects, email-authentication DNS records and common exposed paths. 6 findings (1 high, 3 medium, 2 low); 2 verified fixed; 11 checks passed; DKIM not assessed (no selector supplied).
Prioritized findings
| Ref | Finding | Severity | Verification status |
|---|---|---|---|
| F-01 | Content-Security-Policy header not set | Medium | Still observed |
| F-03 | Session cookie missing Secure and HttpOnly flags | Medium | Still observed |
| F-04 | No clickjacking protection | Medium | Still observed |
| F-06 | Server software version disclosed | Low | Still observed |
| F-02 | Strict-Transport-Security header missing | High | Resolved |
| F-05 | X-Content-Type-Options header missing | Low | Resolved |
Findings, evidence and remediation
F-01 Content-Security-Policy header not set Medium
- Finding ID
- DEMO-2026-0001-F-01 · rule csp
- Confidence
- High
- Affected URL
- https://www.client-shop.example/
- Detection method
- Passive HTTP response header inspection (GET /, redirects followed).
- Evidence
- GET / responded HTTP/2 200 with no Content-Security-Policy or Content-Security-Policy-Report-Only header. (observed 2026-10-01T09:14:05Z)
- Potential business impact
- Without a Content Security Policy, the browser has fewer restrictions available to reduce the impact of a successful content-injection or cross-site scripting vulnerability. If a script injection flaw is ever introduced, for example through a plugin, there is no browser-side control limiting what injected code can load or send.
- Technical impact
- No script-src, object-src, base-uri or frame-ancestors restrictions are applied by the browser.
- Limitation
- The absence of a Content Security Policy does not independently prove that the website is vulnerable to cross-site scripting. CSP is a defense-in-depth control.
- Remediation
- Start with a report-only policy, review the reports, then enforce it.
- Verification criteria
- A rescan observes an enforced Content-Security-Policy header that restricts script sources. A report-only policy is recorded as partially resolved.
- Verification status
- Still observed on the verification rescan
- Status
- New
- References
- developer.mozilla.org · owasp.org
Configuration examples
Configuration examples by platform
Nginx
# server { } block (or http { })
add_header Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" always;Start in Report-Only mode, add the origins your pages really use, then rename the header to Content-Security-Policy to enforce it. Reload with: nginx -t && systemctl reload nginx. add_header in a location block replaces headers set at server level.
Apache HTTP Server
# Requires mod_headers (a2enmod headers)
Header always set Content-Security-Policy-Report-Only "default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'"Start in Report-Only mode, add the origins your pages really use, then rename the header to Content-Security-Policy to enforce it. Place in the VirtualHost or .htaccess, then run apachectl configtest and reload.
Microsoft IIS
<?xml version="1.0" encoding="utf-8"?>
<!-- web.config: merge into the existing <configuration> element -->
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy-Report-Only" value="default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>Start in Report-Only mode, add the origins your pages really use, then rename the header to Content-Security-Policy to enforce it. Applies to the site or application that owns this web.config.
Cloudflare
Rules > Transform Rules > Modify Response Header > Create rule
1. Apply to: All incoming requests (or this hostname)
2. Action: Set static
3. Header name: Content-Security-Policy-Report-Only
4. Value: default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
5. DeployStart in Report-Only mode, add the origins your pages really use, then rename the header to Content-Security-Policy to enforce it. Cloudflare sets the header at the edge for proxied (orange-cloud) traffic only.
WordPress
<?php
// In a small site-specific plugin (or the child theme's functions.php)
add_action( 'send_headers', function () {
header(
"Content-Security-Policy-Report-Only: "
. "default-src 'self'; "
. "object-src 'none'; "
. "base-uri 'self'; "
. "frame-ancestors 'self'"
);
} );Start in Report-Only mode, add the origins your pages really use, then rename the header to Content-Security-Policy to enforce it. Setting the header in the web server or CDN is preferred; use this when you only control WordPress.
AWS CloudFront
CloudFront > Policies > Response headers > Create response headers policy
1. Security headers or Custom headers: add Content-Security-Policy-Report-Only = default-src 'self'; object-src 'none'; base-uri 'self'; frame-ancestors 'self'
2. Origin override: enabled
3. Attach the policy to the distribution's cache behavior(s)Start in Report-Only mode, add the origins your pages really use, then rename the header to Content-Security-Policy to enforce it. Changes propagate to all edge locations within a few minutes.
Test configuration changes in a staging environment before production deployment. An incorrect policy can break scripts, sign-in, checkout, embedded services, analytics, or third-party integrations.
References: MDN: Content-Security-Policy · OWASP Content Security Policy Cheat Sheet
F-03 Session cookie missing Secure and HttpOnly flags Medium
- Finding ID
- DEMO-2026-0001-F-03 · rule cookies
- Confidence
- High
- Affected URL
- https://www.client-shop.example/
- Detection method
- Passive inspection of Set-Cookie headers on public pages.
- Evidence
- Set-Cookie: PHPSESSID=[redacted]; path=/ (observed 2026-10-01T09:14:05Z)
- Potential business impact
- Without Secure, the cookie can be sent over unencrypted HTTP; without HttpOnly, page scripts can read it. Increased risk of session theft and account takeover for signed-in customers.
- Technical impact
- The session identifier is readable by page scripts and may be sent over plain HTTP.
- Limitation
- Only cookies set on publicly accessible pages are visible to a passive scan.
- Remediation
- Set Secure, HttpOnly and SameSite=Lax on session cookies.
- Verification criteria
- A rescan observes the session cookie with the Secure and HttpOnly attributes.
- Verification status
- Still observed on the verification rescan
- Status
- Remediation planned
- References
- developer.mozilla.org
Configuration examples
Configuration examples by platform
Nginx
# When Nginx proxies an application (nginx 1.19.3+)
proxy_cookie_flags ~ secure httponly samesite=lax;Applies to cookies set by the proxied application. Fixing the flags in the application itself is preferred.
Apache HTTP Server
# Requires mod_headers. Prefer fixing the application; use this as a stopgap.
Header edit Set-Cookie "(?i)^((?:(?!;\s?HttpOnly).)+)$" "$1; HttpOnly"
Header edit Set-Cookie "(?i)^((?:(?!;\s?Secure).)+)$" "$1; Secure"Each rule adds the flag only when it is missing. Use "Header edit" (not "always") so it applies to cookies set by the application. Test that sign-in still works.
Microsoft IIS
<?xml version="1.0" encoding="utf-8"?>
<!-- web.config (ASP.NET): merge into the existing <configuration> element -->
<configuration>
<system.web>
<httpCookies requireSSL="true" httpOnlyCookies="true" sameSite="Lax" />
</system.web>
</configuration>The sameSite attribute requires .NET Framework 4.7.2 or later.
WordPress
; php.ini (or .user.ini) for the PHP session cookie
session.cookie_secure = 1
session.cookie_httponly = 1
session.cookie_samesite = "Lax"WordPress's own login cookies are already HttpOnly and use Secure on HTTPS sites; plugins that set their own cookies may need updating.
Test configuration changes in a staging environment before production deployment. An incorrect policy can break scripts, sign-in, checkout, embedded services, analytics, or third-party integrations.
References: MDN: Set-Cookie · OWASP Session Management Cheat Sheet
F-04 No clickjacking protection Medium
- Finding ID
- DEMO-2026-0001-F-04 · rule xfo
- Confidence
- High
- Affected URL
- https://www.client-shop.example/
- Detection method
- Passive HTTP response header inspection.
- Evidence
- Neither X-Frame-Options nor a CSP frame-ancestors directive was returned. (observed 2026-10-01T09:14:05Z)
- Potential business impact
- Any other website can load these pages inside a hidden frame and trick visitors into clicking. Visitors could be manipulated into unintended actions such as changing account settings.
- Technical impact
- The pages can be embedded in a cross-origin frame.
- Remediation
- Send X-Frame-Options: SAMEORIGIN, or CSP frame-ancestors 'self'.
- Verification criteria
- A rescan observes X-Frame-Options (DENY or SAMEORIGIN) or a CSP frame-ancestors directive.
- Verification status
- Still observed on the verification rescan
- Status
- Under review
- References
- developer.mozilla.org
Configuration examples
Configuration examples by platform
Nginx
# server { } block (or http { })
add_header X-Frame-Options "SAMEORIGIN" always;If you already send a Content-Security-Policy, adding frame-ancestors 'self' gives the same protection in modern browsers. Reload with: nginx -t && systemctl reload nginx. add_header in a location block replaces headers set at server level.
Apache HTTP Server
# Requires mod_headers (a2enmod headers)
Header always set X-Frame-Options "SAMEORIGIN"If you already send a Content-Security-Policy, adding frame-ancestors 'self' gives the same protection in modern browsers. Place in the VirtualHost or .htaccess, then run apachectl configtest and reload.
Microsoft IIS
<?xml version="1.0" encoding="utf-8"?>
<!-- web.config: merge into the existing <configuration> element -->
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>If you already send a Content-Security-Policy, adding frame-ancestors 'self' gives the same protection in modern browsers. Applies to the site or application that owns this web.config.
Cloudflare
Rules > Transform Rules > Modify Response Header > Create rule
1. Apply to: All incoming requests (or this hostname)
2. Action: Set static
3. Header name: X-Frame-Options
4. Value: SAMEORIGIN
5. DeployIf you already send a Content-Security-Policy, adding frame-ancestors 'self' gives the same protection in modern browsers. Cloudflare sets the header at the edge for proxied (orange-cloud) traffic only.
WordPress
<?php
// In a small site-specific plugin (or the child theme's functions.php)
add_action( 'send_headers', function () {
header(
"X-Frame-Options: "
. "SAMEORIGIN"
);
} );If you already send a Content-Security-Policy, adding frame-ancestors 'self' gives the same protection in modern browsers. Setting the header in the web server or CDN is preferred; use this when you only control WordPress.
AWS CloudFront
CloudFront > Policies > Response headers > Create response headers policy
1. Security headers > X-Frame-Options: SAMEORIGIN
2. Origin override: enabled
3. Attach the policy to the distribution's cache behavior(s)If you already send a Content-Security-Policy, adding frame-ancestors 'self' gives the same protection in modern browsers. Changes propagate to all edge locations within a few minutes.
Test configuration changes in a staging environment before production deployment. An incorrect policy can break scripts, sign-in, checkout, embedded services, analytics, or third-party integrations.
References: MDN: X-Frame-Options · OWASP Clickjacking Defense Cheat Sheet
F-06 Server software version disclosed Low
- Finding ID
- DEMO-2026-0001-F-06 · rule server_banner
- Confidence
- Medium
- Affected URL
- https://www.client-shop.example/
- Detection method
- Passive inspection of the Server and X-Powered-By response headers.
- Evidence
- Server: Apache/2.4.41 (Ubuntu)
X-Powered-By: PHP/7.4.3 (observed 2026-10-01T09:14:05Z) - Potential business impact
- Exact version numbers make it easier to match the site against known vulnerabilities. Helps attackers prioritise the site when a new vulnerability is published.
- Technical impact
- Software names and versions are disclosed to every visitor.
- Limitation
- A version banner can be inaccurate: distributions often backport security fixes without changing the version string.
- Remediation
- Hide version details in the web server and PHP configuration, and keep both updated.
- Verification criteria
- A rescan observes no version numbers in the Server or X-Powered-By headers.
- Verification status
- Still observed on the verification rescan
- Status
- New
- References
- owasp.org
Configuration examples
Configuration examples by platform
Nginx
# http { } block
server_tokens off;Hides the version number; the Server header still says "nginx".
Apache HTTP Server
# Main server configuration (not .htaccess)
ServerTokens Prod
ServerSignature OffReduces the Server header to "Apache". For X-Powered-By, set expose_php = Off in php.ini.
Microsoft IIS
<?xml version="1.0" encoding="utf-8"?>
<!-- web.config, IIS 10 (version 1709+): merge into the existing <configuration> element -->
<configuration>
<system.webServer>
<security>
<requestFiltering removeServerHeader="true" />
</security>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>removeServerHeader is available from IIS 10 version 1709.
WordPress
; php.ini (or .user.ini): removes the X-Powered-By: PHP/x.y header
expose_php = OffThe Server header itself is controlled by the web server (Nginx or Apache), not by WordPress.
Test configuration changes in a staging environment before production deployment. An incorrect policy can break scripts, sign-in, checkout, embedded services, analytics, or third-party integrations.
References: OWASP: Fingerprint Web Server
F-02 Strict-Transport-Security header missing High
- Finding ID
- DEMO-2026-0001-F-02 · rule hsts
- Confidence
- High
- Affected URL
- https://www.client-shop.example/
- Detection method
- Passive HTTP response header inspection over HTTPS.
- Evidence
- HTTPS is available, but the response carries no Strict-Transport-Security header. (observed 2026-10-01T09:14:05Z)
- Potential business impact
- HSTS tells browsers to always use HTTPS for this site, closing the window in which a first request can be downgraded to HTTP. Visitors on untrusted networks could be redirected to an insecure version of the site.
- Technical impact
- The first plain-HTTP request to the site is not upgraded by the browser.
- Remediation
- Send Strict-Transport-Security with a max-age of at least one year once HTTPS is stable on every subdomain.
- Verification criteria
- A rescan observes Strict-Transport-Security with max-age of at least 31536000 on the HTTPS response.
- Verification status
- Verified fixed by the rescan on 2026-10-08
- Status
- Resolved
- References
- developer.mozilla.org
F-05 X-Content-Type-Options header missing Low
- Finding ID
- DEMO-2026-0001-F-05 · rule xcto
- Confidence
- High
- Affected URL
- https://www.client-shop.example/
- Detection method
- Passive HTTP response header inspection.
- Evidence
- No X-Content-Type-Options header in the response. (observed 2026-10-01T09:14:05Z)
- Potential business impact
- Browsers may guess the type of a file and treat uploaded text as script. Low on its own; it removes one layer of defence against content-type confusion.
- Technical impact
- MIME type sniffing is not disabled.
- Remediation
- Send X-Content-Type-Options: nosniff.
- Verification criteria
- A rescan observes X-Content-Type-Options: nosniff.
- Verification status
- Verified fixed by the rescan on 2026-10-08
- Status
- Resolved
- References
- developer.mozilla.org
Checks passed
- Valid TLS certificate with a trusted chain
- Certificate not close to expiry (74 days remaining)
- HTTP redirects to HTTPS
- No mixed content on the scanned page
- Referrer-Policy present
- Permissions-Policy present
- No duplicate or conflicting security headers
- No commonly exposed files found (.git, .env, backups)
- security.txt published
- SPF record present
- DMARC record present
Scope and method
- Target: https://www.client-shop.example/ (one public website, apex and www)
- Method: non-intrusive requests to publicly accessible pages and DNS lookups
- Authorization: confirmed by the account holder before the assessment
- Checks: HTTP security headers, TLS and certificate, cookies, HTTP to HTTPS redirect, SPF, DMARC, security.txt, common exposed files
Limitations
- This is a passive configuration assessment, not a penetration test.
- Authenticated areas, application logic, injection flaws and business-logic issues were not tested.
- Results reflect the responses observed at the time of the assessment; a CDN or load balancer may serve different headers to other visitors.
- Configuration examples must be tested in a staging environment before production deployment.
Create this report for a client website
The free scan shows the score and up to three complete findings. Pro produces the full report with PDF and CSV export, fix verification and monitoring.