foxguard 0.12.0

A security scanner as fast as a linter, written in Rust. 200+ built-in rules across 12 source languages.
Documentation
---
---

<section class="py-24">
  <div class="max-w-5xl mx-auto px-6">

    <h2 class="font-heading text-noir-50 text-3xl sm:text-4xl mb-4">Cross-file taint analysis</h2>
    <p class="text-noir-500 text-base mb-12">foxguard tracks untrusted input across files in eight languages — Python, JavaScript, Go, Java, Ruby, PHP, C#, and Kotlin — linking a source in one file to a sink in another in 0.03 seconds.</p>

    <!-- Code example -->
    <div class="grid md:grid-cols-2 gap-px bg-noir-800 rounded-xl overflow-hidden mb-8">
      <div class="bg-noir-950 p-5">
        <div class="text-noir-600 text-xs mb-3 font-mono">views.py</div>
        <pre class="text-[13px] font-mono leading-relaxed"><code class="text-noir-400"><span class="text-purple-400">from</span> . <span class="text-purple-400">import</span> queries

<span class="text-purple-400">def</span> <span class="text-blue-400">search</span>(request):
    name = <span class="text-amber-400">request.GET</span>["name"]
    <span class="text-purple-400">return</span> queries.<span class="text-red-400">run_query</span>(name)</code></pre>
      </div>
      <div class="bg-noir-950 p-5">
        <div class="text-noir-600 text-xs mb-3 font-mono">queries.py</div>
        <pre class="text-[13px] font-mono leading-relaxed"><code class="text-noir-400"><span class="text-purple-400">def</span> <span class="text-blue-400">run_query</span>(name):
    cur = db.cursor()
    cur.<span class="text-red-400">execute</span>(
        <span class="text-green-400">"SELECT * FROM users"</span>
        <span class="text-green-400">" WHERE name = '"</span> + <span class="text-red-400">name</span> + <span class="text-green-400">"'"</span>
    )</code></pre>
      </div>
    </div>

    <!-- Flow -->
    <div class="flex flex-wrap items-center gap-2 text-xs sm:text-sm font-mono text-noir-600 mb-16">
      <span class="text-amber-400">request.GET</span>
      <span>&rarr;</span>
      <span>views.py</span>
      <span>&rarr;</span>
      <span>queries.py</span>
      <span>&rarr;</span>
      <span class="text-red-400">cursor.execute</span>
    </div>

    <!-- Features grid -->
    <div class="grid sm:grid-cols-3 gap-8">
      <div>
        <h3 class="text-noir-100 text-sm font-medium mb-2">Dataflow traces</h3>
        <p class="text-noir-500 text-sm leading-relaxed">
          <code class="text-noir-400">--explain</code> prints the full source-to-sink path, file and line, plus a fix.
        </p>
      </div>
      <div>
        <h3 class="text-noir-100 text-sm font-medium mb-2">Confidence-scored</h3>
        <p class="text-noir-500 text-sm leading-relaxed">
          Findings are ranked by dataflow depth, so the most certain ones surface first.
        </p>
      </div>
      <div>
        <h3 class="text-noir-100 text-sm font-medium mb-2">Branch diffing</h3>
        <p class="text-noir-500 text-sm leading-relaxed">
          <code class="text-noir-400">foxguard diff main</code> shows only findings your branch introduces.
        </p>
      </div>
    </div>

  </div>
</section>