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

Можно ли что-то удалить методом GET?

2.2 Middle🔥 191 комментариев
#API тестирование#Теория тестирования

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Можно ли удалить что-то методом GET в HTTP?

Нет, стандарт HTTP/1.1 (RFC 7231) прямо указывает, что метод GET предназначен только для извлечения информации (retrieval) и не должен иметь побочных эффектов (side effects), изменяющих состояние сервера, таких как удаление, создание или модификация данных. Использование GET для операций удаления является нарушением семантики протокола и считается плохой практикой с серьёзными последствиями для безопасности, надёжности и архитектуры приложения.

Почему GET не должен использоваться для удаления: ключевые причины

  1. Нарушение семантики и стандартов (RESTful принципы):
    *   В RESTful API методы HTTP имеют чёткое назначение: `GET` — чтение, `POST` — создание, `PUT` — обновление/замена, `DELETE` — удаление.
    *   Использование GET для удаления вводит в заблуждение разработчиков, которые поддерживают API, и системы (кэши, прокси), которые полагаются на эти соглашения.

  1. Проблемы безопасности (Security Risks):
    *   **Уязвимость к CSRF (Cross-Site Request Forgery)**: Ссылка с GET-запросом на удаление (например, `<img src="https://api.example.com/delete?id=123">`) может быть автоматически выполнена браузером жертвы, посетившей вредоносную страницу.
    *   **Утечка в логах и истории**: URL с параметрами удаления (например, `?action=delete&id=123`) остаётся в логах сервера, истории браузера, referrer headers, что может привести к случайному или злонамеренному повторному выполнению.

  1. Проблемы с кэшированием и прокси (Caching Issues):
    *   Промежуточные прокси-серверы и кэши браузера могут кэшировать GET-запросы, считая их безопасными (идемпотентными и без побочных эффектов). Это может привести к неожиданному повторному удалению при повторном обращении к кэшированному URL.

  1. Ненадёжность и случайные срабатывания:
    *   Поскольку GET-запросы часто кэшируются и предзагружаются браузерами (например, для предсказания навигации), операция удаления может выполниться непреднамеренно.
    *   Веб-сканеры (например, Googlebot) или инструменты проверки доступности, проходя по ссылкам, могут случайно удалить данные.

Техническая реализация: правильный способ vs. опасный способ

Опасный и неверный подход (использование GET для удаления)

# Пример на Python (Flask) - КАТЕГОРИЧЕСКИ НЕ РЕКОМЕНДУЕТСЯ
from flask import Flask, request

app = Flask(__name__)
resources = {1: "Data A", 2: "Data B", 3: "Data C"}

@app.route('/delete_resource', methods=['GET'])
def delete_via_get():
    resource_id = request.args.get('id')
    if resource_id and int(resource_id) in resources:
        del resources[int(resource_id)]
        return f"Ресурс {resource_id} удалён!", 200
    return "Ресурс не найден", 404

# Достаточно перейти по ссылке в браузере или встроить её в страницу:
# https://example.com/delete_resource?id=2

Правильный и безопасный подход (использование DELETE или POST)

# Пример на Python (Flask) - корректное использование метода DELETE
from flask import Flask, request, jsonify

app = Flask(__name__)
resources = {1: "Data A", 2: "Data B", 3: "Data C"}

@app.route('/api/resource/<int:resource_id>', methods=['DELETE'])
def delete_resource(resource_id):
    if resource_id in resources:
        del resources[resource_id]
        return jsonify({"message": f"Ресурс {resource_id} удалён"}), 200
    return jsonify({"error": "Ресурс не найден"}), 404

# Для выполнения запроса нужен HTTP-клиент, который отправляет DELETE:
# curl -X DELETE https://example.com/api/resource/2
// Пример на JavaScript (Frontend) - отправка DELETE запроса
async function deleteResource(resourceId) {
    try {
        const response = await fetch(`/api/resource/${resourceId}`, {
            method: 'DELETE',
            headers: {
                'Content-Type': 'application/json',
                // Обязательно добавляем защиту от CSRF, например:
                'X-CSRF-Token': getCSRFToken()
            }
        });

        if (response.ok) {
            console.log('Ресурс успешно удалён');
        } else {
            console.error('Ошибка при удалении');
        }
    } catch (error) {
        console.error('Сетевая ошибка:', error);
    }
}

Вывод для QA Automation инженера

Как специалист по автоматизированному тестированию, вы должны:

  • Чётко понимать и отстаивать правильное использование HTTP-методов в проекте.
  • Тестировать на соответствие стандартам: Включать проверки в тесты API, что операции изменения состояния (delete, create, update) не выполняются через GET.
  • Проверять безопасность: Использовать инструменты (например, OWASP ZAP) для выявления уязвимостей, связанных с неправильным использованием HTTP-методов.
  • Документировать ожидания: Убедиться, что спецификация API (OpenAPI/Swagger) правильно отражает используемые методы.

Итог: Хотя технически сервер можно запрограммировать на удаление данных при получении GET-запроса, это является грубой архитектурной ошибкой. Для операций удаления всегда следует использовать метод DELETE (в идеале для RESTful API) или, как минимум, POST, которые семантически предназначены для операций с побочными эффектами и имеют встроенные механизмы защиты (например, обязательность CSRF-токенов в веб-фреймворках).

Можно ли что-то удалить методом GET? | PrepBro