Система тикетов в php уязвимостях - PullRequest
1 голос
/ 18 апреля 2020

Я создаю систему тикетов для какого-то веб-сайта, с которой пользователь может забронировать билеты на какое-то событие. Мой механизм бронирования выглядит следующим образом:

  1. Пользователь нажимает кнопку "Купить сейчас".
  2. PayPal обрабатывает платеж.
  3. PayPal перенаправляет пользователя после успешной оплаты, на какую-то страницу «generate_ticket. php», которая генерирует номер билета.
  4. Пользователь перенаправляется на первую страницу с указанным им номером билета.

Вот Проблема: любой злоумышленник может узнать URL-адрес, на который перенаправляется успешная проверка, наблюдая за сетевым подключением в инструментах разработчика, и отправлять запросы на эту страницу «generate_ticket. php» и получать бесплатные билеты.

Вот что я подумал, чтобы решить эту проблему:

  • проверьте переменную $_SERVER['HTTP_REFERER'] для URL-адреса реферера и сравните его с URL-адресом PayPal. Но проблема в том, что, как упоминалось в руководстве .

Адрес страницы (если есть), которая направила пользовательский агент на текущую страницу. Это устанавливается агентом пользователя. Не все пользовательские агенты будут устанавливать это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию. Короче говоря, этому нельзя доверять.

Эта переменная может быть изменена. Таким образом, это ненадежно, по крайней мере, не в одиночку.

  • Когда пользователь нажимает кнопку «Купить сейчас», я прекращаю отправку формы и генерирую токен в некотором файле «токен. php» присоедините его к форме, используя функцию PayPal, которая заключается в присоединении пользовательских переменных к URL-адресу из формы, а также сохраните их в каком-либо сеансе, а затем отправьте форму. И когда запрашивается страница «generate_ticket. php», она сравнивает токен в сеансе с токеном из URL. Но опять же, любой пользователь может нажать на кнопку, заставить файл «token. php» создать токен и прикрепить его к форме. Затем возьмите этот токен, прикрепите его к URL-адресу и запросите билет, используя первую уязвимость.

Итак, есть ли у кого-нибудь решение, чтобы исправить эти уязвимости или запретить пользователю запрашивать бесплатные билеты?

1 Ответ

1 голос
/ 18 апреля 2020

Paypal имеет функцию IPN, в основном вы не будете напрямую отправлять билеты пользователю, когда получите данные на generate_ticket. php, После создания транзакции вы можете вставить запись в БД с состоянием Pending и обновить ее в ответ of PayPal, здесь IPN вступает в игру, после того как транзакция будет завершена, PayPal отправит отправленный вами запрос в виде notify_url, где вы будете обрабатывать сценарий отправки пользователю его билетов.

...