Mapa kodu
Skąd przychodzą dane, przez które funkcje idą i dokąd trafiają. Problemy są w funkcji, w której powstają; wybierz jeden, żeby zostawić tylko jego ścieżkę.
Wybierz problem
Mapa zostawi wtedy tylko jego ścieżkę: wejście, z którego przychodzą dane, funkcje po drodze i miejsce, do którego trafiają.
Tajny klucz Stripe w kodzie
3const stripe = new Stripe("sk_l****")
- Tu jest problemconst stripe = new Stripe("sk_l****"), src/lib/stripe.ts:3
Z tym kluczem każdy może tworzyć płatności i zwroty oraz czytać dane klientów.
Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera.
Tabela Supabase bez RLS
1create table orders (id uuid primary key, items jsonb, email text);
- Tu jest problemcreate table orders (id uuid primary key, items jsonb, email text);, supabase/migrations/003_orders.sql:1
- UżywaBaza danych
Bez Row Level Security publiczny klucz anon Twojej aplikacji wystarczy, żeby czytać i zmieniać całą tabelę.
Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()).
RLS wyłączony na tabeli
2alter table orders disable row level security;
- Tu jest problemalter table orders disable row level security;, supabase/migrations/003_orders.sql:2
- UżywaBaza danych
Tabelę znowu może czytać i zmieniać każdy z kluczem anon.
Usuń tę linię i włącz RLS z regułami dla każdego użytkownika.
Zapytanie SQL sklejane z tekstu użytkownika
4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)
- WejścieGET /api/search (query: q)
- Przechodzi przezGET(request), src/app/api/search/route.ts:3
- Tu jest problemsearchProducts(q), src/lib/products.ts:4
- UżywaBaza danych
Jeśli wartość pochodzi od użytkownika, może on czytać albo kasować bazę (SQL injection).
Używaj parametrów (%s, ?, $1) albo ORM zamiast wklejać wartości do zapytania.
Mapa powstaje z czytania kodu (Python, JavaScript i TypeScript), bez uruchamiania go: wywołanie dynamiczne albo dekorator mogą umknąć. Zapisujemy tylko nazwy funkcji i tras oraz numery linii.
Z tym kluczem każdy może tworzyć płatności i zwroty oraz czytać dane klientów.
Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera.
1 miejsce w kodzie
src/lib/stripe.ts:3const stripe = new Stripe("sk_l****")
Zobacz prompt
W src/lib/stripe.ts:3: Tajny klucz Stripe w kodzie. Unieważnij klucz w panelu Stripe, a potem czytaj go ze zmiennej środowiskowej po stronie serwera. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Bez Row Level Security publiczny klucz anon Twojej aplikacji wystarczy, żeby czytać i zmieniać całą tabelę.
Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()).
1 miejsce w kodzie
supabase/migrations/003_orders.sql:1create table orders (id uuid primary key, items jsonb, email text);
Zobacz prompt
W supabase/migrations/003_orders.sql:1: Tabela Supabase bez RLS. Dodaj „alter table … enable row level security;”, a potem reguły, które ograniczają każdy wiersz do właściciela (auth.uid()). Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Tabelę znowu może czytać i zmieniać każdy z kluczem anon.
Usuń tę linię i włącz RLS z regułami dla każdego użytkownika.
1 miejsce w kodzie
supabase/migrations/003_orders.sql:2alter table orders disable row level security;
Zobacz prompt
W supabase/migrations/003_orders.sql:2: RLS wyłączony na tabeli. Usuń tę linię i włącz RLS z regułami dla każdego użytkownika. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Jeśli wartość pochodzi od użytkownika, może on czytać albo kasować bazę (SQL injection).
Używaj parametrów (%s, ?, $1) albo ORM zamiast wklejać wartości do zapytania.
1 miejsce w kodzie
src/lib/products.ts:4const res = await pool.query(`SELECT * FROM products WHERE name LIKE '%${q}%'`)Dane wysłane przez użytkownika w src/app/api/search/route.ts:4, przekazane przez searchProducts (src/app/api/search/route.ts:5), użyte tutaj bez sprawdzenia.
Zobacz prompt
W src/lib/products.ts:4: Zapytanie SQL sklejane z tekstu użytkownika. Używaj parametrów (%s, ?, $1) albo ORM zamiast wklejać wartości do zapytania. Popraw tylko te miejsca, a potem wyjaśnij mi zmianę.
Co sprawdza analiza kodu
Klucze i hasła wpisane w kod (Stripe, AWS, GitHub, GitLab, OpenAI, Anthropic, Hugging Face, SendGrid, Slack, Telegram, Google, tokeny npm i PyPI, adresy baz danych z hasłem, klucze prywatne, pliki .env), tajny klucz aplikacji wpisany na sztywno, sekrety wystawione przeglądarce (NEXT_PUBLIC_, VITE_…), klucz service_role Supabase po stronie przeglądarki, tabele Supabase bez RLS albo z otwartymi regułami (we wszystkich migracjach projektu), reguły Firebase otwarte albo w „trybie testowym”, widoki i funkcje Supabase omijające RLS, zapytania SQL i polecenia systemowe sklejane z tekstu, zapytania, pliki i przekierowania wybierane przez użytkownika (także gdy wartość przechodzi przez zmienną kilka linii wyżej), dane zapisywane bez wyboru pól, wczytywanie danych, które może wykonać kod, hasła haszowane MD5 albo porównywane ze stałą wartością, osłabiona ochrona CSRF albo ciasteczka sesji, tokeny w localStorage albo losowane przez Math.random, włączony tryb debug, wyłączona weryfikacja TLS albo JWT, CORS otwarty z danymi logowania i HTML wstawiany bez oczyszczenia. Przykładowe wartości (your-key, xxxx), domyślne hasła lokalne, komentarze, testy i konfiguracje testowe nie są zgłaszane, z wyjątkiem sekretów.
W projekcie analiza zapisuje też, które paczki są importowane w kodzie: podatność w paczce, której kod nigdy nie importuje i której według pliku blokady nie potrzebuje żadna inna paczka, spada o jeden poziom, z powodem. Znalezione pliki zależności (package-lock.json, requirements.txt, composer.lock…) od razu dają nową wersję analizy zależności.
Kod jest czytany w pamięci i zapominany: Tamiso zatrzymuje tylko nazwę pliku, linię i krótki fragment z zamaskowanymi sekretami. Katalogi zależności i budowania (node_modules, dist…) są pomijane. Analiza regułami nie zastępuje przeglądu bezpieczeństwa.
Jak to działa
Reguły na częste błędy
Sekrety, Supabase i Firebase, wstrzyknięcia SQL, otwarte przekierowania, zostawiony tryb debug. Każda reguła ma identyfikator CWE i poprawkę w jednym zdaniu.
Mapa kodu
Skąd przychodzą dane (trasy, skrypty), przez które funkcje przechodzą i dokąd trafiają: baza danych, maile, pliki, usługi zewnętrzne. Każdy problem leży na swojej ścieżce.
Kod nie jest przechowywany
Archiwum jest czytane w pamięci, a potem zapominane. Tamiso zapisuje plik, linię, regułę i krótki fragment z zamaskowanym sekretem.