Teraz Ty: wyślij formularz albo poślij bota
Zobaczysz każdą kontrolę formd i to, co trafia do skrzynki.
Albo wyślij jako bot:
- Tokenformd.js pobrał jednorazowy token przy otwarciu strony
- Praca przeglądarkiproof-of-work, 16 bitów
- Źródłoczy formularz przyszedł z Twojej strony
- Limit dla IPnajwyżej 5 zgłoszeń w 10 minut
- Czas wypełnieniaczłowiek potrzebuje co najmniej 3 sekund
- Pole-pułapkaukryte pole musi zostać puste
- Duplikatta sama treść drugi raz nie przejdzie
- Zapis i mailezgłoszenie i maile w jednej transakcji SQLite
- Tu pojawią się maile, gdy zgłoszenie przejdzie.
Zatrzymane boty: 0. Żaden nie dotarł do skrzynki.
Postaw to u siebie
Potrzebujesz serwera z Linuksem, domeny i nginx albo Caddy. Wpisz swoją domenę, a wszystkie polecenia poniżej się do niej dopasują.
-
Pobierz formd
Jedna statycznie linkowana binarka dla Linuksa x86-64 albo ARM64. Sprawdź sumę kontrolną przed instalacją.
Wolisz zbudować sam? Wystarczy Go 1.27.2 lub nowsze:
go build -o formd ./cmd/formdw sklonowanym repozytorium.curl -LO https://github.com/dc9-dev/formd/releases/download/v0.1.0/formd-linux-amd64 curl -LO https://github.com/dc9-dev/formd/releases/download/v0.1.0/SHA256SUMS sha256sum --check --ignore-missing SHA256SUMS -
Zainstaluj usługę
Skrypt zakłada systemowego użytkownika
formd, kopiuje binarkę do/usr/local/bin, tworzy/etc/formd/formd.envz uprawnieniami 0640 i instaluje utwardzoną jednostkę systemd.git clone --depth 1 --branch v0.1.0 https://github.com/dc9-dev/formd cd formd sudo sh deploy/install.sh ../formd-linux-amd64 -
Ustaw pocztę
W
/etc/formd/formd.envwybierz sposób wysyłki. Zacznij odlog, jeśli chcesz najpierw sprawdzić formularz bez wysyłania maili.MAILER=smtp MAIL_FROM="Strona <no-reply@twojastrona.pl>" SMTP_HOST=smtp.twojastrona.pl SMTP_PORT=587 SMTP_USER= SMTP_PASS= SMTP_TLS=starttlsMAILER=ses MAIL_FROM="Strona <no-reply@twojastrona.pl>" AWS_REGION=eu-central-1 # poświadczenia: rola IAM instancji albo # AWS_ACCESS_KEY_ID i AWS_SECRET_ACCESS_KEYMAILER=log # maile trafiają tylko do dziennika: # journalctl -u formd -f -
Uruchom i załóż konto
Konto do panelu wymaga hasła z co najmniej 12 znaków. Hasło jest zapisywane w argon2id.
sudo systemctl enable --now formd sudo -u formd formd -env /etc/formd/formd.env user add admin # formd odpowiada tylko lokalnie curl http://127.0.0.1:8025/healthz -
Wystaw /f/ przez HTTPS
formd słucha tylko na 127.0.0.1, więc świat widzi go przez Twój serwer WWW. Przekazuj wyłącznie ścieżkę
/f/, nigdy panelu.Caddy sam pobierze certyfikat przy pierwszym starcie.
# sudo certbot --nginx -d twojastrona.pl server { listen 443 ssl; server_name twojastrona.pl; ssl_certificate /etc/letsencrypt/live/twojastrona.pl/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/twojastrona.pl/privkey.pem; root /var/www/twojastrona.pl; location /f/ { client_max_body_size 64k; proxy_pass http://127.0.0.1:8025; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; } location / { return 404; } }twojastrona.pl { root * /var/www/twojastrona.pl handle /f/* { request_body { max_size 64KB } reverse_proxy 127.0.0.1:8025 { header_up X-Real-IP {remote_host} } } handle { file_server respond 404 } } -
Otwórz panel i dodaj formularz
Panel działa na osobnym porcie i nie wychodzi do internetu. Otwierasz go tunelem SSH ze swojego komputera, potem wchodzisz na
http://localhost:8026.W panelu utwórz formularz
kontakt, dodaj originhttps://twojastrona.pl, ustaw pola i adres, na który mają przychodzić powiadomienia. Potem go włącz.ssh -L 8026:127.0.0.1:8026 twojastrona.pl -
Wstaw formularz na stronę
Zwykły HTML i jeden skrypt, który pobiera token i liczy proof-of-work. Gotowy kod dla każdego formularza jest też w panelu, w zakładce „Kod HTML”.
Jeśli strona ma nagłówek CSP, dopisz
forms.twojastrona.pldoscript-src,connect-srciform-action.<form action="/f/kontakt" method="post" data-formd="ajax"> <input name="name" required> <input type="email" name="email" required> <textarea name="message" required></textarea> <div style="position:absolute;left:-10000px" aria-hidden="true"> <input name="website" tabindex="-1" autocomplete="off"> </div> <button>Wyślij</button> <p data-formd-status role="status"></p> </form> <script src="/f/formd.js" defer></script> -
Sprawdź z zewnątrz
Skrypt i token powinny odpowiadać przez HTTPS. Potem wyślij formularz ze strony i zobacz zgłoszenie w panelu.
curl -I https://twojastrona.pl/f/formd.js # HTTP/2 200 curl https://twojastrona.pl/f/kontakt/challenge # {"bits":16,"min_seconds":3,"token":"…"}
Kopie zapasowe, aktualizacje, fail2ban i ocena treści przez Jev: README na GitHubie.
Panel widzisz tylko Ty
Otwierasz go tunelem SSH i nie wystawiasz do internetu. Dane zostają na Twoim serwerze, hasła są w argon2id, sesje po stronie serwera, z ochroną CSRF.
formd