← Назад к вопросам

Какие знаешь безопасные методы http?

2.0 Middle🔥 161 комментариев
#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Безопасные HTTP методы

Безопасный (safe) HTTP метод — это метод, который не изменяет состояние сервера. Он только читает данные.

Определение безопасности

Метод безопасен, если:

  1. Он предназначен только для чтения информации
  2. Не создаёт, не изменяет и не удаляет ресурсы на сервере
  3. Не имеет побочных эффектов (кроме логирования)
  4. Может быть вызван множество раз без вреда

Безопасные методы 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).