Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Безопасные HTTP методы
Безопасный (safe) HTTP метод — это метод, который не изменяет состояние сервера. Он только читает данные.
Определение безопасности
Метод безопасен, если:
- Он предназначен только для чтения информации
- Не создаёт, не изменяет и не удаляет ресурсы на сервере
- Не имеет побочных эффектов (кроме логирования)
- Может быть вызван множество раз без вреда
Безопасные методы HTTP
1. GET (главный безопасный метод)
import requests
# Получить ресурс — безопасно
response = requests.get("https://api.example.com/users/123")
print(response.json()) # Только читаем
# Параметры запроса
response = requests.get(
"https://api.example.com/search",
params={"q": "python", "limit": 10}
)
Свойства GET:
- Нет тела запроса (данные в URL)
- Может кэшироваться
- Видно в истории браузера
- Не должен менять состояние на сервере
2. HEAD (как GET, но без тела ответа)
import requests
# HEAD — получить только заголовки (метаинформация)
response = requests.head("https://api.example.com/large-file")
print(response.headers) # Content-Length, Content-Type, etc
print(len(response.content)) # 0 (нет тела!)
# Использование: проверить размер файла без загрузки
if int(response.headers.get('Content-Length', 0)) > 100_000_000:
print("File too large, skip")
Свойства HEAD:
- Идентичен GET по функционалу
- НО не передаёт тело ответа
- Экономит трафик
- Может кэшироваться
3. OPTIONS (получить доступные методы)
import requests
# OPTIONS — узнать, какие методы поддерживает ресурс
response = requests.options("https://api.example.com/users")
print(response.headers.get('Allow')) # GET, POST, PUT, DELETE, OPTIONS
# Используется для CORS preflight запросов
Свойства OPTIONS:
- Возвращает заголовок Allow
- Используется для CORS (Cross-Origin Resource Sharing)
- Может кэшироваться
4. TRACE (редко используется)
# TRACE — вернёт копию запроса (для отладки)
# Редко используется и часто отключён на серверах
response = requests.request("TRACE", "https://api.example.com/users")
Свойства TRACE:
- Не изменяет состояние
- Возвращает копию запроса для отладки
- Часто отключён (уязвимость безопасности)
НЕБЕЗОПАСНЫЕ (unsafe) методы
1. POST (создание)
import requests
# POST — создаёт новый ресурс (НЕ безопасен!)
response = requests.post(
"https://api.example.com/users",
json={"name": "John", "email": "john@example.com"}
)
# Сервер создаёт нового пользователя
2. PUT (полное обновление)
# PUT — заменяет весь ресурс (НЕ безопасен!)
response = requests.put(
"https://api.example.com/users/123",
json={"name": "Jane", "email": "jane@example.com"}
)
# Весь пользователь перезаписан
3. PATCH (частичное обновление)
# PATCH — изменяет часть ресурса (НЕ безопасен!)
response = requests.patch(
"https://api.example.com/users/123",
json={"name": "Jane"} # Только имя
)
4. DELETE (удаление)
# DELETE — удаляет ресурс (НЕ безопасен!)
response = requests.delete("https://api.example.com/users/123")
# Пользователь удалён
Сравнительная таблица
| Метод | Безопасен | Идемпотентен | Кэшируется | Описание |
|---|---|---|---|---|
| GET | ✅ | ✅ | ✅ | Чтение |
| HEAD | ✅ | ✅ | ✅ | Чтение метаинформации |
| OPTIONS | ✅ | ✅ | ✅ | Получить опции |
| TRACE | ✅ | ✅ | ❌ | Отладка |
| POST | ❌ | ❌ | ❌ | Создание |
| PUT | ❌ | ✅ | ❌ | Замена |
| PATCH | ❌ | ❌ | ❌ | Частичное обновление |
| DELETE | ❌ | ✅ | ❌ | Удаление |
Почему это важно: Идемпотентность
Идемпотентный метод — результат одинаков при многократном вызове
import requests
# GET идемпотентен (вызовем 100 раз, результат всегда одинаков)
for _ in range(100):
response = requests.get("https://api.example.com/users/123")
assert response.json() == {"id": 123, "name": "John"}
# POST НЕ идемпотентен (каждый вызов создаёт новое)
for i in range(3):
response = requests.post(
"https://api.example.com/users",
json={"name": f"User {i}"}
)
# Созданы 3 разных пользователя!
# PUT идемпотентен (переписывает на одно и то же значение)
for _ in range(100):
response = requests.put(
"https://api.example.com/users/123",
json={"name": "Jane"} # Всегда одно и то же
)
# Результат одинаков
Практическое применение
REST API правила:
# Безопасные операции → GET
GET /api/users # Получить всех
GET /api/users/123 # Получить одного
GET /api/users?role=admin # Фильтр
# Создание → POST
POST /api/users # Создать нового (автогенерирует ID)
# Полная замена → PUT
PUT /api/users/123 # Заменить пользователя 123
# Частичное изменение → PATCH
PATCH /api/users/123 # Изменить только некоторые поля
# Удаление → DELETE
DELETE /api/users/123 # Удалить пользователя
Безопасность:
# Правильно: читаем только безопасными методами
response = requests.get(
"https://api.example.com/public-data"
)
# Неправильно: не делай побочных эффектов через GET!
# https://api.example.com/users/123?action=delete ❌ ПЛОХО
# Правильно: используй DELETE
response = requests.delete("https://api.example.com/users/123") ✅
Выводы
Безопасные методы: GET, HEAD, OPTIONS, TRACE
- Только читают, не меняют состояние
- Могут вызваться множество раз без вреда
- Кэшируются браузером
Небезопасные методы: POST, PUT, PATCH, DELETE
- Меняют состояние сервера
- Требуют подтверждения
- Не должны вызваться случайно
Это критично для безопасности: браузеры защищают нас, предотвращая случайные POST запросы при переходе по ссылке, потому что это может быть опасно (CSRF).