javascript — защита конечных точек PHP, вызываемых AJAX.

Мое приложение состоит из нескольких конечных точек PHP, которые доступны через AJAX. Проблема в том, что они также доступны через любого, кто делает HTTP-запрос к той же конечной точке. Я могу добавить чеки для HTTP_X_REQUESTED_WITH а также HTTP_REFERER как указано в этот ответ, но они могут быть подделаны. Я мог бы добавить секретный ключ, который необходимо опубликовать вместе с запросом, но любой, кто просматривает javascript и / или консоль, сможет увидеть этот ключ. Какое решение здесь?

2

Решение

Люди часто думают, что потому что они регулярно используют запросы Ajax sessions не работает Они делают.
Если у вас есть конечная точка для удаления чего-либо из базы данных, которая видна в исходном коде, например:

example.com/user/1/delete

Вы можете защитить этот запрос от пользователей, не прошедших проверку подлинности, так же, как и при использовании HTTP-запроса без Ajax в браузере. С помощью сессий. Если у пользователя есть права на удаление пользователей, этот маршрут будет работать, в противном случае вы получите ошибку (или ничего не сделаете).

Вы также можете защитить API с помощью OAuth. Здесь есть отличный документ, который объясняет, как это работает: http://tatiyants.com/using-oauth-to-protect-internal-rest-api/

4

Другие решения

Большинство ответов бесполезны, например, если у вас есть приложение и API на разных доменах. app.example.com а также api.example.com — в этом случае сессии не будут работать, и вам придется обратиться к OAuth, который является довольно большим молотком для такой простой проблемы.

Вот что я бы сделал:

Я предполагаю, что у вас есть пользователи в базе данных и уникальный идентификатор, такой как user_id=12345, Я также предполагаю, что у вас есть ваши рабочие места в базе данных, и они также имеют уникальные идентификаторы, такие как job_id=6789,

Сначала на app.example.com вы шифруете оба идентификатора с помощью чего-то быстрого и простого, например, Blowfish:

$secret_uid = mcrypt_encrypt(MCRYPT_BLOWFISH, "your_secret", strval($user_id));
$secret_jid = mcrypt_encrypt(MCRYPT_BLOWFISH, "your_secret", strval($job_id));

Я предполагаю, что ваша конечная точка будет работать примерно так:

api.example.com/jobs/delete/<job_id>/<user_id>

так что теперь из Ajax вы вызываете эту конечную точку, но вместо того, чтобы звонить с простыми идентификаторами

api.example.com/jobs/delete/6789/12345

Вы называете это с зашифрованными идентификаторами:

api.example.com/jobs/delete/6A73D5B557C622B3/57F064C07F83644F

На стороне API вашего программного обеспечения вы расшифровываете параметры:

$jid = mcrypt_decrypt(MCRYPT_BLOWFISH, "your_secret", <param_1>);
$uid = mcrypt_decrypt(MCRYPT_BLOWFISH, "your_secret", <param_2>);

Теперь вы можете искать в вашей БД uid а также jid и выполнить любую задачу, которую вы планировали сделать. Убедитесь, что пользователь может удалить только свои рабочие места, конечно.

Я признаю, что это не 100% решение, но оно оставляет злоумышленнику много работы с угадыванием — он должен будет угадать user_id и соответствующий job_id, алгоритм шифрования и ваш секрет. Он не защищает от запуска миллионов попыток грубой силы угадать совпадающую пару, но он ставит шансы в вашу пользу (в любом случае у вас должна быть какая-то защита от ограничения квот ваших конечных точек).

Удачи!

3

Там нет ни одного. Если вы дадите кому-то какие-то данные, они смогут обработать их любым удобным для них способом. Вы не можете контролировать, что происходит с ним после того, как он покидает ваш сервер.

Кроме того, вы не можете контролировать, какие данные они отправляют в конечную точку.

2

Для разработчика очень важно поставить аутентификацию для API или веб-сервисов. dchacke а также BugHunterUK дал прекрасные ответы, я просто хочу показать вам простой код, который я использую, чтобы сделать очень простой и простой в использовании аутентификацию.

Добавление сеанса для аутентификации

Вы можете добавить сеанс и время ожидания сеанса для своих API, поэтому только это может использовать это ваше приложение, вы можете запустить сеанс, когда загружена первая страница вашего приложения, вы можете установить тайм-ауты, а также ограничить различные службы для разных пользователей сессиями.

Общая идея, как это сделать

<?php
if(!empty($_SESSION['api_session']) && $_SESSION['api_session'] == 'usertype'){
//usertype comprise of what access you want to give
//guest, registered user, stack holder, admin etc.
...
header('Content-Type:application/json;');
echo json_encode($output);
}
0
По вопросам рекламы [email protected]