„Bezpieczeństwo Replit" to dwie rzeczy, które warto rozdzielić. Pierwsza to Repl i jego wdrożenie: gdzie żyją sekrety, kto widzi Twoje pliki, który URL jest publiczny i który port jest wystawiony. Druga to kod, który generuje Replit Agent, zwykle serwer Express z Reactem i bazą Postgres, przynoszący klasyczne błędy backendu pisanego w pośpiechu. Ten przewodnik obejmuje obie, z blokiem do pliku, który Agent czyta przy każdym żądaniu, promptem do przeglądu przed wdrożeniem i kontrolami z zewnątrz.
Część 1: zabezpieczenie Repla i wdrożenia
Sekrety: zakładka Secrets, nie kod
Replit ma menedżer sekretów, który przechowuje zmienne zaszyfrowane i udostępnia je procesowi jako zmienne środowiskowe, bez pojawiania się w jakimkolwiek pliku. To jedyne właściwe miejsce na klucze API, connection string bazy danych i sekret sesji. Typowy błąd polega na tym, że Agent, albo Ty w pośpiechu, wpisuje je do .env, do config.json albo wprost do kodu. Te pliki są częścią Repla: widać je w publicznym Replu, kopiują się przy forku i są wdrażane.
Publiczne Reple i URL deweloperski
Publiczny Repl pokazuje wszystkie swoje pliki każdemu, łącznie z tymi, o których zapomniałeś: kopie zapasowe, stary .env, eksporty danych. Zanim ustawisz go jako publiczny, przejrzyj całe drzewo. A dopóki Repl działa, URL deweloperski .replit.dev odpowiada każdemu, kto go ma; to nie jest prywatne środowisko, tylko serwer w internecie z Twoimi danymi testowymi.
Wdrożenia
Wdrożenie publikuje aplikację na subdomenie .replit.app albo Twojej domenie, z automatycznym TLS. Zmienne środowiskowe wdrożenia konfiguruje się osobno od deweloperskich, więc sprawdź, czy produkcja nie wskazuje na bazę testową. Wystawiony jest tylko zadeklarowany port, ale wszystko, co ten port serwuje, jest publiczne: ścieżki API, pliki statyczne i to, co serwer zwróci przez pomyłkę. Replit nie dodaje nagłówków bezpieczeństwa; ustawia je Twój serwer.
Wbudowana baza danych i uwierzytelnianie
Wbudowana baza Postgres przekazuje swój connection string jako sekret; nigdy nie kopiuj go do pliku. Jeśli używasz Replit Auth, sesją zarządza Replit, a Twój kod dostaje już zidentyfikowanego użytkownika, ale każda ścieżka nadal musi sprawdzać, czy jest sesja i czy ten użytkownik może zrobić to, o co prosi.
Część 2: błędy, które Agent wkłada do Twojego kodu
- Sekrety w plikach. Klucz OpenAI albo string Postgresa w
.env, w stałej albo wconfig.jsonserwowanym jako plik statyczny. - Ścieżki API bez uwierzytelnienia. Panel sprawdza sesję w Reakcie;
/api/usersodpowiada każdemu. - Zbyt szerokie katalogi statyczne.
express.staticwskazujący na katalog główny projektu serwujepackage.json,.replit, kod serwera i każdy zapomniany plik. A bezindex.htmlniektóre serwery wyświetlają listę katalogu. - Ścieżki debugowe i seed.
/api/debug,/api/seed,/api/resetstworzone do testów i wdrożone. - Otwarty CORS z poświadczeniami.
cors()bez opcji plus ciasteczka sesji: każda strona działa w imieniu Twoich użytkowników. - Zapytania SQL przez konkatenację. String sklejony z tego, co przychodzi z formularza, zamiast parametrów.
- Uploady plików na dysk serwowane bez zmian. Każdy użytkownik wgrywa plik, a każdy odwiedzający pobiera go po nazwie.
- Brak limitu żądań i nagłówków. Endpoint wywołujący płatny model bez limitu i ani jednego nagłówka bezpieczeństwa.
Blok, który Agent zastosuje zawsze
Replit Agent czyta plik replit.md w Twoim projekcie jako stały kontekst. Dodaj tę sekcję:
## Reguły bezpieczeństwa
- Klucze, string bazy danych i sekret sesji są czytane z process.env i żyją w zakładce Secrets. Nigdy w .env, config.json ani w kodzie.
- Każda ścieżka API czytająca lub zapisująca dane sprawdza sesję i uprawnienia użytkownika na serwerze. Sprawdzenia w Reakcie się nie liczą.
- express.static serwuje tylko katalog builda frontendu albo public/, nigdy katalog główny projektu.
- Żadnych ścieżek debugowych, seed ani reset na produkcji.
- CORS z jawną listą originów; nigdy wildcard z poświadczeniami.
- Wszystkie zapytania SQL używają parametrów. Każde dane z formularza są walidowane na serwerze.
- Wgrane pliki są przechowywane poza katalogiem publicznym i serwowane tylko po sprawdzeniu uprawnień.
- Nagłówki bezpieczeństwa przez helmet i limit żądań na ścieżkach, które kosztują.
I nagłówki w Expressie, w dwóch linijkach:
import helmet from 'helmet';
app.use(helmet());
app.use(helmet.hsts({ maxAge: 63072000, includeSubDomains: true, preload: true }));
Prompt do przeglądu przed wdrożeniem
Przejrzyj bezpieczeństwo tego projektu i na razie niczego nie zmieniaj. Odpowiedz listą:
1. Klucze, connection stringi lub sekrety zapisane w plikach albo w kodzie, z plikiem i linią.
2. Ścieżki API czytające lub zapisujące dane bez sprawdzania sesji oraz ścieżki debugowe, seed lub reset.
3. Katalogi serwowane jako statyczne i jakie pliki wystawiają.
4. Konfiguracja CORS i ciasteczek sesji.
5. Zapytania SQL budowane przez konkatenację i niewalidowane dane wejściowe.
6. Gdzie są przechowywane wgrane pliki i jak są serwowane.
7. Czy istnieją nagłówki bezpieczeństwa i limit żądań.
Dla każdego punktu zaproponuj dokładną zmianę i poczekaj na moje potwierdzenie.
Sprawdź wynik z zewnątrz
curl -sI https://twojadomena.com | grep -iE "strict-transport|x-frame|x-content-type|content-security"
for p in .env .replit package.json config.json .git/config server.js uploads/; do printf "%-14s " "$p"; curl -s -o /dev/null -w "%{http_code}\n" "https://twojadomena.com/$p"; done
curl -s -o /dev/null -w "%{http_code}\n" https://twojadomena.com/api/users
Oczekiwane: obecne nagłówki, 404 na całej liście plików i 401 lub 403 na ścieżce API bez sesji. 200 na package.json albo .replit oznacza, że serwujesz katalog główny projektu. Scanaris wykonuje te kontrole i około czterdziestu innych w 30 sekund: szuka wystawionych plików i list katalogów, endpointów odpowiadających bez sesji, sekretów w JavaScripcie, sprawdza nagłówki, CORS, ciasteczka i TLS, a dla każdego błędu daje fix prompt do wklejenia w czacie Agenta. I może skanować ponownie codziennie, bo ponowne wygenerowanie może przywrócić błąd, który już naprawiłeś.
Często zadawane pytania
Czy wartości z zakładki Secrets widać w publicznym Replu?
Nie, sekrety nie są pokazywane ani kopiowane przy forku. Widać za to całą resztę: pliki, kod i każdy klucz wpisany w nich zamiast w Secrets.
Czy URL deweloperski jest prywatny?
Nie. Dopóki Repl działa, odpowiada każdemu, kto ma link. Nie używaj go z prawdziwymi danymi i nie udostępniaj, myśląc, że tylko Ty go widzisz.
Czy Replit ustawia nagłówki bezpieczeństwa we wdrożeniach?
Nie. Daje TLS i domenę, ale nagłówki wysyła Twój serwer. W Expressie helmet dodaje je w dwóch linijkach; w innych frameworkach ich odpowiednik.