Задать вопрос

Как закрывать бекенд API от «левого» доступа?

При создании Single Page Application, фронтенд обращается к бекенду посредством API. Появляется проблема: Если API публичный, то есть рассчитан на отдачу контента для гостей (не авторизованных пользователей), то проверить авторизацию мы уже не можем, а значит любой злоумышленник сможет спарсить сайт, отправив запрос на site.ru/api/ с вызовом метода getLatestPosts. Понимаю, что спарсить можно все, но не хочу, чтобы для злоумышленника эта задача была такой простой. Хочу понять, как в таких случаях определить реально ли клиентский запрос, или он идет от какого-то PHP парсера, должны же быть какие то способы проверки?

Спасибо!
  • Вопрос задан
  • 2948 просмотров
Подписаться 7 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 5
@Quieteroks
php программист
Вы можете делать как это делают платежные сервисы. Имеется секретный ключ, известный Вашего публичному и Вашему "приватному" серверу с API. Передаваемые данные собираются в кучу и хэшируются с секретным ключом. Это хэш для проверки отправляется дополнительным параметром для валидации на стороне приватного сервера. Кто не знает секретный ключ, не сможет правильно составить запрос.

Ну или Вам вполне можно разместить API сервер во внутренней сети с публичным сервером, если на приватный не нужен доступ из вне.
Ответ написан
AMar4enko
@AMar4enko
Правильно вам ответил DevMan - ограничение количества запросов, синтетическое увеличение времени ответа сервера при подозрительной активности. В основном все упирается в поведенческий анализ - если кто-то (IP-адрес или можно поискать библиотеки для более сложной эвристики определения уникальных пользователей) целенаправленно стучится по одному и тому же API endpoint, перебирая параметр пагинации, то вас, скорей всего, парсят - ставим этот IP-адрес в список подозрительных и добавляем ему синтетическую задержку ответа в 3 секунды и лимит одновременных соединений. А если он настойчивый, то и вовсе баним
Ответ написан
Комментировать
catanfa
@catanfa
В общем случае правильный ответ на этот вопрос никак. Если у вас публичное апи, доступное любому браузеру, то несложным софтом его можно простучать. Если вы будете ставить какие-то преграды, вроде ограничения на частоту запросов с одного айпи, какие-то куки-шмуки и т.д., но при этом из браузера всё будет работать, то и из парсера, после несложной подкрутки со стороны злоумышленника, тоже всё будет работать. В конце концов, что мне мешает просто человеческими руками "прокликать" весь ваш сайт и сохранить все страницы через File -> Save Web Page As.. ?
Между прочим, поисковые роботы Яндекса и Гугла тоже парсят ваш сайт, и вы скорее всего не хотели бы их банить.
Ответ написан
Комментировать
@mr_ko
Javascript, Node.js. React.js, Vue.js, Wordpress
Для авторизации в API можно использовать JWT.
Ответ написан
Комментировать
Rou1997
@Rou1997
А это очень надо - защищать?
А почему сразу злоумышленник?
Вот вы вообще пишете, что у вас публичное API, и тут же пишете, что хотите запретить им пользоваться. :)

как в таких случаях определить реально ли клиентский запрос, или он идет от какого-то PHP парсера

Если хотите проверить идет ли запрос от браузера или от парсера, то проверяйте HTTP-заголовки, если парсер "кривой" то это поможет, еще лучше примените HTTPS с HSTS, а еще лучше перейдите с HTTP на другой протокол, вот это серьезно повысит "планку" для квалификации так называемого "злоумышленника".

должны же быть какие то способы проверки?

Кроме IP-адреса все остальное подделывается, вообще весь этот стек IP-TCP-HTTP мало что "должен", в прошлом веке о таких вещах не думали, в протоколе TCP нет и гораздо более нужных возможностей.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы