Files
go-lcg/test_csrf.sh

159 lines
6.8 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 🛡️ CSRF Protection Test Script
# Тестирует CSRF защиту LCG приложения
echo "🛡️ Тестирование CSRF защиты LCG"
echo "=================================="
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Функция для вывода результатов
print_result() {
local test_name="$1"
local status="$2"
local message="$3"
if [ "$status" = "PASS" ]; then
echo -e "${GREEN}$test_name: PASS${NC} - $message"
elif [ "$status" = "FAIL" ]; then
echo -e "${RED}$test_name: FAIL${NC} - $message"
else
echo -e "${YELLOW}⚠️ $test_name: $status${NC} - $message"
fi
}
# Проверяем, запущен ли сервер
echo -e "${BLUE}🔍 Проверяем доступность сервера...${NC}"
if ! curl -s http://localhost:8080/login > /dev/null 2>&1; then
echo -e "${RED}❌ Сервер не доступен на localhost:8080${NC}"
echo "Запустите сервер командой: LCG_SERVER_REQUIRE_AUTH=true ./lcg serve -p 8080"
exit 1
fi
echo -e "${GREEN}✅ Сервер доступен${NC}"
# Тест 1: Попытка выполнения команды без CSRF токена
echo -e "\n${BLUE}🧪 Тест 1: Выполнение команды без CSRF токена${NC}"
response=$(curl -s -w "%{http_code}" -X POST http://localhost:8080/api/execute \
-H "Content-Type: application/json" \
-d '{"prompt":"whoami","system_id":"1"}' \
-o /dev/null)
if [ "$response" = "403" ]; then
print_result "CSRF защита /api/execute" "PASS" "Запрос заблокирован (403 Forbidden)"
else
print_result "CSRF защита /api/execute" "FAIL" "Запрос прошел (HTTP $response)"
fi
# Тест 2: Попытка сохранения результата без CSRF токена
echo -e "\n${BLUE}🧪 Тест 2: Сохранение результата без CSRF токена${NC}"
response=$(curl -s -w "%{http_code}" -X POST http://localhost:8080/api/save-result \
-H "Content-Type: application/json" \
-d '{"result":"test result","command":"test command"}' \
-o /dev/null)
if [ "$response" = "403" ]; then
print_result "CSRF защита /api/save-result" "PASS" "Запрос заблокирован (403 Forbidden)"
else
print_result "CSRF защита /api/save-result" "FAIL" "Запрос прошел (HTTP $response)"
fi
# Тест 3: Попытка добавления в историю без CSRF токена
echo -e "\n${BLUE}🧪 Тест 3: Добавление в историю без CSRF токена${NC}"
response=$(curl -s -w "%{http_code}" -X POST http://localhost:8080/api/add-to-history \
-H "Content-Type: application/json" \
-d '{"prompt":"test prompt","result":"test result"}' \
-o /dev/null)
if [ "$response" = "403" ]; then
print_result "CSRF защита /api/add-to-history" "PASS" "Запрос заблокирован (403 Forbidden)"
else
print_result "CSRF защита /api/add-to-history" "FAIL" "Запрос прошел (HTTP $response)"
fi
# Тест 4: Проверка GET запросов (должны работать)
echo -e "\n${BLUE}🧪 Тест 4: GET запросы (должны работать)${NC}"
response=$(curl -s -w "%{http_code}" http://localhost:8080/login -o /dev/null)
if [ "$response" = "200" ]; then
print_result "GET запросы" "PASS" "GET запросы работают (HTTP $response)"
else
print_result "GET запросы" "FAIL" "GET запросы не работают (HTTP $response)"
fi
# Тест 5: Проверка наличия CSRF токена на странице входа
echo -e "\n${BLUE}🧪 Тест 5: Наличие CSRF токена на странице входа${NC}"
csrf_token=$(curl -s http://localhost:8080/login | grep -o 'name="csrf_token"[^>]*value="[^"]*"' | sed 's/.*value="\([^"]*\)".*/\1/')
if [ -n "$csrf_token" ]; then
print_result "CSRF токен на странице входа" "PASS" "Токен найден: ${csrf_token:0:20}..."
else
print_result "CSRF токен на странице входа" "FAIL" "Токен не найден"
fi
# Тест 6: Попытка атаки с поддельным CSRF токеном
echo -e "\n${BLUE}🧪 Тест 6: Атака с поддельным CSRF токеном${NC}"
response=$(curl -s -w "%{http_code}" -X POST http://localhost:8080/api/execute \
-H "Content-Type: application/json" \
-H "X-CSRF-Token: fake_token" \
-d '{"prompt":"whoami","system_id":"1"}' \
-o /dev/null)
if [ "$response" = "403" ]; then
print_result "CSRF защита от поддельного токена" "PASS" "Поддельный токен заблокирован (403 Forbidden)"
else
print_result "CSRF защита от поддельного токена" "FAIL" "Поддельный токен принят (HTTP $response)"
fi
# Итоговый отчет
echo -e "\n${BLUE}📊 Итоговый отчет:${NC}"
echo "=================================="
# Подсчитываем результаты
total_tests=6
passed_tests=0
# Проверяем каждый тест
if curl -s -w "%{http_code}" -X POST http://localhost:8080/api/execute -H "Content-Type: application/json" -d '{"prompt":"test"}' -o /dev/null | grep -q "403"; then
((passed_tests++))
fi
if curl -s -w "%{http_code}" -X POST http://localhost:8080/api/save-result -H "Content-Type: application/json" -d '{"result":"test"}' -o /dev/null | grep -q "403"; then
((passed_tests++))
fi
if curl -s -w "%{http_code}" -X POST http://localhost:8080/api/add-to-history -H "Content-Type: application/json" -d '{"prompt":"test"}' -o /dev/null | grep -q "403"; then
((passed_tests++))
fi
if curl -s -w "%{http_code}" http://localhost:8080/login -o /dev/null | grep -q "200"; then
((passed_tests++))
fi
if curl -s http://localhost:8080/login | grep -q 'name="csrf_token"'; then
((passed_tests++))
fi
if curl -s -w "%{http_code}" -X POST http://localhost:8080/api/execute -H "Content-Type: application/json" -H "X-CSRF-Token: fake" -d '{"prompt":"test"}' -o /dev/null | grep -q "403"; then
((passed_tests++))
fi
echo -e "Пройдено тестов: ${GREEN}$passed_tests${NC} из ${BLUE}$total_tests${NC}"
if [ $passed_tests -eq $total_tests ]; then
echo -e "${GREEN}🎉 Все тесты пройдены! CSRF защита работает корректно.${NC}"
exit 0
elif [ $passed_tests -ge 4 ]; then
echo -e "${YELLOW}⚠️ Большинство тестов пройдено, но есть проблемы с CSRF защитой.${NC}"
exit 1
else
echo -e "${RED}❌ Критические проблемы с CSRF защитой!${NC}"
exit 2
fi