Bezpieczeństwo
Bezpieczeństwo — serio, nie na pokaz
Flat-file CMS bez bazy danych eliminuje całą kategorię ataków (SQL injection nie istnieje, bo nie ma SQL). Ale bezpieczeństwo to więcej niż brak bazy.
Hasło i autentykacja
Bcrypt hashing — hasło nie jest przechowywane jako tekst. Hash bcrypt (cost 10+) jest praktycznie nie do złamania brute-force. Brute-force protection — po zbyt wielu nieudanych próbach logowania konto jest tymczasowo blokowane. Dane o próbach w osobnym pliku JSON (login_attempts.json). CSRF tokens — każdy formularz w panelu admina zawiera unikalny token. Timing-safe comparison — odporność na timing attacks.
.htaccess hardening
Plik .htaccess dostarczan y z CMS-em zawiera pełną konfigurację bezpieczeństwa: blokada dostępu do data.json (plik z hasłem i danymi), blokada katalogu backups/ (ZIP-y z danymi), blokada plików PHP w katalogu uploads/ (zapobiega wykonaniu złośliwego kodu), blokada plików konfiguracyjnych (.htaccess, .git, composer.json, package.json), wyłączenie listowania katalogów (Options -Indexes). Security headers: X-Frame-Options (SAMEORIGIN — ochrona przed clickjacking), X-XSS-Protection (ochrona przeglądarki przed XSS), X-Content-Type-Options (nosniff), Referrer-Policy (strict-origin-when-cross-origin). Gotowe do odkomentowania: Strict-Transport-Security (HSTS — wymuszenie HTTPS), Content-Security-Policy (CSP).
Path traversal prevention
Funkcje obsługujące pliki (upload, download, backup) sprawdzają ścieżki — nie można wydostać się poza dozwolone katalogi. realpath() + strpos() = pewność że plik jest tam gdzie powinien być.
Backup i restore
Tworzenie backupu z panelu admina: jeden klik generuje ZIP zawierający data.json + katalog uploads/ (wszystkie zdjęcia). Download na komputer. Restore: upload ZIP — dane i zdjęcia przywrócone. Lista backupów w panelu z datami i rozmiarami. Backup to najważniejsze narzędzie bezpieczeństwa — jeśli cokolwiek pójdzie nie tak, restore przywraca stronę do działającego stanu w sekundy.
Input sanitization
Każdy input od użytkownika (formularze, upload) jest sanityzowany: htmlspecialchars, filter_var, sanitizeInput(), sanitizeEmail(). Treść HTML stron: przepuszczana przez sanitizeHtml() z whitelistą dozwolonych tagów — blokada niebezpiecznych (script, iframe, event handlers).