@Bezlepkin
Yii, PHP, JS, Android

Как обезопасить сервер при получении POST?

Привет! У меня два сервер. Один шлет другому через curl файлы на загрузку.
Стоит ли слать токен что бы принимающая сторна проверяла источник, или достаточно знать что POST идет с доверенного домена?
  • Вопрос задан
  • 1100 просмотров
Пригласить эксперта
Ответы на вопрос 3
Adamos
@Adamos
Обычное дело - добавляете подпись: sha256(собранные в строку данные + известный обеим сторонам ключ). И проверяете ее, отбрасывая прочие запросы.
У меня, например, хостер (Таймвеб) своими роботами регулярно щупает мои скрипты, к которым происходят внешние обращения. От платежных систем, например. При том, что ссылок на них нигде нет. То ли ботов ищут, то ли еще что. Естественно, такие запросы обрабатывать - себе дороже.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Почитайте как сделать правильно REST API (для POST и не только).
  • HASH - подпись с применением функций хеширования и формул конкатенации данных запроса.
  • RANDOM - случайная строка символов или число для создания уникального запроса
  • TIMESTAMP - контроль давности запроса на стороне сервера.

Кратко: нужно три дополнительных параметра (кроме параметров запроса к API): HASH, RANDOM, TIMESTAMP.
HASH - формируем по TOKEN'у (его мы получаем заранее от сервера) на основе всех данных, передаваемых при запросе к API: API-параметры, RANDOM и TIMESTAMP.
Проверяем подпись при получении запроса и сравниваем с HASH: если подпись равна HASH - исполняем запрос.
 

UPD: про домен (доп.вариант проверки):
Входные данные, которым мы хотим доверять:
1. Доменное имя клиента API: домен_ожидаемый
2. TXT-запись домена клиента API: TXT_запись_ожидаемая

Имеющиеся данные (при получении запроса к API от клиента):
3. IP клиента API: IP(1)

При инициализации новой сессии (перед формировании нового токена), можно делать 3-4 DNS-запроса к любому публичному DNS-серверу (перед непосредственной генерацией токена!):
1. reverse_lookup (IP(1) клиента API в имя домена(1)) => узнали домен(1).
2. lookup (домен(1) в IP(2) по A-записи) => узнали IP(2)
3. снова reverse_lookup (IP(2) в имя домена(2)).
4. По желанию: можно проверить наличие нужных TXT-записей (и любых других) и сравнить с ожидаемыми (т.н., "статический публичный токен").

После получения всех данных, проверяем:
Домен_ожидаемый===домен(1) && IP(1)===IP(2) && домен(1)===домен(2) && TXT_запись_ожидаемая===TXT_запись_полученная

Если выражение истинно, то выписываем токен на обратившийся клиентский IP для предоставления доступа этому клиенту для начала работы с нашим API.
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
Я бы шифровал данные при пересылке. Приемник расшифровывает содержимое известным ему ключом и либо получает правильные данные и их обрабатывает, либо какую-то фигню и забивает на неё.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы