<?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: Raviteja Nekkalapu</title>
    <description>The latest articles on DEV Community by Raviteja Nekkalapu (@raviteja_nekkalapu_).</description>
    <link>https://dev.to/raviteja_nekkalapu_</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%2F3660947%2F1ba42c9c-bf3f-46ca-8f1f-c5dd0f2dc6ea.png</url>
      <title>DEV Community: Raviteja Nekkalapu</title>
      <link>https://dev.to/raviteja_nekkalapu_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raviteja_nekkalapu_"/>
    <language>en</language>
    <item>
      <title>I built a open source free stock analysis tool with 55+ data dimensions</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Sat, 07 Mar 2026 18:49:13 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/i-built-a-open-source-free-stock-analysis-tool-with-55-data-dimensions-2mkp</link>
      <guid>https://dev.to/raviteja_nekkalapu_/i-built-a-open-source-free-stock-analysis-tool-with-55-data-dimensions-2mkp</guid>
      <description>

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I invest in stocks on the side. My workflow looked like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Screener.in for fundamentals&lt;/li&gt;
&lt;li&gt;Open TradingView for technicals&lt;/li&gt;
&lt;li&gt;Ask Perplexity for a quick summary&lt;/li&gt;
&lt;li&gt;Manually check insider trading on SEC EDGAR&lt;/li&gt;
&lt;li&gt;Look up institutional holders somewhere else&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Five tools. &lt;br&gt;
None of them talked to each other. &lt;br&gt;
And I was still missing actual valuation models, moat analysis, and any kind of fact-checking on the AI summaries.&lt;/p&gt;

&lt;p&gt;Bloomberg does all of this in one place. It also costs $24,000 per year.&lt;/p&gt;

&lt;p&gt;So I built one tool that does it for free.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Does
&lt;/h3&gt;

&lt;p&gt;You enter a stock ticker. Eight seconds later, you get a report with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nipun Score&lt;/strong&gt; - A proprietary A+ to F letter grade based on a weighted composite of technicals (25%), fundamentals (25%), sentiment (20%), risk (15%), and insider activity (15%)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three valuation models&lt;/strong&gt; - DCF, Benjamin Graham Number, Peter Lynch Fair Value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scenario analysis&lt;/strong&gt; - Bull, Base, and Bear price targets with probability estimates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive moat&lt;/strong&gt; - Wide, Narrow, or None with moat sources (brand, network effects, switching costs, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SWOT analysis&lt;/strong&gt; - AI-generated strengths, weaknesses, opportunities, threats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Insider trading&lt;/strong&gt; - Recent executive buys and sells with dollar amounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Institutional ownership&lt;/strong&gt; - Top 10 holders with position changes&lt;/li&gt;
&lt;li&gt;...and about 20 more sections&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Architecture
&lt;/h3&gt;

&lt;p&gt;The backend is a serverless worker that runs a 4-phase pipeline:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 - Data Collection (~2-3s)&lt;/strong&gt;&lt;br&gt;
10+ parallel API calls to Finnhub (financials, peers, insider trades, earnings), SEC EDGAR (10-K, 10-Q filings), Reddit RSS (sentiment), and Yahoo RSS (news).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 - Compute (~5ms)&lt;/strong&gt;&lt;br&gt;
Zero API calls. &lt;br&gt;
Pure math. &lt;br&gt;
This phase calculates Altman Z-Score, Piotroski F-Score, DCF valuation, Graham Number, momentum scoring, risk-reward ratios, and dividend safety. All deterministic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3 - AI Synthesis (~3-5s)&lt;/strong&gt;&lt;br&gt;
Two parallel calls to Google Gemini. &lt;br&gt;
One generates the main analysis. &lt;br&gt;
The other generates premium insights (scenario analysis, moat, SWOT, investment thesis). I built a 5-model cascade: 2.5 Pro → 2.0 Flash → 1.5 Pro → Flash → Lite. If one model rate-limits, it falls through to the next automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 4 - Second Opinions (~1-2s)&lt;/strong&gt;&lt;br&gt;
Cerebras generates a contrarian take. &lt;br&gt;
Cohere runs a fact audit, classifying every AI-generated claim as grounded, speculative, or unverifiable. Both are non-fatal — if they fail, the report still ships.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;This was important to me. The tool uses a BYOK (Bring Your Own Keys) model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys encrypted client-side with AES-256-GCM&lt;/li&gt;
&lt;li&gt;Key derivation: PBKDF2 with SHA-256, 100K iterations&lt;/li&gt;
&lt;li&gt;16-byte random salt, 12-byte random IV&lt;/li&gt;
&lt;li&gt;Keys sent via &lt;code&gt;X-Nipun-Keys&lt;/code&gt; header, never in request body&lt;/li&gt;
&lt;li&gt;Worker processes keys in memory, never persists them&lt;/li&gt;
&lt;li&gt;Everything uses the Web Crypto API — zero npm dependencies for crypto&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Interesting Technical Decisions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Mock data fallback on every API call&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every single external call is wrapped in try/catch with a fallback to mock data. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The app literally cannot crash from a bad API response&lt;/li&gt;
&lt;li&gt;Demo mode works using the same fallback path&lt;/li&gt;
&lt;li&gt;You can run the full UI without any API keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Cascading AI models&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of relying on one model, I chain five. Rate limits, outages, and model-specific failures are handled transparently. The user never sees an error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Contrarian AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most AI tools agree with themselves. I deliberately ask a second model to disagree with the first. This gives you both sides of the argument instead of just confirmation bias.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Try It
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx nipun-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or check the live demo at &lt;a href="https://nipun-ai.pages.dev" rel="noopener noreferrer"&gt;nipun-ai.pages.dev&lt;/a&gt; (uses mock data, no keys needed).&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/myProjectsRavi/Nipun-AI" rel="noopener noreferrer"&gt;github.com/myProjectsRavi/Nipun-AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. &lt;br&gt;
All APIs have free tiers. &lt;br&gt;
Feedback welcome.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I built an AI security Firewall and made it open source because production apps were leaking SSNs to OpenAI</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Thu, 26 Feb 2026 19:33:31 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/i-built-an-ai-security-firewall-and-made-it-open-source-because-production-apps-were-leaking-ssns-2jcg</link>
      <guid>https://dev.to/raviteja_nekkalapu_/i-built-an-ai-security-firewall-and-made-it-open-source-because-production-apps-were-leaking-ssns-2jcg</guid>
      <description>&lt;p&gt;About a year ago I started keeping a list. &lt;br&gt;
Every production AI integration I saw that shipped with zero input validation, zero output scanning, zero audit trail.&lt;br&gt;
The list got long fast.&lt;/p&gt;

&lt;p&gt;The pattern was always the same - OpenAI SDK, one API call per user message,&lt;br&gt;
return the result. &lt;br&gt;
Clean, fast to build, completely unprotected.&lt;/p&gt;

&lt;p&gt;So I spent almost an year building Sentinel Protocol and today I'm open-sourcing it.&lt;/p&gt;


&lt;h2&gt;
  
  
  What it is
&lt;/h2&gt;

&lt;p&gt;A local security proxy for LLM API calls. It sits between your application and&lt;br&gt;
any LLM provider - OpenAI, Anthropic, Google Gemini, Ollama, DeepSeek, Groq, etc and runs 81 security engines on every request.&lt;/p&gt;

&lt;p&gt;Zero cloud calls for security decisions. Everything runs on your machine. The&lt;br&gt;
audit trail is a plain JSONL file that stays local.&lt;/p&gt;


&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;--yes&lt;/span&gt; &lt;span class="nt"&gt;--package&lt;/span&gt; sentinel-protocol sentinel bootstrap &lt;span class="nt"&gt;--profile&lt;/span&gt; paranoid &lt;span class="nt"&gt;--mode&lt;/span&gt; enforce &lt;span class="nt"&gt;--dashboard&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Proxy starts at &lt;a href="http://127.0.0.1:8787" rel="noopener noreferrer"&gt;http://127.0.0.1:8787&lt;/a&gt;. Dashboard at &lt;a href="http://127.0.0.1:8788" rel="noopener noreferrer"&gt;http://127.0.0.1:8788&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Change one line in your SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY,
  baseURL: 'http://127.0.0.1:8787/v1',
  defaultHeaders: { 'x-sentinel-target': 'openai' }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything else stays identical. Your app code doesn't change.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The PII problem&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The PII engine handles 40+ pattern types with severity-tiered actions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;SSN, Credit Card, Passport&lt;/td&gt;
&lt;td&gt;Block (403) — never reaches model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;API Keys, AWS credentials, tax ID&lt;/td&gt;
&lt;td&gt;Block (403)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Email, phone, physical address&lt;/td&gt;
&lt;td&gt;Silently redact → placeholder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;IP addresses&lt;/td&gt;
&lt;td&gt;Log and pass&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;When you block an SSN&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;json
{
  "error": "PII_DETECTED",
  "reason": "pii_detected",
  "pii_types": ["ssn_us"],
  "correlation_id": "52360b2d-4b92-4b30-9ace-32fae427c323"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The PII never left your machine. The audit log has the timestamp, type, correlation ID, and duration. Your users' data stayed local.&lt;/p&gt;

&lt;p&gt;The two-way PII vault goes further. It tokenizes PII before the request leaves (the model sees a reference token, not the real value), then detokenizes the token in the model's response. End-to-end - the actual value is never transmitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Injection detection&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Three layers, running simultaneously per request:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LFRL classifier&lt;/strong&gt;: Custom rule language (RULE...WHEN...THEN) plus a learned scoring function. Calibrated confidence 0.0–1.0. Configurable block threshold (default: 0.85). Every rule is inspectable - no black box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt rebuff&lt;/strong&gt;: Canary token detection + perplexity scoring. Catches adversarial text that's lexically valid but statistically anomalous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic scanner&lt;/strong&gt;: ONNX local embeddings (all-MiniLM-L6-v2) computing cosine similarity against a threat signature corpus. Catches semantically similar injections that don't match known lexical patterns.&lt;/p&gt;

&lt;p&gt;The injection-merge layer combines all three signals with configurable weights into a single decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Agentic and MCP security&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;For teams building with tool-using agents and MCP:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP poisoning&lt;/strong&gt;: A malicious MCP server can return a crafted tool result and redirect the agent's next action. Sentinel's MCP poisoning detector analyzes tool call results for hijacking signals before they influence the agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shadow MCP&lt;/strong&gt;: Detects unauthorized MCP servers impersonating legitimate ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP certificate pinning&lt;/strong&gt;: TLS cert validation against expected fingerprints for known MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swarm protocol&lt;/strong&gt;: HMAC-authenticated inter-agent messaging. Agents can't impersonate each other in multi-agent setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loop breaker&lt;/strong&gt;: Detects and terminates infinite agent recursion before the budget burns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent drift&lt;/strong&gt;: Tracks whether an agent's behavior over a session is diverging from its constitutional goal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Egress scanning&lt;/strong&gt;: Most security tooling stops at the input. Sentinel scans what comes back out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hallucination tripwire&lt;/strong&gt;: Catches fabricated URLs, nonexistent package imports, numeric contradictions within the same response, and improbable citation patterns. Deterministic. Works directly on output text without needing the input context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stego exfil detector&lt;/strong&gt;: Zero-width characters and invisible Unicode code points are a real exfiltration vector. Tools can embed hidden data in what appears to be clean natural language text. Sentinel scans for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streaming (SSE) redaction&lt;/strong&gt;: In real time, as SSE chunks arrive. Not after the stream ends but during. The transform buffers partial sentences, scans, and either forwards or redacts before the chunk reaches your client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output classifier&lt;/strong&gt;: Four categories - toxicity, code execution, hallucination signals, unauthorized disclosure. Each with configurable warn/block thresholds and context-window dampening to keep the FP rate reasonable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance and governance&lt;/strong&gt;: Every blocked event gets OWASP LLM Top 10 category mapping and MITRE ATLAS technique attribution automatically. The compliance engine generates SOC2, GDPR, HIPAA, and EU AI Act Article 12 evidence reports on demand.&lt;/p&gt;

&lt;p&gt;The forensic debugger lets you replay any blocked request against a changed config. That's useful when you're tuning thresholds: make a change, replay the historical block, see whether the updated config would have still caught it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formal verification&lt;/strong&gt;: TLA+ spec for the security decision pipeline, Alloy spec for policy consistency. These are in the repo. You can run them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The numbers&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;52,069 lines of source code&lt;/li&gt;
&lt;li&gt;81 security engines&lt;/li&gt;
&lt;li&gt;139 test suites, 567 tests, 0 failures&lt;/li&gt;
&lt;li&gt;306 linted files, 0 warnings&lt;/li&gt;
&lt;li&gt;9 total runtime dependencies&lt;/li&gt;
&lt;li&gt;&amp;lt;5ms proxy overhead at p95&lt;/li&gt;
&lt;li&gt;0 npm audit vulnerabilities&lt;/li&gt;
&lt;li&gt;OWASP LLM Top 10: 10/10 categories covered&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What I got wrong&lt;/strong&gt;&lt;br&gt;
Egress is harder than ingress. Scanning natural language output has an inherently higher FP rate than scanning structured input patterns. I had to build context windowing and n-gram scoring specifically to make the output classifier useful at the default thresholds.*&lt;/p&gt;

&lt;p&gt;Streaming was harder than I expected. Getting real-time SSE redaction right required three rewrites. The partial sentence buffering across chunks is subtle.&lt;/p&gt;

&lt;p&gt;MCP should have been there from day one. I added most of the agentic security late. Tool-using agents and MCP integrations are the fastest-growing attack surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  No install — try it now
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx --yes --package sentinel-protocol sentinel bootstrap --profile paranoid --mode enforce --dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Global install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g sentinel-protocol
sentinel bootstrap --profile paranoid --mode enforce --dashboard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Embed in your app
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install sentinel-protocol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub: &lt;a href="https://github.com/myProjectsRavi/sentinel-protocol" rel="noopener noreferrer"&gt;https://github.com/myProjectsRavi/sentinel-protocol&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;MIT. &lt;br&gt;
No telemetry. &lt;br&gt;
No accounts.&lt;/p&gt;

&lt;p&gt;Built by a developer who got tired of the answer being "trust the model."&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>privacy</category>
    </item>
    <item>
      <title>The Incognito Mode Lie</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Thu, 05 Feb 2026 16:10:47 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/the-incognito-mode-lie-3a3g</link>
      <guid>https://dev.to/raviteja_nekkalapu_/the-incognito-mode-lie-3a3g</guid>
      <description>&lt;p&gt;You just did something dangerous.&lt;/p&gt;

&lt;p&gt;You opened ChatGPT. &lt;br&gt;
You pasted your medical lab report to understand the results.&lt;/p&gt;

&lt;p&gt;And you felt productive. &lt;br&gt;
Efficient. &lt;br&gt;
Smart.&lt;/p&gt;

&lt;p&gt;But here's what you didn't know:&lt;/p&gt;

&lt;p&gt;That text is never going to die.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Incognito" Delusion&lt;/strong&gt;&lt;br&gt;
Most people think privacy is a browser setting. &lt;br&gt;
Open a private window. &lt;br&gt;
Clear your cookies. &lt;br&gt;
You're invisible.&lt;/p&gt;

&lt;p&gt;Laughable.&lt;/p&gt;

&lt;p&gt;Incognito mode hides your history from your browser. &lt;br&gt;
Not from the websites you visit. &lt;br&gt;
Not from your ISP. &lt;br&gt;
And certainly not from the AI models you're feeding your life story to.&lt;/p&gt;

&lt;p&gt;When you paste that PDF into Claude or ChatGPT, you're not using a calculator. You're not using a tool. You're feeding a living, learning, remembering system.&lt;/p&gt;

&lt;p&gt;AI doesn't just answer you. AI learns from you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Forever Memory" Problem&lt;/strong&gt;&lt;br&gt;
Every major AI company has stated, on record, that they use conversations to improve their models.&lt;/p&gt;

&lt;p&gt;OpenAI's terms explicitly state that free tier ChatGPT conversations can be used for training. &lt;br&gt;
Google's Gemini? Same story. &lt;br&gt;
Claude by Anthropic? They claim to be more private, but their terms still allow for "safety research."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does "training" actually mean?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It means your rent agreement with your name, your landlord's name, your address, your monthly rent becomes a statistical weight in GPT-5. Your medical report with your cholesterol levels, your blood pressure, your doctor's diagnosis becomes a pattern that helps the model understand "human health."&lt;/p&gt;

&lt;p&gt;You are not a user. You are the curriculum.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Telecom Cold War&lt;/strong&gt;&lt;br&gt;
Here's something most people haven't connected yet.&lt;/p&gt;

&lt;p&gt;In 2025, three massive telecom partnerships were announced in India:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jio + Google Gemini: Free Gemini Pro for 18 months to all Jio 5G users (worth ₹35,100)&lt;/li&gt;
&lt;li&gt;Airtel + Perplexity AI: Free Perplexity Pro for 12 months to 360+ million Airtel subscribers&lt;/li&gt;
&lt;li&gt;OpenAI + India: Free ChatGPT Go for all Indian users for one year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why would these trillion-dollar companies give away their best products for free?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because you are not the customer. You are the product.&lt;/p&gt;

&lt;p&gt;Oracle's co-founder Larry Ellison said it plainly:&lt;/p&gt;

&lt;p&gt;"&lt;strong&gt;For these models to reach their peak value, you need to train them not just on publicly available data, but make privately owned data available for those models as well.&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;Read that again. Slowly.&lt;/p&gt;

&lt;p&gt;Privately owned data.&lt;/p&gt;

&lt;p&gt;That's your resume. &lt;br&gt;
Your tax documents. &lt;br&gt;
Your relationship advice queries. &lt;br&gt;
Your medical questions. &lt;br&gt;
Your children's school applications.&lt;/p&gt;

&lt;p&gt;Every telecom partnership is an investment. The free access is the bait. Your data is the return.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Quick Hack" Trap&lt;/strong&gt;&lt;br&gt;
Most people try to protect themselves manually.&lt;/p&gt;

&lt;p&gt;"I'll just delete my name before pasting."&lt;/p&gt;

&lt;p&gt;But you forgot your address. &lt;br&gt;
You forgot the transaction ID. &lt;br&gt;
You forgot the unique case number that links back to your identity. You forgot the metadata embedded in the file itself.&lt;/p&gt;

&lt;p&gt;Manual redaction is a game of whack-a-mole against a hydra. For every piece you catch, three more slip through.&lt;/p&gt;

&lt;p&gt;And even if you catch everything visible, there's the invisible: patterns. Writing style. Vocabulary. Typing speed (yes, some models track this). All of it creates a fingerprint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Math Solution&lt;/strong&gt;&lt;br&gt;
You can't trust privacy policies. They change. Companies get acquired. Servers get hacked. Employees go rogue.&lt;/p&gt;

&lt;p&gt;But you CAN trust math.&lt;/p&gt;

&lt;p&gt;If you send a document with no names in it, it cannot leak names. If you send an SSN that is mathematically valid but not yours, it cannot be traced to you.&lt;/p&gt;

&lt;p&gt;This is the principle behind Risk Mirror.&lt;/p&gt;

&lt;p&gt;We don't ask you to trust OpenAI. We don't ask you to trust Google. We ask you to trust entropy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redaction Mode&lt;/strong&gt;: We strip every identifiable element before it leaves your browser. Names become [NAME]. Dates become [DATE]. The document becomes a skeleton that the AI can analyze without learning who you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Twin Mode&lt;/strong&gt;: For when you need the AI to truly understand the document, we don't delete, we replace. Your name becomes "Sarah Chen." Your medical condition becomes a different (but structurally similar) ailment. The AI analyzes the form perfectly, but the facts are fiction.&lt;/p&gt;

&lt;p&gt;You have a choice.&lt;/p&gt;

&lt;p&gt;You can keep pasting your life into AI chatbots, hoping they play nice.&lt;/p&gt;

&lt;p&gt;Or you can sanitize first. Two clicks. Two seconds. And suddenly, you're a ghost.&lt;/p&gt;

&lt;p&gt;The AI still helps you. The AI still answers your questions. But the AI never learns who asked them.&lt;/p&gt;

&lt;p&gt;Be productive. Be safe. Be invisible.&lt;/p&gt;

&lt;p&gt;The Text Suite is $0 right now. &lt;/p&gt;

&lt;p&gt;No card required. &lt;br&gt;
No logs kept.&lt;/p&gt;

&lt;p&gt;Grab it before I have to close the free tier - &lt;a href="https://risk-mirror.vercel.app" rel="noopener noreferrer"&gt;Risk Mirror&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>cybersecurity</category>
      <category>data</category>
    </item>
    <item>
      <title>Why 'Localhost' is a Myth: Your Clipboard is a Public API</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Wed, 04 Feb 2026 17:20:57 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/why-localhost-is-a-myth-your-clipboard-is-a-public-api-52jp</link>
      <guid>https://dev.to/raviteja_nekkalapu_/why-localhost-is-a-myth-your-clipboard-is-a-public-api-52jp</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Invisible Leak&lt;/strong&gt;&lt;br&gt;
We treat &lt;em&gt;Localhost&lt;/em&gt; like a fortress. "It's just on my machine. It's safe."&lt;/p&gt;

&lt;p&gt;But how did the data get there? You copied it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Clipboard Reality:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Browser Extensions&lt;/strong&gt;: That "Coupon Finder" extension has permission to read your clipboard. It just read your AWS key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS History&lt;/strong&gt;: Windows and Mac now keep "Clipboard History" (Win+V). That password you copied 5 hours ago is still there, in plaintext, readable by any process running as User.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Tools&lt;/strong&gt;: You use a "ChatGPT Desktop App" or a "Writing Assistant." It monitors your clipboard to "help" you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The "Sanitize First" Habit (The New Hygiene)&lt;/strong&gt;&lt;br&gt;
In security, we wash our hands. You need to wash your clipboard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Protocol&lt;/strong&gt;: Before you copy anything sensitive (API keys, DB strings, customer emails) into a shared environment or an AI tool, Sanitize it.&lt;/p&gt;

&lt;p&gt;Risk Mirror isn't just an API. We have a simple web interface.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste the dirty text.&lt;/li&gt;
&lt;li&gt;Click "Sanitize".&lt;/li&gt;
&lt;li&gt;Copy the clean text.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It adds 2 seconds to your workflow. It removes 100% of the attack surface from your clipboard history. &lt;/p&gt;

&lt;p&gt;Stop treating your clipboard like a vault. It's a billboard.&lt;/p&gt;

&lt;p&gt;Bookmark the Sanitizer - &lt;a href="https://risk-mirror.vercel.app/" rel="noopener noreferrer"&gt;Risk Mirror&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The Developer's Guide to 'Safe Share'</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Wed, 04 Feb 2026 17:15:34 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/the-developers-guide-to-safe-share-1je4</link>
      <guid>https://dev.to/raviteja_nekkalapu_/the-developers-guide-to-safe-share-1je4</guid>
      <description>&lt;p&gt;&lt;strong&gt;The "Share" Paralysis&lt;/strong&gt;&lt;br&gt;
You have a critical bug in Prod. The server is on fire. You need help. You want to paste the &lt;em&gt;error.log&lt;/em&gt; into Slack, or GitHub Issues, or send it to a consultant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But you pause&lt;/strong&gt;. &lt;br&gt;
Does this log have a user's IP? &lt;br&gt;
Does it have a Session Token? &lt;br&gt;
Does it have an AWS key in the environment dump?&lt;/p&gt;

&lt;p&gt;So you spend 15 minutes manually ** Ctrl+F**ing for sensitive strings. And you miss one. And 5 minutes later, your AWS bill hits $10,000 because a bot scraped your key from that GitHub gist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Ctrl+Z" for Privacy&lt;/strong&gt;&lt;br&gt;
We built the Document Scanner capability in Risk Mirror to end this paralysis. It's an O(n) regex engine that lives in the browser (or API).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "Safe Share" Protocol:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Local Scan: Drag your .log file into Risk Mirror.&lt;/li&gt;
&lt;li&gt;Pattern Match: We identify 150+ secrets (AWS keys, Slack tokens, emails, IPs, MAC addresses).&lt;/li&gt;
&lt;li&gt;Redact or Replace:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Choose Redact ([REDACTED]) to show where the data was.&lt;/li&gt;
&lt;li&gt;Choose Twin to replace the IP 192.168.1.5 with 10.0.0.9. The network topology looks the same, but the target is gone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Download &amp;amp; Send: You now have a clean file.&lt;/p&gt;

&lt;p&gt;It takes &amp;lt; 1 second. &lt;/p&gt;

&lt;p&gt;It saves your career. &lt;/p&gt;

&lt;p&gt;Don't trust your eyes. &lt;/p&gt;

&lt;p&gt;Trust the pattern matcher.&lt;/p&gt;

&lt;p&gt;Try for free - &lt;a href="https://risk-mirror.vercel.app/" rel="noopener noreferrer"&gt;Risk Mirror&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>security</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Redact PII Before Sending Data to LLMs: A Developer's Guide</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Mon, 29 Dec 2025 06:02:45 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/redact-pii-before-sending-data-to-llms-a-developers-guide-1j04</link>
      <guid>https://dev.to/raviteja_nekkalapu_/redact-pii-before-sending-data-to-llms-a-developers-guide-1j04</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Why every AI integration needs PII redaction and how to implement it in 60 seconds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The AI Privacy Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;You're building a ChatGPT wrapper or any other AI wrapper. Users submit questions.&lt;/p&gt;

&lt;p&gt;Those questions contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emails&lt;/li&gt;
&lt;li&gt;Phone numbers&lt;/li&gt;
&lt;li&gt;Social security numbers (yes, really)&lt;/li&gt;
&lt;li&gt;Credit card numbers (users paste them)&lt;/li&gt;
&lt;li&gt;Home addresses&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of it goes directly to OpenAI's servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt;: Does your privacy policy say "We share user data with third parties"?&lt;/p&gt;

&lt;p&gt;Probably not. But you just did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lawsuit Waiting to Happen
&lt;/h2&gt;

&lt;p&gt;GDPR fines in 2024: &lt;strong&gt;€2.1 billion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Average data breach lawsuit settlement: &lt;strong&gt;$3.8 million&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SEC now requires disclosure of AI related data handling.&lt;/p&gt;

&lt;p&gt;It's not paranoia. It's risk management.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Simple Fix
&lt;/h2&gt;

&lt;p&gt;Redact PII &lt;strong&gt;before&lt;/strong&gt; sending to the LLM.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Input: "My SSN is 123-45-6789 and email is john@company.com"
     ↓
PII Firewall Edge
     ↓
Clean Input: "My SSN is [SSN] and email is [EMAIL]"
     ↓
Send to ChatGPT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ChatGPT never sees the actual PII. Your liability drops to near zero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation (60 seconds)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Get API Key
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://rapidapi.com/image-zero-trust-security-labs/api/pii-firewall-edge" rel="noopener noreferrer"&gt;Sign up on RapidAPI&lt;/a&gt; (free tier available)&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Call Before LLM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sanitizeForLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://pii-firewall-edge.p.rapidapi.com/v1/redact/fast&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RAPIDAPI_KEY&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userInput&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;redacted&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;redacted&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sanitizeForLLM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userMessage&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;aiResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cleanInput&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: There is no Step 3
&lt;/h3&gt;

&lt;p&gt;Seriously. That's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Gets Detected
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Types&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Contact Info&lt;/td&gt;
&lt;td&gt;Email, Phone&lt;/td&gt;
&lt;td&gt;
&lt;a href="mailto:john@test.com"&gt;john@test.com&lt;/a&gt;, 555-1234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Government IDs&lt;/td&gt;
&lt;td&gt;SSN, Passport&lt;/td&gt;
&lt;td&gt;123-45-6789, AB1234567&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial&lt;/td&gt;
&lt;td&gt;Credit Card, IBAN&lt;/td&gt;
&lt;td&gt;4111-1111-1111-1111&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Healthcare&lt;/td&gt;
&lt;td&gt;NPI, Medicare&lt;/td&gt;
&lt;td&gt;1234567890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer&lt;/td&gt;
&lt;td&gt;API Keys&lt;/td&gt;
&lt;td&gt;sk_live_xxx, ghp_xxx&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Total: 152 PII types&lt;/strong&gt; across 50+ countries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Build It Yourself?
&lt;/h2&gt;

&lt;p&gt;I tried. Here's what happened:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt;: Basic regex for SSN and email. "This is easy!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 2&lt;/strong&gt;: User submits Indian Aadhaar number. Regex fails. We used dictionary lookups and proximity patterns, not just regex&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 3&lt;/strong&gt;: Added 15 more patterns. Performance tanked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 4&lt;/strong&gt;: Discovered Luhn checksum. Realized I was matching fake credit cards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 2&lt;/strong&gt;: Still finding edge cases (international phone formats, API keys, crypto addresses...)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Month 8&lt;/strong&gt;: Finally production-ready. 2,000+ lines of code. 30+ checksum validators.&lt;/p&gt;

&lt;p&gt;You can spend 8+ months on this and then few more months in implementing enterprise grade security and then optimizing algorithms for performance&lt;/p&gt;

&lt;p&gt;Or use PII Firewall Edge API and ship today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/fast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2-5ms&lt;/td&gt;
&lt;td&gt;Logs, real-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/deep&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5-15ms&lt;/td&gt;
&lt;td&gt;Context-heavy data (Addresses, Names)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Zero-AI Advantage
&lt;/h2&gt;

&lt;p&gt;"Privacy" APIs that use ML models to detect PII:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Data → Their AI Server → Model Training → ???
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PII Firewall Edge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Data → Cloudflare Edge → Regex + Checksums → Deleted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No AI. No logs. No training. No liability.&lt;/strong&gt; &lt;br&gt;
We run on stateless Cloudflare Workers. No database is connected to the processing pipeline. The code is ephemeral.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pricing Reality
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS Comprehend&lt;/td&gt;
&lt;td&gt;$250+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google DLP&lt;/td&gt;
&lt;td&gt;$200+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private AI&lt;/td&gt;
&lt;td&gt;$500+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PII Firewall Edge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$5&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same security. 97% less cost.&lt;/p&gt;
&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Free: 500 requests/month&lt;br&gt;
Pro: $5/month (5,000 requests/month)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://pii-firewall-edge.p.rapidapi.com/v1/redact/fast"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "test@example.com 123-45-6789"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try it for free - &lt;a href="https://rapidapi.com/image-zero-trust-security-labs/api/pii-firewall-edge" rel="noopener noreferrer"&gt;PII Firewall Edge&lt;/a&gt;&lt;br&gt;
SDK Docs - &lt;a href="https://github.com/myProjectsRavi/pii-firewall-edge-api-examples" rel="noopener noreferrer"&gt;PII Firewall Edge - SDKs&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Building AI features? Don't leak user data. Start protecting your users today.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>api</category>
      <category>showdev</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Sun, 21 Dec 2025 09:59:04 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/-3d9m</link>
      <guid>https://dev.to/raviteja_nekkalapu_/-3d9m</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://dev.to/raviteja_nekkalapu_/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9o7i0l3vdukkzsrtvy92.png" height="533" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://dev.to/raviteja_nekkalapu_/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41" rel="noopener noreferrer" class="c-link"&gt;
            I Discovered Why "Stripping Metadata" From Images is Security Theater 🎭 - DEV Community
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            TL;DR: I spent 3 months researching image-based attacks after a security incident. What I found was...
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8j7kvp660rqzt99zui8e.png" width="300" height="299"&gt;
          dev.to
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I Discovered Why "Stripping Metadata" From Images is Security Theater 🎭</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Sat, 20 Dec 2025 15:09:17 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41</link>
      <guid>https://dev.to/raviteja_nekkalapu_/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I spent 3 months researching image-based attacks after a security incident. What I found was alarming: standard "metadata stripping" does almost nothing against modern threats. The only mathematical guarantee of safety is completely destroying and rebuilding the image from scratch.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Incident That Started Everything
&lt;/h2&gt;

&lt;p&gt;Last year, a friend's startup got hacked. The attack vector? &lt;strong&gt;A user's profile picture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not a PDF. Not an executable. A simple JPEG uploaded through their avatar picker.&lt;/p&gt;

&lt;p&gt;The file passed every standard check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ File extension: &lt;code&gt;.jpg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ MIME type: &lt;code&gt;image/jpeg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Magic bytes: Valid (&lt;code&gt;FF D8 FF...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Antivirus: Clean&lt;/li&gt;
&lt;li&gt;✅ Metadata stripped with ExifTool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They were still compromised.&lt;/p&gt;

&lt;p&gt;I spent the next three months going down the rabbit hole of &lt;strong&gt;polyglots and steganography&lt;/strong&gt;. What I found changed how I handle user uploads forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚨 The 3 Image Attacks That Bypass "Sanitization"
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Polyglot Files — The Shape-Shifters
&lt;/h3&gt;

&lt;p&gt;A polyglot is a file that is &lt;strong&gt;valid in multiple formats simultaneously&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One common attack is a &lt;strong&gt;Phar-JPEG Polyglot&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Valid JPEG Header] + [Valid PHP Payload] + [Valid JPEG Footer]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To your image upload filter? It looks like a perfectly valid image. To a backend process triggering a filesystem function (like a &lt;code&gt;phar://&lt;/code&gt; wrapper exploit or LFI vulnerability)? &lt;strong&gt;It executes as code.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Reality:&lt;/strong&gt; Standard sanitizers usually just check headers or strip EXIF tags. They often leave the file structure intact, meaning the malicious payload survives the "cleaning" process.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Steganography — Invisible Data Smuggling
&lt;/h3&gt;

&lt;p&gt;We often think of steganography as spy-movie stuff, but it's becoming a standard tool for &lt;strong&gt;APTs (Advanced Persistent Threats)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Attackers hide encrypted command-and-control (C2) payloads inside the &lt;strong&gt;Least Significant Bits (LSB)&lt;/strong&gt; or specific DCT coefficients of the image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified Concept:
# Original pixel:  RGB(100, 150, 200)
# Malicious pixel: RGB(101, 150, 201)  ← Human eye sees no difference
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Danger:&lt;/strong&gt; Your server acts as a "dead drop." The malware isn't running on your server, but your server is hosting the encrypted payload for other infected machines to download. Antivirus scanners rarely catch this because it looks like random visual noise (entropy).&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Image Bombs — The Memory Killer
&lt;/h3&gt;

&lt;p&gt;Also called "decompression bombs." A 50KB PNG file can be crafted to expand into &lt;strong&gt;50GB of raw pixel data&lt;/strong&gt; when decoded.&lt;/p&gt;

&lt;p&gt;If your backend blindly decodes this to process a thumbnail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Upload 50KB file (bypasses size limit)
2. Decoder attempts to allocate 50GB RAM
3. OOM Killer crashes your service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stripping metadata often &lt;strong&gt;triggers&lt;/strong&gt; this because the stripper has to parse the file first.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 The "Aha" Moment: Trust Nothing. Rebuild Everything.
&lt;/h2&gt;

&lt;p&gt;After researching this, I realized the industry standard ("Sanitization") is fundamentally flawed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Traditional security asks:&lt;/strong&gt; "Is this file safe?"&lt;br&gt;&lt;br&gt;
This is the wrong question.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The right question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"How can we &lt;em&gt;guarantee&lt;/em&gt; this file is sterile?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer is &lt;strong&gt;Content Disarm and Reconstruction (CDR)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of looking for "bad" things to remove, you extract the one thing you know is "good"—the pixels—and throw everything else away.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Logic:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decode&lt;/strong&gt; the image to a raw buffer (RGBA).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destroy&lt;/strong&gt; the original container (headers, metadata, hidden scripts, polyglot payloads).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-encode&lt;/strong&gt; the pixels into a brand new, sterile PNG container.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the original file had a PHP script hidden in the footer? &lt;strong&gt;Gone.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If it had GPS data? &lt;strong&gt;Gone.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If it was a malformed buffer overflow attack? &lt;strong&gt;Neutralized during decode.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ Building a Public Solution
&lt;/h2&gt;

&lt;p&gt;I wanted to implement this "Reconstruction" pattern for my own projects, but I hit a wall.&lt;/p&gt;

&lt;p&gt;Existing enterprise CDR tools were gated behind "Contact Sales" forms and $15k/year contracts. Open-source tools like ImageMagick have a scary history of CVEs (like ImageTragick), making them risky to run on your own backend.&lt;/p&gt;

&lt;p&gt;So, I decided to engineer a dedicated microservice for it.&lt;/p&gt;

&lt;h3&gt;
  
  
  I built &lt;strong&gt;Zero Trust API&lt;/strong&gt; using Rust and WebAssembly.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Why Rust/WASM?
&lt;/h4&gt;

&lt;p&gt;I needed &lt;strong&gt;memory safety&lt;/strong&gt;. Handling untrusted binary data in C/C++ is a recipe for disaster. By running the decoding logic in a &lt;strong&gt;sandboxed WASM environment&lt;/strong&gt; with strict memory limits, we can process hostile images without risking the host server.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input:   Any image (JPG, PNG, WEBP, GIF)
           │
           ▼
Process: Decodes to raw pixels → Destroys container → Rebuilds as sterile PNG
           │
           ▼
Output:  A mathematically generated new file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  For the Community
&lt;/h2&gt;

&lt;p&gt;I built this primarily to solve my own headache, but I've opened it up as a public API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I hate "Contact Sales" buttons&lt;/strong&gt;, so I made a free tier that's generous enough for most indie projects and dev testing.&lt;/p&gt;

&lt;p&gt;If you are handling user-uploaded avatars, KYC docs, or product photos, I highly recommend looking into CDR (whether you use my tool or build your own implementation).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Stop "cleaning" files. Start rebuilding them.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Links for the curious:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;strong&gt;API Docs &amp;amp; Demo:&lt;/strong&gt; &lt;a href="https://zero-trust-web.vercel.app" rel="noopener noreferrer"&gt;Zero Trust App&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;� &lt;strong&gt;RapidAPI (Get a key):&lt;/strong&gt; &lt;a href="https://rapidapi.com/image-zero-trust-security-labs/api/zero-trust-api" rel="noopener noreferrer"&gt;Zero Trust API&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  📚 Related Articles in This Series
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41"&gt;Part 1: Why Stripping Metadata is Security Theater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/the-hidden-threat-in-every-image-why-your-upload-validation-is-broken-36d1"&gt;Part 2: The Hidden Threat in Every Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba"&gt;Part 3: How to Test Image Rebuilding API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/hands-on-see-image-metadata-removal-in-action-1c5o"&gt;Part 4: See Image Metadata Removal in Action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Hands-On: See Image Metadata Removal in Action</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Sat, 20 Dec 2025 15:03:56 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/hands-on-see-image-metadata-removal-in-action-1c5o</link>
      <guid>https://dev.to/raviteja_nekkalapu_/hands-on-see-image-metadata-removal-in-action-1c5o</guid>
      <description>&lt;p&gt;&lt;em&gt;A practical verification guide using free tools to compare before and after&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;You've heard about metadata risks and image rebuilding. But how do you &lt;strong&gt;prove&lt;/strong&gt; it actually works?&lt;/p&gt;

&lt;p&gt;This guide teaches you to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Inspect image metadata using free tools&lt;/li&gt;
&lt;li&gt;See exactly what data your photos contain&lt;/li&gt;
&lt;li&gt;Verify that processing actually removes everything&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No coding required. Just free online tools and 10 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: Understanding What's Hidden in Your Images
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 The Invisible Data
&lt;/h3&gt;

&lt;p&gt;Every photo you take contains hidden metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                   What's Inside Your JPEG                   │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  📍 GPS COORDINATES                                         │
│  ├── Latitude: 37.7749° N                                   │
│  ├── Longitude: 122.4194° W                                 │
│  └── Altitude: 16 meters                                    │
│                                                             │
│  📱 DEVICE INFORMATION                                      │
│  ├── Make: Apple                                            │
│  ├── Model: iPhone 14 Pro                                   │
│  ├── Software: iOS 17.1                                     │
│  └── Serial Number: DNXXXXXXXX                              │
│                                                             │
│  📅 TIMESTAMPS                                              │
│  ├── Date Taken: 2024-03-15 14:32:07                        │
│  ├── Date Modified: 2024-03-15 14:32:07                     │
│  └── Time Zone: PST (UTC-8)                                 │
│                                                             │
│  📷 CAMERA SETTINGS                                         │
│  ├── Aperture: f/1.8                                        │
│  ├── Shutter Speed: 1/125                                   │
│  ├── ISO: 100                                               │
│  ├── Focal Length: 24mm                                     │
│  └── Flash: Off                                             │
│                                                             │
│  🖼️ EMBEDDED THUMBNAIL (Full separate image!)               │
│                                                             │
│  💬 COMMENTS (Can contain ANYTHING)                         │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;All of this is invisible&lt;/strong&gt; when you view the photo normally. But anyone with basic tools can extract it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: Free Online Tools to Inspect Metadata
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Jeffrey's EXIF Viewer (Recommended)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;code&gt;exif.regex.info/exif.cgi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to use:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the website&lt;/li&gt;
&lt;li&gt;Upload your image OR paste an image URL&lt;/li&gt;
&lt;li&gt;Click "View Image Data"&lt;/li&gt;
&lt;li&gt;See complete metadata analysis&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What you see:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  Jeffrey's Exif Viewer - Results                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  EXIF                                                       │
│  ├── Camera: iPhone 14 Pro (Apple)                          │
│  ├── Date: 2024:03:15 14:32:07                              │
│  ├── Resolution: 4032 × 3024                                │
│  └── ... 47 more fields                                     │
│                                                             │
│  GPS                                                        │
│  ├── Latitude: 37° 46' 29.64" N                             │
│  ├── Longitude: 122° 25' 9.84" W                            │
│  └── 📍 [Map Link]                                          │
│                                                             │
│  IPTC                                                       │
│  └── (empty)                                                │
│                                                             │
│  XMP                                                        │
│  ├── Creator Tool: Photos 8.0                               │
│  └── ... 12 more fields                                     │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Option 2: ExifMeta.com
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;code&gt;exifmeta.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag-and-drop upload&lt;/li&gt;
&lt;li&gt;Clean visual interface&lt;/li&gt;
&lt;li&gt;Shows GPS on a map&lt;/li&gt;
&lt;li&gt;Highlights privacy-sensitive fields&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Option 3: Online EXIF Viewer (Jimpl)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;code&gt;jimpl.com/exif&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very simple interface&lt;/li&gt;
&lt;li&gt;Shows embedded thumbnails&lt;/li&gt;
&lt;li&gt;Highlights common metadata fields&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Option 4: Browser DevTools (for URLs)
&lt;/h3&gt;

&lt;p&gt;If you have an image URL, many browsers can show basic metadata:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right-click image → "Open image in new tab"&lt;/li&gt;
&lt;li&gt;Right-click → "Inspect"&lt;/li&gt;
&lt;li&gt;Look at the Network tab for headers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(This only works for basic data, not EXIF)&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 3: Step-by-Step Verification
&lt;/h2&gt;

&lt;p&gt;Let's verify that image rebuilding actually removes metadata.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Find a Test Image
&lt;/h3&gt;

&lt;p&gt;Use a photo from your phone or camera. Phone photos are ideal because they contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPS coordinates&lt;/li&gt;
&lt;li&gt;Device information&lt;/li&gt;
&lt;li&gt;Timestamps&lt;/li&gt;
&lt;li&gt;Camera settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where to get test images:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your phone's photo library&lt;/li&gt;
&lt;li&gt;Photos you've taken recently&lt;/li&gt;
&lt;li&gt;Any JPEG from a digital camera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Don't use screenshots&lt;/strong&gt; - they typically have minimal metadata.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Check BEFORE Metadata
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Using Jeffrey's EXIF Viewer:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;exif.regex.info/exif.cgi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click "Choose file"&lt;/li&gt;
&lt;li&gt;Upload your original photo&lt;/li&gt;
&lt;li&gt;Click "View Image Data"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Privacy Risk&lt;/th&gt;
&lt;th&gt;Example Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPS Latitude/Longitude&lt;/td&gt;
&lt;td&gt;🔴 HIGH&lt;/td&gt;
&lt;td&gt;37.7749, -122.4194&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DateTimeOriginal&lt;/td&gt;
&lt;td&gt;🟡 MEDIUM&lt;/td&gt;
&lt;td&gt;2024:03:15 14:32:07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make/Model&lt;/td&gt;
&lt;td&gt;🟡 MEDIUM&lt;/td&gt;
&lt;td&gt;iPhone 14 Pro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;🟢 LOW&lt;/td&gt;
&lt;td&gt;iOS 17.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SerialNumber&lt;/td&gt;
&lt;td&gt;🔴 HIGH&lt;/td&gt;
&lt;td&gt;DX3XXXXXXXX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thumbnail&lt;/td&gt;
&lt;td&gt;🔴 HIGH&lt;/td&gt;
&lt;td&gt;(embedded image)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Save the results!&lt;/strong&gt; Take a screenshot or copy the data. You'll compare it later.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Process Through the API
&lt;/h3&gt;

&lt;p&gt;Use the RapidAPI playground (see our testing guide) or run this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s1"&gt;'https://zero-trust-api.p.rapidapi.com/'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-key: YOUR_KEY'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'x-rapidapi-host: zero-trust-api.p.rapidapi.com'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: image/jpeg'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-binary&lt;/span&gt; @your_original_photo.jpg &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; rebuilt_photo.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the output file: &lt;code&gt;rebuilt_photo.png&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Check AFTER Metadata
&lt;/h3&gt;

&lt;p&gt;Now analyze the &lt;strong&gt;rebuilt&lt;/strong&gt; image:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;code&gt;exif.regex.info/exif.cgi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Upload &lt;code&gt;rebuilt_photo.png&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click "View Image Data"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Expected results:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  Jeffrey's Exif Viewer - Results                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Basic Image Info                                           │
│  ├── File Type: PNG                                         │
│  ├── Resolution: 4032 × 3024                                │
│  ├── Color Depth: 8-bit                                     │
│  └── Color Type: RGB                                        │
│                                                             │
│  PNG Chunks                                                 │
│  ├── IHDR (Image Header)                                    │
│  ├── IDAT (Image Data)                                      │
│  └── IEND (Image End)                                       │
│                                                             │
│  ❌ NO EXIF DATA                                            │
│  ❌ NO GPS DATA                                             │
│  ❌ NO XMP DATA                                             │
│  ❌ NO IPTC DATA                                            │
│  ❌ NO THUMBNAIL                                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 4: The Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Side-by-Side Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metadata Field&lt;/th&gt;
&lt;th&gt;Original Photo&lt;/th&gt;
&lt;th&gt;After CDR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPS Latitude&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;37.7749° N&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPS Longitude&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;122.4194° W&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Camera Make&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Camera Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;iPhone 14 Pro&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Serial Number&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DX3XXXXXXXX&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Date Taken&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2024-03-15 14:32:07&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time Zone&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PST (UTC-8)&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;iOS 17.1&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Aperture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;f/1.8&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ISO&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Embedded Thumbnail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (228 KB)&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;XMP Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;12 fields&lt;/td&gt;
&lt;td&gt;❌ REMOVED&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Visual Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BEFORE (Original JPEG)              AFTER (Rebuilt PNG)
┌─────────────────────────┐        ┌─────────────────────────┐
│ File: photo_original.jpg│        │ File: rebuilt.png       │
│ Size: 2.4 MB            │        │ Size: 1.8 MB            │
│                         │        │                         │
│ EXIF: 47 fields         │   →    │ EXIF: 0 fields          │
│ GPS: 37.77, -122.41     │   →    │ GPS: (none)             │
│ Device: iPhone 14 Pro   │   →    │ Device: (none)          │
│ Thumbnail: YES          │   →    │ Thumbnail: NO           │
│                         │        │                         │
│ Visual: [Same image]    │   =    │ Visual: [Same image]    │
└─────────────────────────┘        └─────────────────────────┘

       47 metadata fields                 0 metadata fields
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 5: Why This Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Real Privacy Risks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GPS Coordinates Reveal:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your home address (photos taken at home)&lt;/li&gt;
&lt;li&gt;Your workplace&lt;/li&gt;
&lt;li&gt;Your daily routines&lt;/li&gt;
&lt;li&gt;Your travel patterns&lt;/li&gt;
&lt;li&gt;Your children's school locations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Timestamps Reveal:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When you're away from home&lt;/li&gt;
&lt;li&gt;Your sleep schedule&lt;/li&gt;
&lt;li&gt;When you take vacations&lt;/li&gt;
&lt;li&gt;Alibis (or lack thereof)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Device Info Reveals:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your phone model (for targeted exploits)&lt;/li&gt;
&lt;li&gt;Your software version (for vulnerability matching)&lt;/li&gt;
&lt;li&gt;Your device serial number (for tracking)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 Metadata in the News
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Incident&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;John McAfee Located&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;Fugitive found via photo metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vice Journalists&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;Reporters endangered by photo GPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Higgins Arrest&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Suspect tracked by EXIF data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TikTok Controversy&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;App collected extensive photo metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Part 6: Testing Edge Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Test 1: Phone Photo with Location
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Take a photo with your phone (ensure location services are on)&lt;/li&gt;
&lt;li&gt;Check metadata → should show GPS, device, timestamps&lt;/li&gt;
&lt;li&gt;Process through CDR&lt;/li&gt;
&lt;li&gt;Verify → all location data should be gone&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Test 2: Downloaded Internet Image
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Download any image from a website&lt;/li&gt;
&lt;li&gt;Check metadata → often contains software info, copyright, dates&lt;/li&gt;
&lt;li&gt;Process through CDR&lt;/li&gt;
&lt;li&gt;Verify → all web metadata should be gone&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Test 3: Screenshot
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Take a screenshot on any device&lt;/li&gt;
&lt;li&gt;Check metadata → usually minimal, but may include device info&lt;/li&gt;
&lt;li&gt;Process through CDR&lt;/li&gt;
&lt;li&gt;Verify → what little metadata existed is now gone&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Test 4: Edited Photo
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Take a photo, edit it (crop, filter, etc.)&lt;/li&gt;
&lt;li&gt;Check metadata → may contain edit history, software used&lt;/li&gt;
&lt;li&gt;Process through CDR&lt;/li&gt;
&lt;li&gt;Verify → edit traces are gone&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Part 7: Command Line Tools (Optional)
&lt;/h2&gt;

&lt;p&gt;For power users who prefer command-line tools:&lt;/p&gt;

&lt;h3&gt;
  
  
  ExifTool (Cross-Platform)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;exiftool

&lt;span class="c"&gt;# Ubuntu/Debian&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;libimage-exiftool-perl

&lt;span class="c"&gt;# Windows&lt;/span&gt;
&lt;span class="c"&gt;# Download from exiftool.org&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;View all metadata:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exiftool photo.jpg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Compare before and after:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Before&lt;/span&gt;
exiftool original.jpg &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; before.txt

&lt;span class="c"&gt;# After processing&lt;/span&gt;
exiftool rebuilt.png &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; after.txt

&lt;span class="c"&gt;# Compare&lt;/span&gt;
diff before.txt after.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sample Output
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before (original.jpg):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ExifTool Version Number         : 12.76
File Name                       : original.jpg
File Size                       : 2.4 MB
MIME Type                       : image/jpeg
GPS Latitude                    : 37 deg 46' 29.64" N
GPS Longitude                   : 122 deg 25' 9.84" W
Camera Model Name               : iPhone 14 Pro
Date/Time Original              : 2024:03:15 14:32:07
Software                        : 17.1
... (47 more fields)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After (rebuilt.png):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ExifTool Version Number         : 12.76  
File Name                       : rebuilt.png
File Size                       : 1.8 MB
MIME Type                       : image/png
Image Width                     : 4032
Image Height                    : 3024
Bit Depth                       : 8
Color Type                      : RGB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Difference:&lt;/strong&gt; 47+ fields reduced to 5 basic fields (format, dimensions only).&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 8: What Should Remain vs. What's Removed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should Be Removed (Privacy/Security):
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;th&gt;Status After CDR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;GPS coordinates, altitude, direction&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Device&lt;/td&gt;
&lt;td&gt;Make, model, serial number&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software&lt;/td&gt;
&lt;td&gt;iOS version, app used, edits&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timestamps&lt;/td&gt;
&lt;td&gt;Creation date, modification date&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Info&lt;/td&gt;
&lt;td&gt;Copyright, author, comments&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thumbnails&lt;/td&gt;
&lt;td&gt;Embedded preview images&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XMP&lt;/td&gt;
&lt;td&gt;Adobe metadata, edit history&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPTC&lt;/td&gt;
&lt;td&gt;News/agency metadata&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What Remains (Essential):
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Fields&lt;/th&gt;
&lt;th&gt;Status After CDR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visual Content&lt;/td&gt;
&lt;td&gt;The actual pixels&lt;/td&gt;
&lt;td&gt;✅ Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dimensions&lt;/td&gt;
&lt;td&gt;Width and height&lt;/td&gt;
&lt;td&gt;✅ Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Color Space&lt;/td&gt;
&lt;td&gt;RGB/RGBA&lt;/td&gt;
&lt;td&gt;✅ Preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Using free online tools like Jeffrey's EXIF Viewer, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;See&lt;/strong&gt; exactly what metadata your images contain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify&lt;/strong&gt; that processing actually removes it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Understand&lt;/strong&gt; the privacy implications&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key insight: &lt;strong&gt;true image rebuilding leaves only pixels&lt;/strong&gt;. No metadata, no hidden data, no traces of the original file structure.&lt;/p&gt;

&lt;p&gt;Try it yourself with your own photos. The results will speak for themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Reference
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Free Metadata Viewers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jeffrey's EXIF Viewer: &lt;code&gt;exif.regex.info/exif.cgi&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ExifMeta: &lt;code&gt;exifmeta.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Jimpl EXIF: &lt;code&gt;jimpl.com/exif&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPS coordinates (biggest privacy risk)&lt;/li&gt;
&lt;li&gt;Device information&lt;/li&gt;
&lt;li&gt;Timestamps&lt;/li&gt;
&lt;li&gt;Embedded thumbnails&lt;/li&gt;
&lt;li&gt;Custom comment fields&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After proper CDR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All metadata fields should be empty&lt;/li&gt;
&lt;li&gt;File should be PNG format&lt;/li&gt;
&lt;li&gt;Only basic image info (dimensions, color type) remains&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Want to Try It Yourself?
&lt;/h2&gt;

&lt;p&gt;If you'd like to test image rebuilding without writing any code, I've put together a step-by-step playground guide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba"&gt;How to Test Image Rebuilding APIs: A Step-by-Step Guide&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It walks you through using the RapidAPI playground to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload test images&lt;/li&gt;
&lt;li&gt;See the processing in action&lt;/li&gt;
&lt;li&gt;Download rebuilt files for verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No coding required—just a browser and 5 minutes.&lt;/p&gt;




&lt;h3&gt;
  
  
  📚 Related Articles in This Series
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41"&gt;Part 1: Why Stripping Metadata is Security Theater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/the-hidden-threat-in-every-image-why-your-upload-validation-is-broken-36d1"&gt;Part 2: The Hidden Threat in Every Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba"&gt;Part 3: How to Test Image Rebuilding API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/hands-on-see-image-metadata-removal-in-action-1c5o"&gt;Part 4: See Image Metadata Removal in Action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>api</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>How to Test Image Rebuilding API: A Step-by-Step Guide</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Sat, 20 Dec 2025 15:02:06 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba</link>
      <guid>https://dev.to/raviteja_nekkalapu_/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba</guid>
      <description>&lt;p&gt;&lt;em&gt;A beginner-friendly walkthrough for testing image security APIs on RapidAPI&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;You've learned about image security threats like polyglot files, steganography, and metadata leaks. Now you want to test an image rebuilding solution to see if it actually works.&lt;/p&gt;

&lt;p&gt;This guide walks you through testing any image CDR (Content Disarm &amp;amp; Reconstruction) API on RapidAPI's playground—no coding required.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A web browser&lt;/li&gt;
&lt;li&gt;An image file to test (any JPEG, PNG, GIF, or WebP)&lt;/li&gt;
&lt;li&gt;5 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No installation. No setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Navigate to the API
&lt;/h2&gt;

&lt;p&gt;Visit the &lt;a href="https://rapidapi.com/image-zero-trust-security-labs/api/zero-trust-api" rel="noopener noreferrer"&gt;Zero Trust API on RapidAPI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You should see the API overview page with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Pricing tiers&lt;/li&gt;
&lt;li&gt;Endpoints&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 2: Subscribe to the Free Tier
&lt;/h2&gt;

&lt;p&gt;Before you can test, you need an API key. RapidAPI handles this automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Click "Subscribe"
&lt;/h3&gt;

&lt;p&gt;You'll see the &lt;strong&gt;pricing section&lt;/strong&gt; with four tiers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Requests/Month&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Testing &amp;amp; evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10/mo&lt;/td&gt;
&lt;td&gt;5,000&lt;/td&gt;
&lt;td&gt;Small projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ultra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$50/mo&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;Production apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mega&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$100/mo&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;High-volume services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Click &lt;strong&gt;"Subscribe"&lt;/strong&gt; on the Basic (free) tier to get started.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Authorize with RapidAPI
&lt;/h3&gt;

&lt;p&gt;If you're not logged in, RapidAPI will ask you to sign in or create an account. You can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Google&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once subscribed, you'll have access to the API playground.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Open the Playground
&lt;/h2&gt;

&lt;p&gt;After subscribing, you'll see the endpoint listed in the left sidebar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Endpoints
├── rebuildImage    ← Click this
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click on &lt;strong&gt;"rebuildImage"&lt;/strong&gt; to open the endpoint details.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Configure the Request
&lt;/h2&gt;

&lt;p&gt;You'll see the playground interface with several tabs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│  App    Params    Headers(2)    Body    Authorizations         │
├────────────────────────────────────────────────────────────────┤
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.1 Check the "App" Tab
&lt;/h3&gt;

&lt;p&gt;Make sure your application and API key are selected. RapidAPI auto-fills this for you.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App: default-application_xxxxx
X-RapidAPI-Key: 97d55cc...  ← Your key (auto-filled)
Request URL: rapidapi.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Go to the "Body" Tab
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;"Body"&lt;/strong&gt; tab. This is where you'll upload your image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│  Media Type          Example Name                              │
│  ┌──────────────┐   ┌──────────────┐                          │
│  │ BINARY    ▼ │   │ New Example  │                          │
│  └──────────────┘   └──────────────┘                          │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│  file                                                          │
│  ┌───────────────────────────────────────────────────┐        │
│  │              📤 Upload                            │        │
│  └───────────────────────────────────────────────────┘        │
│                                                                │
└────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Select BINARY Media Type
&lt;/h3&gt;

&lt;p&gt;Make sure &lt;strong&gt;"BINARY"&lt;/strong&gt; is selected in the Media Type dropdown (not JSON).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Media Type: BINARY  ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.4 Upload Your Test Image
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;"Upload"&lt;/strong&gt; button under the "file" field.&lt;/p&gt;

&lt;p&gt;Select any image from your computer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JPEG (&lt;code&gt;.jpg&lt;/code&gt;, &lt;code&gt;.jpeg&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;PNG (&lt;code&gt;.png&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;GIF (&lt;code&gt;.gif&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;WebP (&lt;code&gt;.webp&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For best testing, use an image you know has metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A photo from your phone (contains GPS, camera info)&lt;/li&gt;
&lt;li&gt;A screenshot with EXIF data&lt;/li&gt;
&lt;li&gt;Any image downloaded from the internet&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 5: Test the Endpoint
&lt;/h2&gt;

&lt;p&gt;With your image uploaded, click the blue &lt;strong&gt;"Test Endpoint"&lt;/strong&gt; button:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────┐
│  ⚡ Test Endpoint       │
└─────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.1 Wait for the Response
&lt;/h3&gt;

&lt;p&gt;The API will process your image. This typically takes 1-3 seconds.&lt;/p&gt;

&lt;p&gt;You'll see a loading indicator while it processes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2 View the Results
&lt;/h3&gt;

&lt;p&gt;After processing, the &lt;strong&gt;"Results"&lt;/strong&gt; tab will show the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│  Code Snippets    Example Responses    Results                 │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│  Response: 200 OK                                              │
│                                                                │
│  Headers:                                                      │
│  ├── content-type: image/png                                   │
│  ├── content-disposition: attachment; filename="rebuilt.png"   │
│  ├── x-rebuilt-by: ZeroTrust-WASM                              │
│  └── content-length: 45678                                     │
│                                                                │
│  Body: [Binary Data - Download Available]                      │
│                                                                │
└────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.3 Download the Rebuilt Image
&lt;/h3&gt;

&lt;p&gt;Click the download link to save your rebuilt image.&lt;/p&gt;

&lt;p&gt;The output will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PNG format&lt;/strong&gt; (regardless of input format)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No metadata&lt;/strong&gt; (completely stripped)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rebuilt from raw pixels&lt;/strong&gt; (not the original container)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 6: Verify the Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Compare File Sizes
&lt;/h3&gt;

&lt;p&gt;The rebuilt file size will often differ from the original because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different format (PNG vs JPEG)&lt;/li&gt;
&lt;li&gt;Different compression&lt;/li&gt;
&lt;li&gt;All metadata removed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 Check Response Headers
&lt;/h3&gt;

&lt;p&gt;Look for these headers in the response:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content-type: image/png&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Output is always PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x-rebuilt-by: ZeroTrust-WASM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Processed by the CDR engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;content-disposition: attachment; filename="rebuilt.png"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Safe filename&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  6.3 Use EXIF Tools to Verify
&lt;/h3&gt;

&lt;p&gt;See our separate guide on using EXIF tools to compare input/output metadata.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the Response Codes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;What to Do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;200&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;td&gt;Your image was rebuilt successfully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;400&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dimensions exceeded&lt;/td&gt;
&lt;td&gt;Image is larger than 4096×4096 pixels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;401&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;td&gt;Check your API key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;413&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;File too large&lt;/td&gt;
&lt;td&gt;Image exceeds 5MB limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;415&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unsupported format&lt;/td&gt;
&lt;td&gt;Use JPEG, PNG, GIF, or WebP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;422&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Malformed file&lt;/td&gt;
&lt;td&gt;File is corrupt or not a valid image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;429&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rate limit&lt;/td&gt;
&lt;td&gt;You've exceeded your quota&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Response is empty"
&lt;/h3&gt;

&lt;p&gt;Make sure you selected &lt;strong&gt;BINARY&lt;/strong&gt; as the Media Type, not JSON.&lt;/p&gt;

&lt;h3&gt;
  
  
  "401 Unauthorized"
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Check that you've subscribed to a plan&lt;/li&gt;
&lt;li&gt;Try refreshing the page&lt;/li&gt;
&lt;li&gt;Make sure your API key is populated in the "App" tab&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  "415 Unsupported Format"
&lt;/h3&gt;

&lt;p&gt;The API only accepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JPEG&lt;/li&gt;
&lt;li&gt;PNG&lt;/li&gt;
&lt;li&gt;GIF&lt;/li&gt;
&lt;li&gt;WebP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other formats (TIFF, BMP, SVG, etc.) are not supported.&lt;/p&gt;

&lt;h3&gt;
  
  
  "The upload button doesn't appear"
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Make sure Media Type is set to &lt;strong&gt;BINARY&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Try a different browser&lt;/li&gt;
&lt;li&gt;Disable ad blockers&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What Just Happened?
&lt;/h2&gt;

&lt;p&gt;When you clicked "Test Endpoint," here's what occurred:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Image                      API Processing                    Output
┌─────────────┐                ┌─────────────────┐              ┌─────────────┐
│ photo.jpg   │                │ 1. Validate     │              │ rebuilt.png │
│             │                │ 2. Decode       │              │             │
│ - 2.4 MB    │ ──────────────▶│ 3. Extract      │─────────────▶│ - 1.8 MB    │
│ - GPS data  │                │    pixels only  │              │ - No GPS    │
│ - Camera    │                │ 4. Destroy      │              │ - No EXIF   │
│   info      │                │    original     │              │ - Pure PNG  │
│ - EXIF      │                │ 5. Rebuild PNG  │              │             │
└─────────────┘                └─────────────────┘              └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The input was completely deconstructed. Only the visual pixels were kept. A brand new, sterile PNG file was created from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Now that you've tested the API:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify the output&lt;/strong&gt; using EXIF analysis tools (Verification guide - &lt;strong&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/hands-on-see-image-metadata-removal-in-action-204a-temp-slug-6127791?preview=398a1aefd872a80afeec5815a359e66e2e8078f5739f024a394c1d4c976f1a61fe21c361c30ab13d0ea70fd5f1066d5fd27b7de329fa20f1f0e38757"&gt;Image Metadata Removal in Action&lt;/a&gt;&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate into your app&lt;/strong&gt; using the code snippets provided in RapidAPI - 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0flo8cnpfl5gfvw068n.jpeg" alt=" " width="800" height="249"&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test edge cases&lt;/strong&gt; with different file types and sizes&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  📚 Related Articles in This Series
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41"&gt;Part 1: Why Stripping Metadata is Security Theater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/the-hidden-threat-in-every-image-why-your-upload-validation-is-broken-36d1"&gt;Part 2: The Hidden Threat in Every Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba"&gt;Part 3: How to Test Image Rebuilding API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/hands-on-see-image-metadata-removal-in-action-1c5o"&gt;Part 4: See Image Metadata Removal in Action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>security</category>
      <category>api</category>
    </item>
    <item>
      <title>The Hidden Threat in Every Image: Why Your Upload Validation is Broken</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Sat, 20 Dec 2025 14:59:20 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/the-hidden-threat-in-every-image-why-your-upload-validation-is-broken-36d1</link>
      <guid>https://dev.to/raviteja_nekkalapu_/the-hidden-threat-in-every-image-why-your-upload-validation-is-broken-36d1</guid>
      <description>&lt;p&gt;&lt;em&gt;A deep technical guide for developers on image-based attack vectors that bypass standard security measures&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;You've probably written code like this a hundred times:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;uploadImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You check the MIME type. You validate the file extension. Maybe you even strip EXIF metadata with a library. You feel secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're not.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2023, security researchers documented over 340 CVEs related to image processing libraries. Major platforms including social media giants, cloud storage providers, and enterprise software have been compromised through image upload vulnerabilities.&lt;/p&gt;

&lt;p&gt;This isn't theoretical. This is happening right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 1: The Anatomy of Image-Based Attacks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Understanding File Formats
&lt;/h3&gt;

&lt;p&gt;Before we dive into attacks, let's understand what an image file actually is.&lt;/p&gt;

&lt;p&gt;A JPEG file isn't just pixels. It's a complex container with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│  JPEG File Structure                        │
├─────────────────────────────────────────────┤
│  ┌─────────────────────────────────────┐    │
│  │ SOI Marker (Start of Image)         │    │
│  │ FF D8                               │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │ APP1 Marker (EXIF Data)             │    │
│  │ - Camera model                      │    │
│  │ - GPS coordinates                   │    │
│  │ - Timestamps                        │    │
│  │ - Thumbnail (another full image!)   │    │
│  │ - Custom fields (ANYTHING)          │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │ DQT (Quantization Tables)           │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │ SOF (Start of Frame)                │    │
│  │ - Image dimensions                  │    │
│  │ - Color components                  │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │ Compressed Image Data               │    │
│  │ (DCT coefficients)                  │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │ EOI Marker (End of Image)           │    │
│  │ FF D9                               │    │
│  └─────────────────────────────────────┘    │
│  ┌─────────────────────────────────────┐    │
│  │ TRAILING DATA                       │    │
│  │ (Ignored by image viewers!)         │    │
│  │ ⚠️ ANYTHING CAN HIDE HERE ⚠️        │    │
│  └─────────────────────────────────────┘    │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;See that "TRAILING DATA" section? Most image parsers stop reading at the EOI marker. But the data is still there. And that's where attackers hide things.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 2: The Three Attack Vectors That Bypass Your Validation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Polyglot Files: The Shape-Shifters
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;polyglot file&lt;/strong&gt; is a file that's valid in multiple formats simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Example: The GIFAR Attack (2008)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In 2008, security researcher Billy Rios demonstrated an attack that combined GIF images with Java JAR files. The same file was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A valid GIF image (browsers displayed it normally)&lt;/li&gt;
&lt;li&gt;A valid Java applet (Java runtime executed it)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal GIF Structure:
[GIF Header: GIF89a] [Image Data] [Trailer: 0x3B]

Polyglot GIFAR:
[GIF Header: GIF89a] [Image Data] [Trailer: 0x3B] [ZIP/JAR Archive]
                                                   ↑
                                         Java reads from here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GIF parsers read from the beginning. ZIP/JAR parsers read from the &lt;strong&gt;end&lt;/strong&gt; (they look for the End of Central Directory signature). Both see a valid file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modern Variants:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Polyglot Type&lt;/th&gt;
&lt;th&gt;Visible Format&lt;/th&gt;
&lt;th&gt;Hidden Format&lt;/th&gt;
&lt;th&gt;Attack Vector&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHAR-JPEG&lt;/td&gt;
&lt;td&gt;JPEG image&lt;/td&gt;
&lt;td&gt;PHP archive&lt;/td&gt;
&lt;td&gt;Server-side code execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF-JS&lt;/td&gt;
&lt;td&gt;PDF document&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;XSS in PDF viewers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG-HTML&lt;/td&gt;
&lt;td&gt;PNG image&lt;/td&gt;
&lt;td&gt;HTML page&lt;/td&gt;
&lt;td&gt;XSS when served with wrong MIME&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GIF-ZIP&lt;/td&gt;
&lt;td&gt;GIF image&lt;/td&gt;
&lt;td&gt;ZIP archive&lt;/td&gt;
&lt;td&gt;Archive extraction vulnerabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Example: PHP Phar Polyglot&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[JPEG Header FF D8 FF] [JPEG Data] [JPEG Footer FF D9] [&amp;lt;?php system($_GET['cmd']); ?&amp;gt;] [Phar Manifest]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passes image validation ✓&lt;/li&gt;
&lt;li&gt;Displays as a normal photo ✓&lt;/li&gt;
&lt;li&gt;Executes as PHP code when accessed via &lt;code&gt;phar://&lt;/code&gt; wrapper ✓&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This attack affected WordPress, Magento, Drupal, and many other PHP applications.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2.2 Steganography: Invisible Data Smuggling
&lt;/h3&gt;

&lt;p&gt;Steganography isn't science fiction. It's a standard tool in Advanced Persistent Threat (APT) operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works: LSB (Least Significant Bit) Encoding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every pixel in an image has color values. In an 8-bit RGB image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original Pixel: RGB(156, 203, 89)

Binary:
R: 10011100 (156)
G: 11001011 (203)  
B: 01011001 (89)
        ↑
        Least Significant Bit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the LSB modifies the color by ±1. The human eye cannot detect this difference:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original: RGB(156, 203, 89)  → Olive green
Modified: RGB(157, 202, 88)  → Still olive green (imperceptible)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Data Capacity:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A 1920×1080 image = 2,073,600 pixels&lt;br&gt;
Each pixel can hide 3 bits (one per color channel)&lt;br&gt;
Total hidden capacity = &lt;strong&gt;778 KB of secret data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-World Attacks Using Steganography:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campaign&lt;/th&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Turla APT&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;PNG images on legitimate websites&lt;/td&gt;
&lt;td&gt;C2 command delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OceanLotus&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;JPEG in spear-phishing emails&lt;/td&gt;
&lt;td&gt;Malware payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platinum APT&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;BMP images&lt;/td&gt;
&lt;td&gt;Exfiltration channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;StegoLoader&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;PNG files&lt;/td&gt;
&lt;td&gt;Malware distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your server becomes a "dead drop" for criminals. The malware doesn't run on your server—but your server hosts the encrypted payload for compromised machines worldwide to download.&lt;/p&gt;

&lt;p&gt;Antivirus scans won't catch it. There's no malicious code in the file—just slightly modified colors that decode to commands when read by malware already on victim machines.&lt;/p&gt;


&lt;h3&gt;
  
  
  2.3 Image Bombs: The Memory Killers
&lt;/h3&gt;

&lt;p&gt;Also called "decompression bombs" or "zip bombs for images."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How It Works:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Image files use compression. A small file can represent a massive image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: The 50KB → 50GB Attack&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Malicious PNG Configuration:
- File size on disk: 50 KB
- Claimed dimensions: 50,000 × 50,000 pixels
- Uncompressed size: 50,000 × 50,000 × 4 bytes = 10 GB

What happens when your server tries to process it:
1. Upload filter sees 50KB file → ✓ Passes size check
2. Server malloc() attempts 10GB allocation
3. OOM Killer terminates your process
4. Service crash → Denial of Service achieved
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Dimension Attacks:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some servers check total file size but not dimensions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Vulnerable code
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;uploaded_file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5_000_000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# 5MB limit
&lt;/span&gt;    &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uploaded_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 💥 BOOM
&lt;/span&gt;    &lt;span class="n"&gt;thumbnail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A malformed image header can claim dimensions of 4,294,967,295 × 4,294,967,295 pixels (max uint32). Just opening this file to read dimensions causes memory allocation failures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Historical Incidents:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2021&lt;/strong&gt;: A single crafted PNG crashed multiple cloud image processing services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2019&lt;/strong&gt;: CVE-2019-19326 in ImageMagick allowed billion-laugh-style attacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2016&lt;/strong&gt;: The "ImageTragick" vulnerability (CVE-2016-3714) affected thousands of websites&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 3: Why Standard "Sanitization" Fails
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 The Metadata Stripping Myth
&lt;/h3&gt;

&lt;p&gt;Many developers believe "just strip the EXIF data" is sufficient. Let's examine this claim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What EXIF stripping tools actually do:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original JPEG:
┌──────────────────────────────────────┐
│ SOI │ APP1 (EXIF) │ Image Data │ EOI │
└──────────────────────────────────────┘

After EXIF stripping:
┌──────────────────────────────────────┐
│ SOI │ Image Data │ EOI              │
└──────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks clean, right? But here's what they &lt;strong&gt;don't&lt;/strong&gt; do:&lt;/p&gt;

&lt;p&gt;❌ They don't verify the image data itself is valid&lt;br&gt;
❌ They don't remove data after the EOI marker&lt;br&gt;
❌ They don't destroy steganographic payloads&lt;br&gt;
❌ They don't check for polyglot structures&lt;br&gt;
❌ They don't enforce dimension limits during processing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Polyglot Survives EXIF Stripping&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before stripping:
[JPEG Header][EXIF][Image][EOI][&amp;lt;?php malicious_code(); ?&amp;gt;]

After stripping:
[JPEG Header][Image][EOI][&amp;lt;?php malicious_code(); ?&amp;gt;]
                         ↑
                         STILL THERE!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The EXIF stripper only touched the EXIF segment. The malicious payload after the EOI marker remains intact.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2 The "Magic Bytes" Fallacy
&lt;/h3&gt;

&lt;p&gt;Some developers check "magic bytes" (file signatures):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# "Secure" validation
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_jpeg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\xFF\xD8&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;# JPEG magic bytes
&lt;/span&gt;
&lt;span class="c1"&gt;# Reality: This checks nothing meaningful
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A polyglot file has valid JPEG magic bytes. A steganographic image has valid magic bytes. An image bomb has valid magic bytes.&lt;/p&gt;

&lt;p&gt;Magic byte checking tells you the file &lt;strong&gt;starts&lt;/strong&gt; like a JPEG. It tells you nothing about what's inside or after.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Library Vulnerabilities
&lt;/h3&gt;

&lt;p&gt;Running untrusted images through processing libraries is inherently dangerous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CVE History for Popular Libraries:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Critical CVEs (2020-2024)&lt;/th&gt;
&lt;th&gt;Common Vulnerabilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ImageMagick&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;RCE, SSRF, DoS, Memory corruption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;libpng&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Buffer overflow, DoS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;libjpeg&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Integer overflow, null pointer dereference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pillow (Python)&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;DoS, buffer overflow, path traversal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sharp (Node.js)&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Memory corruption, DoS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every time you call &lt;code&gt;Image.open()&lt;/code&gt; or &lt;code&gt;sharp()&lt;/code&gt; or &lt;code&gt;convert&lt;/code&gt;, you're passing untrusted data to C code that has had dozens of memory safety vulnerabilities.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 4: The Correct Approach - Content Disarm &amp;amp; Reconstruction (CDR)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Philosophy Shift
&lt;/h3&gt;

&lt;p&gt;Traditional security asks: &lt;strong&gt;"Is this file safe?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is impossible to answer with certainty&lt;/li&gt;
&lt;li&gt;You're looking for "bad" things in an infinite search space&lt;/li&gt;
&lt;li&gt;Attackers always find new hiding spots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CDR asks: &lt;strong&gt;"What do I know is safe?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only the raw pixel values are "good"&lt;/li&gt;
&lt;li&gt;Everything else is discarded&lt;/li&gt;
&lt;li&gt;The search space is exactly one thing: pixels&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.2 The CDR Process
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│                    CDR Pipeline                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   UNTRUSTED INPUT                                          │
│   ┌─────────────┐                                          │
│   │ user.jpg    │   Contains:                              │
│   │             │   - EXIF metadata                        │
│   │  📷🔓       │   - GPS coordinates                      │
│   │             │   - Possible steganography               │
│   │             │   - Possible polyglot payload            │
│   │             │   - Unknown structure                    │
│   └─────────────┘                                          │
│          │                                                  │
│          ▼                                                  │
│   ┌─────────────────────────────────────────────┐          │
│   │ STEP 1: Decode to Raw Pixels               │          │
│   │                                             │          │
│   │ Input → Image Decoder → RGBA Buffer        │          │
│   │                                             │          │
│   │ Only the pixel values are extracted.       │          │
│   │ Container structure is parsed, not copied. │          │
│   └─────────────────────────────────────────────┘          │
│          │                                                  │
│          ▼                                                  │
│   ┌─────────────┐                                          │
│   │ Raw Pixels  │   Just a flat array:                     │
│   │             │   [R,G,B,A, R,G,B,A, R,G,B,A, ...]      │
│   │  🎨         │                                          │
│   │             │   No metadata. No structure.             │
│   │             │   No hidden data. Just colors.           │
│   └─────────────┘                                          │
│          │                                                  │
│          ▼                                                  │
│   ┌─────────────────────────────────────────────┐          │
│   │ STEP 2: Destroy Original Container         │          │
│   │                                             │          │
│   │ 🗑️ Original file is completely discarded   │          │
│   │ 🗑️ All metadata gone                       │          │
│   │ 🗑️ All structure gone                      │          │
│   │ 🗑️ All trailing data gone                  │          │
│   │ 🗑️ All steganography destroyed             │          │
│   └─────────────────────────────────────────────┘          │
│          │                                                  │
│          ▼                                                  │
│   ┌─────────────────────────────────────────────┐          │
│   │ STEP 3: Rebuild New Container              │          │
│   │                                             │          │
│   │ Raw Pixels → PNG Encoder → New File        │          │
│   │                                             │          │
│   │ A brand new file is created from scratch.  │          │
│   │ Only standard PNG structure. No extras.    │          │
│   └─────────────────────────────────────────────┘          │
│          │                                                  │
│          ▼                                                  │
│   GUARANTEED SAFE OUTPUT                                    │
│   ┌─────────────┐                                          │
│   │ output.png  │   Contains:                              │
│   │             │   ✅ Clean PNG structure                 │
│   │  📷🔒       │   ✅ Just pixels, nothing else           │
│   │             │   ✅ No metadata                         │
│   │             │   ✅ No polyglot possible                │
│   │             │   ✅ No steganography                    │
│   │             │   ✅ Mathematically generated            │
│   └─────────────┘                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 What Gets Destroyed
&lt;/h3&gt;

&lt;p&gt;When you rebuild an image from pixels, you eliminate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threat&lt;/th&gt;
&lt;th&gt;How CDR Neutralizes It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EXIF/XMP/IPTC metadata&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Original container discarded; new file has no metadata fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPS coordinates&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Part of metadata; gone with the container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Polyglot payloads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trailing data not copied; new file is pure PNG&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Steganography&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Re-encoding changes compression; hidden bit patterns scrambled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comment fields&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not copied to new container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Thumbnails&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not copied; new file has no embedded images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ICC profiles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Optionally stripped or standardized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Malformed structures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Original structure not preserved; parsing exploits ineffective&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Part 5: Evaluating Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 What to Look For
&lt;/h3&gt;

&lt;p&gt;When choosing an image processing solution for security:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Must-Have Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Full decode/re-encode cycle&lt;/strong&gt; - Not just metadata stripping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory limits&lt;/strong&gt; - Hard caps on allocation to prevent DoS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimension limits&lt;/strong&gt; - Enforced before or during decode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format whitelisting&lt;/strong&gt; - Explicit allow-list, not block-list&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxed execution&lt;/strong&gt; - Processing isolated from host system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No file system access&lt;/strong&gt; - Processing in memory only&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Red Flags:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Strips metadata" (doesn't rebuild)&lt;/li&gt;
&lt;li&gt;"Validates format" (doesn't process)&lt;/li&gt;
&lt;li&gt;"Checks headers" (checks nothing meaningful)&lt;/li&gt;
&lt;li&gt;Uses ImageMagick/GraphicsMagick (CVE-prone)&lt;/li&gt;
&lt;li&gt;No memory/dimension limits mentioned&lt;/li&gt;
&lt;li&gt;Runs on your server (you assume the risk)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.2 The Enterprise CDR Market
&lt;/h3&gt;

&lt;p&gt;Enterprise solutions for CDR exist but are typically:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution Type&lt;/th&gt;
&lt;th&gt;Price Range&lt;/th&gt;
&lt;th&gt;Target Market&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;On-premise appliances&lt;/td&gt;
&lt;td&gt;$50,000 - $500,000+&lt;/td&gt;
&lt;td&gt;Fortune 500, Government&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud enterprise&lt;/td&gt;
&lt;td&gt;$10,000 - $50,000/year&lt;/td&gt;
&lt;td&gt;Mid-market enterprises&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API-based services&lt;/td&gt;
&lt;td&gt;Varies widely&lt;/td&gt;
&lt;td&gt;Developers, SMBs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most enterprise CDR solutions are designed for email attachments and document processing. Image-specific CDR with developer-friendly API access is rare.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: Implementing Secure Image Handling
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Defense in Depth
&lt;/h3&gt;

&lt;p&gt;No single solution is perfect. Layer your defenses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Layer 1: Edge/CDN
├── Rate limiting
├── File size limits at network level  
└── WAF rules for image endpoints

Layer 2: Application
├── Content-Type validation
├── Extension validation
└── Size validation

Layer 3: Processing
├── CDR (decode → destroy → rebuild)
├── Memory limits
└── Timeout limits

Layer 4: Storage
├── Separate domain for user content
├── No-execute permissions
└── Content-Type headers enforced
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Part 7: Testing Your Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Create Test Cases
&lt;/h3&gt;

&lt;p&gt;Before deploying, test against:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Polyglot files&lt;/strong&gt; - JPEG with PHP payload after EOI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimension bombs&lt;/strong&gt; - Small file, massive claimed dimensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steganographic images&lt;/strong&gt; - Use tools like &lt;code&gt;steghide&lt;/code&gt; to embed data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata-heavy files&lt;/strong&gt; - GPS, comments, thumbnails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Malformed structures&lt;/strong&gt; - Truncated files, wrong headers&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  7.2 Verification Checklist
&lt;/h3&gt;

&lt;p&gt;After processing, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Output file has no EXIF/XMP/IPTC data&lt;/li&gt;
&lt;li&gt;[ ] Output file size is reasonable (not the original embedded polyglot size)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;file&lt;/code&gt; command shows clean format identification&lt;/li&gt;
&lt;li&gt;[ ] No trailing data after image end marker&lt;/li&gt;
&lt;li&gt;[ ] Dimensions match expected (within your limits)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Image security is not solved by checking file extensions and stripping metadata. The threat landscape includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polyglot files&lt;/strong&gt; that pass validation but contain executable code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steganographic payloads&lt;/strong&gt; invisible to the human eye and antivirus&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Image bombs&lt;/strong&gt; that crash your servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library vulnerabilities&lt;/strong&gt; in every major image processing tool&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The only complete solution is &lt;strong&gt;Content Disarm &amp;amp; Reconstruction&lt;/strong&gt;: decode to raw pixels, destroy the original container, and rebuild from scratch.&lt;/p&gt;

&lt;p&gt;This eliminates the entire attack surface by reducing the trusted input to exactly one thing—the visual content itself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article is intended for educational purposes.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Continue Learning
&lt;/h2&gt;

&lt;p&gt;If you want to see CDR in action and understand exactly what gets removed from images, I've written a hands-on guide:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/how-to-test-image-rebuilding-apis-a-step-by-step-guide-4be7-temp-slug-4212082?preview=a44ff0445b006765a565708e14e5340b329316916260cff30f309644fc2f82f29d6182bd8223edf32cd6dde1e69a0f25b0439050f9547a1816cb4b3b"&gt;Hands-On: See Image Metadata Removal in Action&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This follow-up guide shows you how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use free online tools to inspect image metadata&lt;/li&gt;
&lt;li&gt;Compare before/after results&lt;/li&gt;
&lt;li&gt;Verify that processing actually eliminates threats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a practical companion to the theory covered here.&lt;/p&gt;




&lt;h3&gt;
  
  
  📚 Related Articles in This Series
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/i-discovered-why-stripping-metadata-from-images-is-security-theater-4i41"&gt;Part 1: Why Stripping Metadata is Security Theater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/the-hidden-threat-in-every-image-why-your-upload-validation-is-broken-36d1"&gt;Part 2: The Hidden Threat in Every Image&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/how-to-test-image-rebuilding-api-a-step-by-step-guide-33ba"&gt;Part 3: How to Test Image Rebuilding API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/ra_vi_51d9667e07aa0984631/hands-on-see-image-metadata-removal-in-action-1c5o"&gt;Part 4: See Image Metadata Removal in Action&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>security</category>
      <category>learning</category>
      <category>api</category>
    </item>
    <item>
      <title>Stop Using Inaccurate Nutrition APIs - How USDA Data Changes Everything</title>
      <dc:creator>Raviteja Nekkalapu</dc:creator>
      <pubDate>Wed, 17 Dec 2025 13:13:33 +0000</pubDate>
      <link>https://dev.to/raviteja_nekkalapu_/stop-using-inaccurate-nutrition-apis-how-usda-data-changes-everything-2e1i</link>
      <guid>https://dev.to/raviteja_nekkalapu_/stop-using-inaccurate-nutrition-apis-how-usda-data-changes-everything-2e1i</guid>
      <description>&lt;h2&gt;
  
  
  The $50 Billion Problem
&lt;/h2&gt;

&lt;p&gt;Health apps are everywhere. Calorie counters. Macro trackers. Diet planners. Fitness companions.&lt;/p&gt;

&lt;p&gt;They all share one critical dependency: &lt;strong&gt;nutrition data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And here's the uncomfortable truth: &lt;strong&gt;most of that data is garbage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I spent months evaluating nutrition APIs for my own projects. What I found was shocking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Crowdsourced databases&lt;/strong&gt; where users enter "100 calories for a slice of pizza" (which slice? what size? what toppings?)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-estimated values&lt;/strong&gt; that hallucinate nutrient content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outdated datasets&lt;/strong&gt; from the 1990s&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing micronutrients&lt;/strong&gt; hidden behind $100+/month paywalls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your users trust these numbers to make health decisions. Some are managing diabetes. Others are tracking pregnancy nutrition. Athletes use them for performance optimization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They deserve accurate data.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Built the Nutrition Tracker API
&lt;/h2&gt;

&lt;p&gt;After failing to find a reliable, affordable nutrition API, I built one myself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core principle: Laboratory-analyzed USDA data, accessible to everyone.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The USDA FoodData Central Advantage
&lt;/h3&gt;

&lt;p&gt;The USDA doesn't guess. They:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collect samples&lt;/strong&gt; from actual food products&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analyze in certified laboratories&lt;/strong&gt; using standardized methods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish peer-reviewed data&lt;/strong&gt; with uncertainty measurements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update regularly&lt;/strong&gt; as food compositions change&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is the same data used by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hospital dietitians&lt;/li&gt;
&lt;li&gt;Academic researchers
&lt;/li&gt;
&lt;li&gt;Government nutrition programs&lt;/li&gt;
&lt;li&gt;Pharmaceutical companies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Now it's available via API for your health app.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What "25+ Nutrients" Actually Means
&lt;/h2&gt;

&lt;p&gt;Every API says they have "comprehensive nutrition data." Here's what ours actually returns:&lt;/p&gt;

&lt;h3&gt;
  
  
  Energy &amp;amp; Macros
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Nutrient&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Energy&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Kilocalories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protein&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Complete amino acid profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Fat&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;With full breakdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carbohydrates&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;By difference method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fiber&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Dietary fiber&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sugars&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Total sugars&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The Fat Breakdown Nobody Else Does
&lt;/h3&gt;

&lt;p&gt;Most APIs: &lt;code&gt;"fat": 15.2&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Our API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Fat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;15.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"g"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"breakdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"saturated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"g"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"monounsaturated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;6.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"g"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"polyunsaturated"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"g"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"trans"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"g"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"other"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"g"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cardiologists recommend limiting saturated fat to &amp;lt;10% of calories&lt;/li&gt;
&lt;li&gt;Trans fats are linked to heart disease—users need to track them&lt;/li&gt;
&lt;li&gt;Monounsaturated fats have different health impacts&lt;/li&gt;
&lt;li&gt;Keto and IIFYM apps need precise fat breakdowns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Complete Vitamin Suite
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vitamin&lt;/th&gt;
&lt;th&gt;Unit&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;IU&lt;/td&gt;
&lt;td&gt;Vision, immune function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B1 (Thiamin)&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Energy metabolism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2 (Riboflavin)&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Cell function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B3 (Niacin)&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;DNA repair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B5 (Pantothenic)&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Hormone production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B6&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Brain development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B12&lt;/td&gt;
&lt;td&gt;µg&lt;/td&gt;
&lt;td&gt;Nerve function, blood cells&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Collagen, immune system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;IU&lt;/td&gt;
&lt;td&gt;Bone health, immunity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Antioxidant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;K&lt;/td&gt;
&lt;td&gt;µg&lt;/td&gt;
&lt;td&gt;Blood clotting, bones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Folate&lt;/td&gt;
&lt;td&gt;µg&lt;/td&gt;
&lt;td&gt;Cell division, pregnancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Choline&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Brain, liver function&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Essential Minerals
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mineral&lt;/th&gt;
&lt;th&gt;Unit&lt;/th&gt;
&lt;th&gt;Key Function&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Calcium&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Bones, muscle function&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Iron&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Oxygen transport&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Magnesium&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;300+ enzyme reactions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phosphorus&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Energy, bone structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Potassium&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Heart rhythm, fluid balance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sodium&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Fluid balance, nerves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zinc&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Immune function, healing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copper&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Iron metabolism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manganese&lt;/td&gt;
&lt;td&gt;mg&lt;/td&gt;
&lt;td&gt;Bone formation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Selenium&lt;/td&gt;
&lt;td&gt;µg&lt;/td&gt;
&lt;td&gt;Thyroid, antioxidant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;All of these. In every response. Including the free tier.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Competitive Analysis
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Nutrition Tracker API&lt;/th&gt;
&lt;th&gt;Competitor A&lt;/th&gt;
&lt;th&gt;Competitor B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free Tier Nutrients&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;25+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fat Breakdown&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Saturated, Mono, Poly, Trans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Total only&lt;/td&gt;
&lt;td&gt;Saturated only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data Source&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;USDA Laboratory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Crowdsourced&lt;/td&gt;
&lt;td&gt;Mixed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Natural Language&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response Time&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt;100ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;300ms&lt;/td&gt;
&lt;td&gt;500ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free Monthly Calls&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,000&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;We're not hiding features behind paywalls. The free tier is genuinely useful.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Integration Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;nutrition_api&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;NutritionAPI&lt;/span&gt;

&lt;span class="n"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NutritionAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100g salmon with lemon and dill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Protein: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Protein&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;g&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vitamin D: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Vitamin D&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Vitamin D&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;unit&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  JavaScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://nutrition-tracker-api.p.rapidapi.com/v1/calculate/natural&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-RapidAPI-Host&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nutrition-tracker-api.p.rapidapi.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;100g salmon with lemon&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nutrients:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalNutrients&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Medical Nutrition Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Track sodium for hypertension patients&lt;/li&gt;
&lt;li&gt;Monitor potassium for kidney disease
&lt;/li&gt;
&lt;li&gt;Calculate folate for pregnancy tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fitness &amp;amp; Performance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Precise protein tracking for athletes&lt;/li&gt;
&lt;li&gt;Electrolyte monitoring&lt;/li&gt;
&lt;li&gt;Micronutrient optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Diet &amp;amp; Lifestyle Apps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Complete keto macros with fat breakdown&lt;/li&gt;
&lt;li&gt;Vegan B12 and iron tracking&lt;/li&gt;
&lt;li&gt;Full nutrient visibility&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Monthly Calls&lt;/th&gt;
&lt;th&gt;Items/Request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$50&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Every tier gets full 25+ nutrient access.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://nutrition-tracker-api.p.rapidapi.com/v1/calculate/natural"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Key: YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Host: nutrition-tracker-api.p.rapidapi.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "1 large apple"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🚀 &lt;strong&gt;&lt;a href="https://rapidapi.com/anonymous617461746174/api/nutrition-tracker-api" rel="noopener noreferrer"&gt;RapidAPI Listing&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;&lt;a href="https://myprojectsravi.github.io/nutrition-api-web/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🐍 &lt;strong&gt;&lt;a href="https://github.com/myProjectsRavi/nutrition-api-python" rel="noopener noreferrer"&gt;Python SDK&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/myProjectsRavi/nutrition-api-js" rel="noopener noreferrer"&gt;JavaScript SDK&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;☕ &lt;strong&gt;&lt;a href="https://github.com/myProjectsRavi/nutrition-api-java" rel="noopener noreferrer"&gt;Java SDK&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Your users deserve nutrition data they can trust.&lt;/p&gt;

&lt;p&gt;Not crowdsourced guesses. Not AI hallucinations. Not 4 nutrients when they need 25.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real USDA laboratory data. Every nutrient. Every tier.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Try it free. Build something amazing.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions? Drop a comment!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
