PKCE (Proof Key for Code Exchange, RFC 7636) — расширение OAuth 2.0, защищающее authorization code от кражи в public clients (SPA, mobile apps без secure storage). Клиент генерирует random code_verifier → отправляет hash (code_challenge) в authorize URL → при обмене code на token отправляет обратно original verifier. Без PKCE attacker, перехвативший code, может получить access_token.
Ниже: подробности, пример, смежные термины, FAQ.
Бесплатный онлайн-инструмент — сканер безопасности сайта: результат мгновенно, без регистрации.
code_verifier = base64url(random(32)) // "dBjftJeZ..."
code_challenge = base64url(sha256(code_verifier))
auth_url = authorize?client_id=X&code_challenge=CC&code_challenge_method=S256PKCE (Proof Key for Code Exchange) — это механизм, который обеспечивает безопасность процесса обмена кодом авторизации в OAuth 2.0 для публичных клиентов, таких как мобильные приложения и одностраничные приложения. Он предотвращает атаки с использованием перехваченных кодов авторизации, добавляя дополнительный уровень защиты за счет использования динамически генерируемого ключа.
PKCE улучшает стандартный процесс авторизации OAuth 2.0, добавляя два важных параметра: code_verifier и code_challenge. Code_verifier — это случайная строка, создаваемая клиентом, а code_challenge — это хэш этой строки, который передается на сервер авторизации. Весь процесс можно разбить на несколько шагов:
code_verifier с использованием алгоритма SHA-256, и результат кодируется в строку Base64 URL.code_challenge и указание метода хэширования.code_verifier. Сервер проверяет соответствие code_verifier и code_challenge.Только если оба параметра совпадают, сервер выдает токен доступа.
Для реализации PKCE в приложении на Python можно использовать библиотеку OAuthLib. Ниже приведен пример, демонстрирующий процесс авторизации с использованием PKCE:
import os
import base64
import hashlib
import requests
# Генерация code_verifier
code_verifier = base64.urlsafe_b64encode(os.urandom(32)).decode('utf-8').rstrip('=')
# Генерация code_challenge
code_challenge = base64.urlsafe_b64encode(hashlib.sha256(code_verifier.encode('utf-8')).digest()).decode('utf-8').rstrip('=')
# URL авторизации
auth_url = 'https://authorization-server.com/auth'
# Параметры запроса на авторизацию
params = {
'response_type': 'code',
'client_id': 'your_client_id',
'redirect_uri': 'your_redirect_uri',
'scope': 'your_scope',
'code_challenge': code_challenge,
'code_challenge_method': 'S256'
}
# Отправка запроса на авторизацию
response = requests.get(auth_url, params=params)
# Получение кода авторизации из ответа
# ...
# Запрос на получение токена доступа
# ...
В этом примере сначала генерируется code_verifier и code_challenge. Затем отправляется запрос на авторизацию, после чего можно обработать полученный код для дальнейшего получения токена доступа.
Инструмент проверяет HTTP-заголовки безопасности, конфигурацию SSL/TLS, утечки серверной информации и защиту от распространённых атак (XSS, clickjacking, MIMEsniffing). Оценка от A до F показывает общий уровень защиты.
Проверка Content-Security-Policy, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy и других.
Версия TLS, срок сертификата, цепочка доверия, поддержка HSTS.
Поиск раскрытых серверных версий, debug-режимов, открытых конфигов и директорий.
Детальный отчёт с объяснением каждой проблемы и конкретными шагами для исправления.
аудит HTTP-заголовков
проверка конфигурации
CSP и HSTS настройка
соответствие стандартам
Strict-Transport-Security.Server: Apache/2.4.52 помогает атакующим подобрать эксплойт. Скройте версию.DENY или SAMEORIGIN.nosniff браузер может интерпретировать файлы неправильно (MIME sniffing).Content-Security-Policy-Report-Only, мониторьте нарушения, затем включите.Server, X-Powered-By, X-AspNet-Version из ответов.История security-проверок и мониторинг HTTP-заголовков безопасности.
Зарегистрироваться (FREE)Рекомендуется (OAuth 2.1 draft), но не обязателен. Для public clients (SPA, mobile) — mandatory.
Все major: Google, GitHub, Microsoft, Auth0, Okta, Keycloak. Yandex OAuth — с 2022.
Только S256 (SHA-256) в production. Plain (verifier=challenge) legacy и небезопасный.
Бесплатный тариф — 10 мониторов, проверки каждые 5 мин, без карты. Платные тарифы — интервал от 1 минуты и проверки из нескольких регионов.