The website security basics worth fixing.
On 2026-10-30, 56% (108/193) of the websites where we could read the home page had no enforced Content-Security-Policy header. That leaves a useful browser defence unset. It does not prove a script injection flaw exists.
We found no recognised framing protection on 46% (89/193) of readable home pages on 2026-10-30. Review which pages should be allowed inside another site before setting a policy.
DMARC was absent or not enforcing quarantine or rejection for 45% (87/193) of domains with a completed DNS check on 2026-10-30. Monitoring is a sensible starting point. It needs a planned move to enforcement.
Read the method and resultsA public view, with clear limits.
On 2026-10-30, we ran a local Python port of our passive website checker against 207 India-connected fintech, B2B SaaS and AI product websites. It reads public pages, a bounded set of known file paths and DNS records, and performs TLS handshakes. Requests identify our checker and link to the free check. We do not log in, submit forms or try exploits. We respect our exclusion list and stop at a home-page firewall challenge. Owners can opt out under our scanning policy.
The final eligible sample is 93 below the planned 300 websites. We removed out-of-scope candidates during source review. This is a public-directory convenience sample, not a market estimate. India connections come from directory locations and India-focused investor portfolios, including cross-border businesses. We did not independently verify legal domicile. Source headcounts were in the preferred range of 20 to 500 for 45 selected websites; headcount was unverified for 162. These are counts as at 2026-10-30. Fintech takes priority when sectors overlap, followed by explicit AI products, then B2B software.
We obtained readable sites for 193 of 207 selected websites on 2026-10-30. The results below use measured observations only. Blocked, timed-out and inapplicable checks appear separately. A missing header does not establish an exploitable vulnerability, and a passing check does not establish that an application is secure.
Inspect the anonymous aggregate data and calculation notes. Per-domain results stay private. Rates are rounded to whole percentages after pooling counts.
Start with the defences a browser can use.
Each label shows the affected count and measured sample size for 2026-10-30. The bars compare observed rates, not the severity of a vulnerability.
Read the sample before comparing grades.
| Segment | Selected | Readable n | Ungraded | Median score | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|
| Overall | 207 | 193 | 14 | 76 | 8% (15/193) | 46% (89/193) | 36% (69/193) | 8% (16/193) | 0% (0/193) | 2% (4/193) |
| Fintech | 66 | 61 | 5 | 75 | 8% (5/61) | 43% (26/61) | 33% (20/61) | 10% (6/61) | 0% (0/61) | 7% (4/61) |
| B2B SaaS | 42 | 38 | 4 | 79.0 | 8% (3/38) | 53% (20/38) | 34% (13/38) | 5% (2/38) | 0% (0/38) | 0% (0/38) |
| AI | 99 | 94 | 5 | 76.0 | 7% (7/94) | 46% (43/94) | 38% (36/94) | 9% (8/94) | 0% (0/94) | 0% (0/94) |
The checker has no E band. Research grades normalise measured weights before blending the basic and deeper checks. They are not directly comparable with grades from the live checker, which handles skipped checks differently. Segment differences may reflect size, hosting or sample selection; they do not establish that a sector is safer.
What passed, what needs review.
| Check | Measured n | Pass | Warn | Fail | Unknown / n/a |
|---|---|---|---|---|---|
| HTTPS works | 193 | 98% (190) | 0% (0) | 2% (3) | 0 |
| Plain HTTP redirects to HTTPS | 188 | 98% (184) | 0% (0) | 2% (4) | 5 |
| Browsers are told to always use HTTPS (HSTS) | 193 | 71% (137) | 2% (3) | 27% (53) | 0 |
| Certificate is valid and not about to expire | 193 | 98% (190) | 0% (0) | 2% (3) | 0 |
| Content-Security-Policy header review | 193 | 33% (64) | 13% (26) | 53% (103) | 0 |
| Recognised framing protection | 193 | 54% (104) | 0% (0) | 46% (89) | 0 |
| X-Content-Type-Options: nosniff | 193 | 46% (89) | 0% (0) | 54% (104) | 0 |
| Referrer-Policy header review | 193 | 35% (67) | 65% (126) | 0% (0) | 0 |
| Permissions-Policy header present | 193 | 18% (35) | 82% (158) | 0% (0) | 0 |
| SPF says who may send email as you | 188 | 89% (168) | 1% (1) | 10% (19) | 5 |
| DMARC tells receivers to block fake emails | 193 | 55% (106) | 36% (69) | 9% (18) | 0 |
| Source code history is not public | 108 | 99% (107) | 0% (0) | 1% (1) | 85 |
| Secrets file (.env) is not public | 106 | 100% (106) | 0% (0) | 0% (0) | 87 |
| Software versions are not advertised | 193 | 64% (123) | 36% (70) | 0% (0) | 0 |
| Home-page cookie Secure and HttpOnly flags | 193 | 92% (177) | 2% (3) | 7% (13) | 0 |
| Security contact is published | 185 | 6% (11) | 94% (174) | 0% (0) | 8 |
| Only modern TLS versions are accepted | 190 | 88% (168) | 2% (3) | 10% (19) | 3 |
| Strong cipher negotiated | 193 | 100% (193) | 0% (0) | 0% (0) | 0 |
| Certificate uses a modern signature | 193 | 100% (193) | 0% (0) | 0% (0) | 0 |
| Review of non-production-like DNS names | 98 | 2% (2) | 98% (96) | 0% (0) | 95 |
| Known admin and sensitive-file path probes | 52 | 73% (38) | 15% (8) | 12% (6) | 141 |
| Software versions are not advertised on the page | 193 | 74% (143) | 26% (50) | 0% (0) | 0 |
| CMS user directory access | 15 | 60% (9) | 0% (0) | 40% (6) | 178 |
| Home-page cross-origin access headers | 193 | 81% (157) | 19% (36) | 0% (0) | 0 |
| Home-page cookie SameSite attributes | 193 | 96% (185) | 4% (8) | 0% (0) | 0 |
Unknown / n/a includes blocked probes, timeouts and checks that do not apply. A software-identifying header is reported separately from an exact version. Cookie checks describe the public home page. A subdomain name that suggests testing or administration is a reason to review ownership, not proof of a security flaw.
Fintech check breakdown
| Check | Measured n | Pass | Warn | Fail | Unknown / n/a |
|---|---|---|---|---|---|
| HTTPS works | 61 | 95% (58) | 0% (0) | 5% (3) | 0 |
| Plain HTTP redirects to HTTPS | 59 | 97% (57) | 0% (0) | 3% (2) | 2 |
| Browsers are told to always use HTTPS (HSTS) | 61 | 56% (34) | 2% (1) | 43% (26) | 0 |
| Certificate is valid and not about to expire | 61 | 95% (58) | 0% (0) | 5% (3) | 0 |
| Content-Security-Policy header review | 61 | 34% (21) | 15% (9) | 51% (31) | 0 |
| Recognised framing protection | 61 | 57% (35) | 0% (0) | 43% (26) | 0 |
| X-Content-Type-Options: nosniff | 61 | 52% (32) | 0% (0) | 48% (29) | 0 |
| Referrer-Policy header review | 61 | 34% (21) | 66% (40) | 0% (0) | 0 |
| Permissions-Policy header present | 61 | 13% (8) | 87% (53) | 0% (0) | 0 |
| SPF says who may send email as you | 60 | 90% (54) | 0% (0) | 10% (6) | 1 |
| DMARC tells receivers to block fake emails | 61 | 49% (30) | 38% (23) | 13% (8) | 0 |
| Source code history is not public | 35 | 97% (34) | 0% (0) | 3% (1) | 26 |
| Secrets file (.env) is not public | 33 | 100% (33) | 0% (0) | 0% (0) | 28 |
| Software versions are not advertised | 61 | 52% (32) | 48% (29) | 0% (0) | 0 |
| Home-page cookie Secure and HttpOnly flags | 61 | 97% (59) | 0% (0) | 3% (2) | 0 |
| Security contact is published | 58 | 2% (1) | 98% (57) | 0% (0) | 3 |
| Only modern TLS versions are accepted | 60 | 85% (51) | 5% (3) | 10% (6) | 1 |
| Strong cipher negotiated | 61 | 100% (61) | 0% (0) | 0% (0) | 0 |
| Certificate uses a modern signature | 61 | 100% (61) | 0% (0) | 0% (0) | 0 |
| Review of non-production-like DNS names | 39 | 0% (0) | 100% (39) | 0% (0) | 22 |
| Known admin and sensitive-file path probes | 21 | 76% (16) | 14% (3) | 10% (2) | 40 |
| Software versions are not advertised on the page | 61 | 61% (37) | 39% (24) | 0% (0) | 0 |
| CMS user directory access | 3 | 67% (2) | 0% (0) | 33% (1) | 58 |
| Home-page cross-origin access headers | 61 | 92% (56) | 8% (5) | 0% (0) | 0 |
| Home-page cookie SameSite attributes | 61 | 93% (57) | 7% (4) | 0% (0) | 0 |
B2B SaaS check breakdown
| Check | Measured n | Pass | Warn | Fail | Unknown / n/a |
|---|---|---|---|---|---|
| HTTPS works | 38 | 100% (38) | 0% (0) | 0% (0) | 0 |
| Plain HTTP redirects to HTTPS | 38 | 95% (36) | 0% (0) | 5% (2) | 0 |
| Browsers are told to always use HTTPS (HSTS) | 38 | 87% (33) | 0% (0) | 13% (5) | 0 |
| Certificate is valid and not about to expire | 38 | 100% (38) | 0% (0) | 0% (0) | 0 |
| Content-Security-Policy header review | 38 | 32% (12) | 13% (5) | 55% (21) | 0 |
| Recognised framing protection | 38 | 61% (23) | 0% (0) | 39% (15) | 0 |
| X-Content-Type-Options: nosniff | 38 | 47% (18) | 0% (0) | 53% (20) | 0 |
| Referrer-Policy header review | 38 | 42% (16) | 58% (22) | 0% (0) | 0 |
| Permissions-Policy header present | 38 | 26% (10) | 74% (28) | 0% (0) | 0 |
| SPF says who may send email as you | 37 | 92% (34) | 0% (0) | 8% (3) | 1 |
| DMARC tells receivers to block fake emails | 38 | 61% (23) | 34% (13) | 5% (2) | 0 |
| Source code history is not public | 20 | 100% (20) | 0% (0) | 0% (0) | 18 |
| Secrets file (.env) is not public | 20 | 100% (20) | 0% (0) | 0% (0) | 18 |
| Software versions are not advertised | 38 | 74% (28) | 26% (10) | 0% (0) | 0 |
| Home-page cookie Secure and HttpOnly flags | 38 | 89% (34) | 5% (2) | 5% (2) | 0 |
| Security contact is published | 37 | 11% (4) | 89% (33) | 0% (0) | 1 |
| Only modern TLS versions are accepted | 38 | 87% (33) | 0% (0) | 13% (5) | 0 |
| Strong cipher negotiated | 38 | 100% (38) | 0% (0) | 0% (0) | 0 |
| Certificate uses a modern signature | 38 | 100% (38) | 0% (0) | 0% (0) | 0 |
| Review of non-production-like DNS names | 15 | 0% (0) | 100% (15) | 0% (0) | 23 |
| Known admin and sensitive-file path probes | 8 | 50% (4) | 25% (2) | 25% (2) | 30 |
| Software versions are not advertised on the page | 38 | 82% (31) | 18% (7) | 0% (0) | 0 |
| CMS user directory access | 5 | 80% (4) | 0% (0) | 20% (1) | 33 |
| Home-page cross-origin access headers | 38 | 71% (27) | 29% (11) | 0% (0) | 0 |
| Home-page cookie SameSite attributes | 38 | 97% (37) | 3% (1) | 0% (0) | 0 |
AI products check breakdown
| Check | Measured n | Pass | Warn | Fail | Unknown / n/a |
|---|---|---|---|---|---|
| HTTPS works | 94 | 100% (94) | 0% (0) | 0% (0) | 0 |
| Plain HTTP redirects to HTTPS | 91 | 100% (91) | 0% (0) | 0% (0) | 3 |
| Browsers are told to always use HTTPS (HSTS) | 94 | 74% (70) | 2% (2) | 23% (22) | 0 |
| Certificate is valid and not about to expire | 94 | 100% (94) | 0% (0) | 0% (0) | 0 |
| Content-Security-Policy header review | 94 | 33% (31) | 13% (12) | 54% (51) | 0 |
| Recognised framing protection | 94 | 49% (46) | 0% (0) | 51% (48) | 0 |
| X-Content-Type-Options: nosniff | 94 | 41% (39) | 0% (0) | 59% (55) | 0 |
| Referrer-Policy header review | 94 | 32% (30) | 68% (64) | 0% (0) | 0 |
| Permissions-Policy header present | 94 | 18% (17) | 82% (77) | 0% (0) | 0 |
| SPF says who may send email as you | 91 | 88% (80) | 1% (1) | 11% (10) | 3 |
| DMARC tells receivers to block fake emails | 94 | 56% (53) | 35% (33) | 9% (8) | 0 |
| Source code history is not public | 53 | 100% (53) | 0% (0) | 0% (0) | 41 |
| Secrets file (.env) is not public | 53 | 100% (53) | 0% (0) | 0% (0) | 41 |
| Software versions are not advertised | 94 | 67% (63) | 33% (31) | 0% (0) | 0 |
| Home-page cookie Secure and HttpOnly flags | 94 | 89% (84) | 1% (1) | 10% (9) | 0 |
| Security contact is published | 90 | 7% (6) | 93% (84) | 0% (0) | 4 |
| Only modern TLS versions are accepted | 92 | 91% (84) | 0% (0) | 9% (8) | 2 |
| Strong cipher negotiated | 94 | 100% (94) | 0% (0) | 0% (0) | 0 |
| Certificate uses a modern signature | 94 | 100% (94) | 0% (0) | 0% (0) | 0 |
| Review of non-production-like DNS names | 44 | 5% (2) | 95% (42) | 0% (0) | 50 |
| Known admin and sensitive-file path probes | 23 | 78% (18) | 13% (3) | 9% (2) | 71 |
| Software versions are not advertised on the page | 94 | 80% (75) | 20% (19) | 0% (0) | 0 |
| CMS user directory access | 7 | 43% (3) | 0% (0) | 57% (4) | 87 |
| Home-page cross-origin access headers | 94 | 79% (74) | 21% (20) | 0% (0) | 0 |
| Home-page cookie SameSite attributes | 94 | 97% (91) | 3% (3) | 0% (0) | 0 |
The headline rates and their denominators.
| Observation | Rate (affected / measured) | Unknown / n/a |
|---|---|---|
| No valid DMARC policy found | 9% (18/193) | 0 |
| DMARC absent or not enforcing quarantine/reject | 45% (87/193) | 0 |
| SPF missing, invalid, soft, neutral or permissive | 80% (150/188) | 5 |
| No enforced Content-Security-Policy header | 56% (108/193) | 0 |
| No positive HSTS max-age | 27% (53/193) | 0 |
| No recognised framing protection | 46% (89/193) | 0 |
| Public .env signature confirmed | 0% (0/106) | 87 |
| Public .git/HEAD signature confirmed | 1% (1/108) | 85 |
| Sensitive file content confirmed in path probes | 12% (6/52) | 141 |
| Public .env, .git or sensitive file content confirmed | 15% (6/40) | 153 |
| Server version or software-identifying header visible | 36% (70/193) | 0 |
| Exact software version visible in page or headers | 26% (50/193) | 0 |
| security.txt with a Contact line found | 6% (11/185) | 8 |
| TLS 1.0 or 1.1 handshake accepted | 10% (19/190) | 3 |
| Home page sets a cookie without Secure | 7% (13/193) | 0 |
| Home page sets a cookie without HttpOnly | 8% (15/193) | 0 |
| Home page sets a cookie without Secure or HttpOnly | 8% (16/193) | 0 |
| Cookie-setting home pages missing Secure or HttpOnly | 25% (16/64) | 129 |
| At least one observed fail | 82% (159/193) | 0 |
SPF missing or soft includes invalid, neutral and permissive records. DMARC absent is distinct from monitoring mode. The combined file-exposure measure is known positive when any signature is confirmed; a negative requires completed probes for all components. Lower coverage can bias that rate. security.txt presence means a Contact line was found; it does not validate the contact or expiry. TLS support needs a successful handshake. An ambiguous failure is unknown. No rate describes actual email delivery, authenticated cookies or an exhaustive inventory.
What we could not grade.
| Segment | Reason | Websites |
|---|---|---|
| Overall | access denied | 3 |
| Overall | dns or offline | 6 |
| Overall | firewall challenge | 5 |
| fintech | access denied | 2 |
| fintech | dns or offline | 2 |
| fintech | firewall challenge | 1 |
| saas | dns or offline | 1 |
| saas | firewall challenge | 3 |
| ai | access denied | 1 |
| ai | dns or offline | 3 |
| ai | firewall challenge | 1 |
Firewall challenges are not a fault on the site. We did not retry them or include their block pages in the grade. These exclusions can change the mix of sites that remain, so the results should not be generalised to all Indian businesses.
Make the next change small and verifiable.
Keep source history private
Block access to /.git on the web server (or deploy without it) today, then change any secrets that were in the code.
Remove confirmed public sensitive files
Remove these files from the web folder or block them on the server. Backups and logs belong outside the site entirely.
Retire legacy TLS protocols
Disable TLS 1.0 and 1.1 on the web server or load balancer, keeping TLS 1.2 and 1.3.
Move mail authentication towards enforcement
After checking the reports, move to p=quarantine and then p=reject.
Introduce an enforced script policy
Start with Content-Security-Policy: default-src 'self' and add the sources your site really uses.
Choose who may frame your pages
Add X-Frame-Options: DENY (or frame-ancestors 'none' in your CSP).
Keep browsers on HTTPS
Add the header Strict-Transport-Security: max-age=31536000; includeSubDomains
Review the cookies that need protection
Set Secure on every cookie (and HttpOnly and SameSite where scripts don’t need them).
These fixes come from the checker. Test policies against the sources, embeds, subdomains and email senders your service needs before enabling them widely. Verify the change at the response or DNS record after release.
Check your own starting point.
Use the free website check to see the public configuration of a site you own or have permission to test. When you need to test roles, APIs and transaction flows, our fintech VAPT service covers the application behind the front page.
Get secured.
Tell us what you're shipping. You'll get a scoped, fixed quote within one business day.