<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 9hannahnine-jpg</title>
    <description>The latest articles on DEV Community by 9hannahnine-jpg (@9hannahninejpg).</description>
    <link>https://dev.to/9hannahninejpg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3935667%2F189ac222-8d42-4d5b-89ba-2b9792e512c3.png</url>
      <title>DEV Community: 9hannahnine-jpg</title>
      <link>https://dev.to/9hannahninejpg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/9hannahninejpg"/>
    <language>en</language>
    <item>
      <title>Why prompt filtering fails and what to do instead</title>
      <dc:creator>9hannahnine-jpg</dc:creator>
      <pubDate>Sun, 17 May 2026 01:52:48 +0000</pubDate>
      <link>https://dev.to/9hannahninejpg/why-prompt-filtering-fails-and-what-to-do-instead-55p5</link>
      <guid>https://dev.to/9hannahninejpg/why-prompt-filtering-fails-and-what-to-do-instead-55p5</guid>
      <description>&lt;p&gt;Every prompt injection defense I’ve seen makes the same mistake. It asks the wrong question.&lt;br&gt;
The wrong question: “Does this prompt contain dangerous words?”&lt;br&gt;
The right question: “Is untrusted content trying to become an instruction source?”&lt;br&gt;
These are fundamentally different problems.&lt;/p&gt;

&lt;p&gt;The problem with filtering&lt;br&gt;
Keyword filters fail because attackers adapt. Base64 encode your attack. ROT13 it. URL encode it. Space out the characters. Wrap it in a code block. The filter sees nothing dangerous. The model follows the instructions.&lt;br&gt;
We patched all of those encoding variants last week after someone found them in our public red team environment. The attacker had to work harder. But they got through on the first try.&lt;br&gt;
Filtering is an arms race you will always lose eventually.&lt;/p&gt;

&lt;p&gt;The real threat model&lt;br&gt;
Prompt injection isn’t about dangerous vocabulary. It’s about unauthorized instruction-authority transfer.&lt;br&gt;
Your agent has a clear hierarchy: system prompt at the top, developer instructions below that, user requests below that. The attack is when content from outside that hierarchy — a webpage, an email, a tool result, a retrieved document — tries to insert itself as a higher-authority instruction source.&lt;br&gt;
A webpage telling your agent to “ignore previous instructions” isn’t dangerous because of the words. It’s dangerous because a zero-authority source is attempting to override a high-authority one.&lt;/p&gt;

&lt;p&gt;The fix: source-aware authority enforcement&lt;br&gt;
Every content chunk should carry a trust level:&lt;br&gt;
    • System prompt: 100&lt;br&gt;
    • Developer instructions: 90&lt;br&gt;
    • User input: 50&lt;br&gt;
    • Tool output: 10&lt;br&gt;
    • Webpage: 10&lt;br&gt;
    • Email: 10&lt;br&gt;
    • Retrieved document: 10&lt;br&gt;
Rule: lower-authority sources can provide data. They cannot issue instructions.&lt;br&gt;
When a webpage footer says “ignore previous instructions” — that’s not a dangerous phrase. That’s a source boundary violation. A zero-authority source attempting behavioral authority.&lt;/p&gt;

&lt;p&gt;What this looks like in practice&lt;/p&gt;

&lt;p&gt;from langchain_arcgate import ArcGateCallback&lt;br&gt;
from langchain_openai import ChatOpenAI&lt;/p&gt;

&lt;p&gt;llm = ChatOpenAI(callbacks=[ArcGateCallback(api_key="demo")])&lt;/p&gt;

&lt;p&gt;One line. Every prompt gets source-tagged before it reaches the model. Untrusted content that attempts instruction-authority transfer gets blocked or sandboxed before the model sees it.&lt;br&gt;
For ambiguous cases — content that’s suspicious but not clearly malicious — capabilities get reduced rather than hard blocking. The agent continues safely with tool calls and external actions stripped. Graceful degradation instead of binary block/allow.&lt;/p&gt;

&lt;p&gt;Try to break it&lt;br&gt;
We run a public adversarial evaluation environment. Submit attacks, get a full security trace back, download the JSON report.&lt;br&gt;
&lt;a href="https://web-production-6e47f.up.railway.app/break-arc-gate" rel="noopener noreferrer"&gt;https://web-production-6e47f.up.railway.app/break-arc-gate&lt;/a&gt;&lt;br&gt;
Someone found a nested encoding bypass last week. It’s patched and documented in the public failure archive.&lt;br&gt;
GitHub: &lt;a href="https://github.com/9hannahnine-jpg/arc-gate" rel="noopener noreferrer"&gt;https://github.com/9hannahnine-jpg/arc-gate&lt;/a&gt;&lt;br&gt;
Built by Bendex Geometry.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>security</category>
      <category>ai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
