Skip to content
RU

Prompt injection in 2026: where the surface appears and what is measurable

TL;DR. Prompt injection gets explained with a chat example where a user types "ignore your instructions".

Prompt injection gets explained with a chat example where a user types "ignore your instructions". That is the most harmless case. The real surface is wherever content controlled by an outsider enters the prompt — and we pass the model headers, DNS records and page text from other people’s sites on every check.

Nobody has measured the share of such attempts, and the reason is honest: an attempt cannot be told from ordinary text. What is measurable is how often the model declines to answer: for us, 0.38% of live calls. And one occasion when we displayed such a refusal as an analysis is worth recounting on its own.

Check your site's security →

Where the attack surface actually appears

Prompt injection is usually explained with a chat example: a user types "ignore your previous instructions". That is the most harmless case, because the user is attacking their own session.

The real surface appears wherever content controlled by an outsider enters the prompt. For us that happens on every tool: to explain a check result we pass the model another site’s response headers, its DNS records, its page text, the contents of its robots.txt.

All of it is written by the owner of the site being checked, not by our user. They can put any text in a response header or a meta tag — including text addressed not to a human but to the model that will read it.

This is precisely the class that stands first in OWASP’s risk list for applications built on language models. And it has an unpleasant property: no reliable technical solution exists. A model does not distinguish "data" from "instructions" — to it both are one stream of text.

What can be measured, and what cannot

The prevalence of injection attempts has been measured by nobody. No vendor and no researcher publishes what share of requests contains one. The reason is simple: counting it requires reliably telling an attempt from ordinary text, and that is exactly what nobody can do.

What is measurable is how often a model declines to answer. We log that, and across ten days of August 2026, 9,474 live calls produced 36 refusals:

DenominatorRefusalsShare
All live calls36 of 9,4740.38%
Article summaries at the Russian provider36 of 1,3912.59%

So roughly one article summary in forty is declined. All 36 cases fell on one surface and one language, and the refusal wording was identical in every one.

A caveat: a refusal is not evidence of an attack. Far more often it is a filter firing on a harmless technical subject: text about vulnerabilities, about blocking, about circumventing restrictions looks suspicious to a filter regardless of intent. We give this figure not as a measure of attacks but as the part of model behaviour a system is obliged to anticipate.

The refusal we once presented as analysis

This is worth recounting, because the mistake is typical and not obvious.

Our system received an answer from the model and displayed it to the user in an "AI summary" block. When the model declined, it returned not an error but an ordinary text answer — a polite sentence about the subject not being discussed. To the code that was a successful response, and it was faithfully displayed as the result of an analysis.

The user saw, in the analysis block for their own check, a sentence along the lines of "I cannot discuss this topic". Formally the system worked correctly: the request went out, an answer came back, the answer was shown. In fact a refusal was being published in the interface as a finding.

The fix is to recognise a refusal from the answer text before it reaches the cache and the page, and in that case not to show the block at all. Such a call should also not consume the user’s quota: they received nothing.

The general lesson runs wider than injection: a successful model response does not mean a useful one. Everything arriving from a language model passes through code as an ordinary string, and no mechanism will distinguish a substantive finding from a polite refusal except a check you write yourself.

What to do when a model reads somebody else’s text

There is no universal solution, but the set of damage-limiting measures is known and it works.

  1. Treat model output as untrusted by default. Do not execute it as a command, do not substitute it into a database query, do not follow links from it. If the model proposes an action, a human or a separate check in code must confirm it.
  2. Escape the output when displaying it. We accept only a marked-up minimum from the model — emphasis and monospace — and convert it to markup after escaping. The model physically cannot insert a working tag.
  3. Limit what the model sees at all. The less foreign text enters the prompt, the smaller the surface. We pass parsed values rather than whole raw pages — not because it is cheaper, but because it is less somebody else’s text.
  4. Separate instructions from data explicitly. This is hygiene rather than defence: a model does not guarantee the boundary, but a clear prompt structure noticeably reduces accidental mixing.
  5. Give the model no more privilege than it needs. If it can change nothing, the most successful injection yields only spoiled text. This is the one measure that works regardless of the attacker’s ingenuity.

To see what your site sends in headers and meta tags — that is, what somebody else’s model would read — use the header check.

Primary source on risk classification: the OWASP list for large language model applications.

HeadersCSP, HSTS, X-Frame-Options, etc.
SSL/TLSEncryption and certificate
ConfigurationServer settings and leaks
Grade A-FOverall security score

Why teams trust us

OWASP
guidelines
15+
security headers
<2s
result
A–F
security grade

How it works

1

Enter site URL

2

Security headers analyzed

3

Get grade A–F

What Does the Security Analysis Check?

The tool checks HTTP security headers, SSL/TLS configuration, server info leaks, and protection against common attacks (XSS, clickjacking, MIME sniffing). A grade fromA to F shows overall security level.

Header Analysis

Checking Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, and more.

SSL Check

TLS version, certificate expiry, chain of trust, HSTS support.

Leak Detection

Finding exposed server versions, debug modes, open configs, and directories.

Report with Recommendations

Detailed report explaining each issue with specific steps to fix it.

Who uses this

Security teams

HTTP header audit

DevOps

config verification

Developers

CSP & HSTS setup

Auditors

compliance checks

Common Mistakes

Missing Content-Security-PolicyCSP is the primary XSS defense. Without it, script injection is much easier.
Missing HSTS headerWithout HSTS, HTTPS-to-HTTP downgrade attacks are possible. Enable Strict-Transport-Security.
Server header exposes versionServer: Apache/2.4.52 helps attackers find exploits. Hide the version.
X-Frame-Options not setSite can be embedded in iframe for clickjacking. Set DENY or SAMEORIGIN.
Missing X-Content-Type-OptionsWithout nosniff, browsers may misinterpret file types (MIME sniffing).

Best Practices

Start with basic headersMinimum: HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy. Takes 5 minutes.
Implement CSP graduallyStart with Content-Security-Policy-Report-Only, monitor violations, then enforce.
Hide server headersRemove Server, X-Powered-By, X-AspNet-Version from responses.
Configure Permissions-PolicyRestrict camera, microphone, geolocation access — only what is actually used.
Check after every deploySecurity headers can be overwritten during server configuration updates.

Get more with a free account

Security check history and HTTP security header monitoring.

Sign up free

Learn more

Frequently Asked Questions

How to protect?

Defence in depth: input validation + hardened system prompt + structured output + guardrails + output filter + tool sandbox + rate limit. NO single measure is enough.

Guardrails recommendation?

Lakera Guard (commercial, best coverage). Rebuff (open Python). NVIDIA NeMo (comprehensive, complex). Combine for critical use cases.

RAG poisoning — how to defend?

Source whitelist, content sanitisation before embedding, embedding-space anomaly detection. 100% fix does not exist.

Monitor prompt injection attempts?

Log all suspicious inputs + LLM output anomalies. Alert on patterns ("ignore previous", etc). Enterno Security Scanner basic checks.

Try the live tool that powered this guide

Free plan — 10 monitors, checks every 5 min, no card required. Upgrade for 1-minute interval and multi-region monitoring.