#!/bin/bash # Проверка защиты работающего кабинета снаружи. Ничего не меняет: только запросы к страницам. B=${1:-http://127.0.0.1:8099} pass=0; fail=0 ok(){ echo " ✓ $1"; pass=$((pass+1)); } no(){ echo " ✗ $1"; fail=$((fail+1)); } chk(){ if [ "$2" = "$3" ]; then ok "$1"; else no "$1 (получено: $2, ожидали: $3)"; fi } H=$(curl -s -m8 -D- -o /dev/null $B/login) echo "Заголовки защиты:" for h in "X-Frame-Options: DENY" "X-Content-Type-Options: nosniff" "Referrer-Policy: same-origin" "frame-ancestors 'none'" "default-src 'none'" "no-store" "Permissions-Policy"; do echo "$H" | grep -qi -- "$h" && ok "$h" || no "нет: $h"; done echo "Куки:" echo "$H" | grep -i "set-cookie: bj_lk_csrf" | grep -qi "httponly" && ok "токен формы HttpOnly" || no "токен формы без HttpOnly" echo "$H" | grep -i "set-cookie: bj_lk_csrf" | grep -qi "samesite=strict" && ok "SameSite=Strict" || no "нет SameSite=Strict" HS=$(curl -s -m8 -D- -o /dev/null -H "X-Forwarded-Proto: https" -H "Host: lk.example.ru" $B/login) echo "$HS" | grep -i "set-cookie" | grep -qi "secure" && ok "за nginx с TLS куки получают Secure" || no "куки без Secure за TLS" echo "$HS" | grep -qi "strict-transport-security" && ok "HSTS за TLS" || no "нет HSTS за TLS" echo "Сторонние ресурсы:" P=$(curl -s -m8 $B/login) echo "$P" | grep -qiE "https?://[^\"' ]*(googleapis|gstatic|cdn|jsdelivr|unpkg)" && no "страница тянет сторонние ресурсы" || ok "сторонних адресов на странице нет" echo "$P" | grep -qi " big.bin c=$(curl -s -m15 -o /dev/null -w '%{http_code}' -X POST --data-binary @big.bin -H "Content-Type: application/x-www-form-urlencoded" $B/login); rm -f big.bin [ "$c" != "303" ] && ok "тело 2,5 МБ не принято как вход (код $c)" || no "большое тело принято" echo "Подделка сессии:" c=$(curl -s -m8 -o /dev/null -w "%{http_code} %{redirect_url}" -b "bj_lk=0000000000000000000000000000000000000000000000000; bj_lk_admin=1" $B/clients) b=$(curl -s -m8 -b "bj_lk=0000000000000000000000000000000000000000000000000; bj_lk_admin=1" $B/clients | grep -c "Открыть кабинет") chk "кука bj_lk_admin=1 без сессии не даёт списка клиентов" "$b" "0" echo; echo "ИТОГО: пройдено $pass, не пройдено $fail"