Я создаю систему тикетов для какого-то веб-сайта, с которой пользователь может забронировать билеты на какое-то событие. Мой механизм бронирования выглядит следующим образом:
- Пользователь нажимает кнопку "Купить сейчас".
- PayPal обрабатывает платеж.
- PayPal перенаправляет пользователя после успешной оплаты, на какую-то страницу «generate_ticket. php», которая генерирует номер билета.
- Пользователь перенаправляется на первую страницу с указанным им номером билета.
Вот Проблема: любой злоумышленник может узнать URL-адрес, на который перенаправляется успешная проверка, наблюдая за сетевым подключением в инструментах разработчика, и отправлять запросы на эту страницу «generate_ticket. php» и получать бесплатные билеты.
Вот что я подумал, чтобы решить эту проблему:
- проверьте переменную
$_SERVER['HTTP_REFERER']
для URL-адреса реферера и сравните его с URL-адресом PayPal. Но проблема в том, что, как упоминалось в руководстве .
Адрес страницы (если есть), которая направила пользовательский агент на текущую страницу. Это устанавливается агентом пользователя. Не все пользовательские агенты будут устанавливать это, а некоторые предоставляют возможность изменять HTTP_REFERER как функцию. Короче говоря, этому нельзя доверять.
Эта переменная может быть изменена. Таким образом, это ненадежно, по крайней мере, не в одиночку.
- Когда пользователь нажимает кнопку «Купить сейчас», я прекращаю отправку формы и генерирую токен в некотором файле «токен. php» присоедините его к форме, используя функцию PayPal, которая заключается в присоединении пользовательских переменных к URL-адресу из формы, а также сохраните их в каком-либо сеансе, а затем отправьте форму. И когда запрашивается страница «generate_ticket. php», она сравнивает токен в сеансе с токеном из URL. Но опять же, любой пользователь может нажать на кнопку, заставить файл «token. php» создать токен и прикрепить его к форме. Затем возьмите этот токен, прикрепите его к URL-адресу и запросите билет, используя первую уязвимость.
Итак, есть ли у кого-нибудь решение, чтобы исправить эти уязвимости или запретить пользователю запрашивать бесплатные билеты?