# API Security Test Suite # mockupAWS v1.0.0 # # This test suite covers API-specific security testing including: # - Authentication bypass attempts # - Authorization checks # - Injection attacks (SQL, NoSQL, Command) # - Rate limiting validation # - Input validation # - CSRF protection # - CORS configuration import pytest import requests import json import time from typing import Dict, Any import jwt # Configuration BASE_URL = "http://localhost:8000" API_V1 = f"{BASE_URL}/api/v1" INGEST_URL = f"{BASE_URL}/ingest" class TestAPISecurity: """API Security Tests for mockupAWS v1.0.0""" @pytest.fixture def auth_token(self): """Get a valid authentication token""" # This would typically create a test user and login # For now, returning a mock token structure return "mock_token" @pytest.fixture def api_headers(self, auth_token): """Get API headers with authentication""" return { "Authorization": f"Bearer {auth_token}", "Content-Type": "application/json", } # ============================================ # AUTHENTICATION TESTS # ============================================ def test_login_with_invalid_credentials(self): """Test that invalid credentials are rejected""" response = requests.post( f"{API_V1}/auth/login", json={"username": "invalid@example.com", "password": "wrongpassword"}, ) assert response.status_code == 401 assert "error" in response.json() or "detail" in response.json() def test_login_sql_injection_attempt(self): """Test SQL injection in login form""" malicious_inputs = [ "admin' OR '1'='1", "admin'--", "admin'/*", "' OR 1=1--", "'; DROP TABLE users; --", ] for payload in malicious_inputs: response = requests.post( f"{API_V1}/auth/login", json={"username": payload, "password": payload} ) # Should either return 401 or 422 (validation error) assert response.status_code in [401, 422] def test_access_protected_endpoint_without_auth(self): """Test that protected endpoints require authentication""" protected_endpoints = [ f"{API_V1}/scenarios", f"{API_V1}/metrics/dashboard", f"{API_V1}/reports", ] for endpoint in protected_endpoints: response = requests.get(endpoint) assert response.status_code in [401, 403], ( f"Endpoint {endpoint} should require auth" ) def test_malformed_jwt_token(self): """Test handling of malformed JWT tokens""" malformed_tokens = [ "not.a.token", "Bearer ", "Bearer invalid_token", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.invalid", ] for token in malformed_tokens: headers = {"Authorization": f"Bearer {token}"} response = requests.get(f"{API_V1}/scenarios", headers=headers) assert response.status_code in [401, 403, 422] def test_expired_jwt_token(self): """Test handling of expired JWT tokens""" # Create an expired token expired_token = jwt.encode( {"sub": "test", "exp": 0}, "secret", algorithm="HS256" ) headers = {"Authorization": f"Bearer {expired_token}"} response = requests.get(f"{API_V1}/scenarios", headers=headers) assert response.status_code in [401, 403] # ============================================ # AUTHORIZATION TESTS # ============================================ def test_access_other_user_scenario(self, api_headers): """Test that users cannot access other users' scenarios""" # Try to access a scenario ID that doesn't belong to user response = requests.get( f"{API_V1}/scenarios/00000000-0000-0000-0000-000000000000", headers=api_headers, ) assert response.status_code in [403, 404] def test_modify_other_user_scenario(self, api_headers): """Test that users cannot modify other users' scenarios""" response = requests.put( f"{API_V1}/scenarios/00000000-0000-0000-0000-000000000000", headers=api_headers, json={"name": "Hacked"}, ) assert response.status_code in [403, 404] def test_delete_other_user_scenario(self, api_headers): """Test that users cannot delete other users' scenarios""" response = requests.delete( f"{API_V1}/scenarios/00000000-0000-0000-0000-000000000000", headers=api_headers, ) assert response.status_code in [403, 404] # ============================================ # INPUT VALIDATION TESTS # ============================================ def test_xss_in_scenario_name(self, api_headers): """Test XSS protection in scenario names""" xss_payloads = [ "", "", "javascript:alert('xss')", "