предотвратить фальсификацию URL в php - PullRequest
0 голосов
/ 25 октября 2010

Это тестовое приложение с 5 бумагами, установленными мной ... как 5 страниц php

Ход приложения

Login.html

check.php // чтобы проверить правильность учетных данных r

, если они верны, то

main.php // пользователь нажимает кнопку "пройти тест" на этой странице, которая отображает ему 1 из 5 статей ...

но как только я войду в систему, я могу просто изменить URL-адрес на URL-адрес тестовой бумаги, которую я хочу .. названия бумаги r 1.php 2.php ....

как мнеостановите это ... ??

if(!isset($_SESSION['page'])//Tp
        continue;           //Tp
else
 {
   header('Location:login.php');
   exit;
 }                               //Tp
$_SESSION['page']=$_SERVER['SCRIPT_NAME'];//tp

это правильно ... как я уже сказал, есть 5 страниц ....

на каждой странице у меня есть этот код ....

я проверяю, установлена ​​ли переменная Session .... если она установлена ​​... это означает, что она уже посетила страницу ..... но этот код не работает ... я использовалпеременная _SESSION ['page'] перед ее объявлением ???

Ответы [ 3 ]

3 голосов
/ 25 октября 2010

Лучший способ - встроить настоящую аутентификацию и авторизацию в ваше приложение.Затем URL-адрес, который предоставляет бумагу, должен подтвердить, что пользователю разрешено просматривать страницу перед ее обслуживанием.

Что бы вы ни делали в check.php, сделайте это на самой бумажной странице.

1 голос
/ 26 октября 2010

Проблемы, с которыми вы столкнулись, в основном можно решить, расположив код вокруг скрипта обработчика по умолчанию. (см. мои рекомендации ниже.)

Существует два основных способа передачи информации в такой сценарий (как я сказал в комментарии выше). Основной способ - через переменную GET, например http://www.example.com/main.php?p=1.

Если вы хотите иметь более удобные для посетителей URL-адреса, вы можете использовать RewriteRule в файле .htaccess для преобразования хороших URL-адресов в URL-адреса, понятные вашему обработчику. (Вам понадобится mod_rewrite .)

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

  1. Разместите вашу конфиденциальную информацию за пределами общедоступного веб-корня .
  2. По умолчанию не отображать информацию . Включайте отображение информации только в том случае, если пользователь имеет положительные полномочия.
  3. В идеале это включает URL-адреса (если они вводят действительный URL-адрес, но не авторизованы, не сообщайте им, что они достигли действительного URL-адреса). Один из способов - перенаправить (установить заголовок местоположения, как вы делали) на страницу входа, если они не авторизованы.
  4. Создание сценария обработчика по умолчанию. Этот центральный сценарий будет включать все необходимые файлы и вызывать все необходимые функции. Передайте всю информацию запроса этому обработчику, и он выведет весь HTML.
  5. Требование к # 3: Инкапсулировать ваш код в функции и классы. Таким образом, ваш обработчик по умолчанию может вызывать их, когда он будет готов, только если они вам нужны, а не просто потому, что они оказались включены. Это позволяет вам гораздо больше контролировать поток вашего приложения.
  6. Вместо echo HTML-кода в произвольных местах по всему коду, возвращает весь вывод HTML в ваш основной обработчик , который соберет его и выведет все в одном месте, когда будет готов. Случайные echo s разбросаны по сторонам, чтобы дыркам в безопасности было легче появляться.
  7. Не доверяйте вводу пользователя . Если вы собираетесь использовать значение, полученное из $_GET или $_POST, убедитесь, что SURE - это допустимое значение, прежде чем использовать его.

Edit:

(Это более конкретно и направлено на ваш код, как он есть сейчас)

Есть 3 причины, по которым ваш код не будет работать так, как вы ожидаете:

  1. Вы пропустили закрывающую скобку в первой строке if(!isset($_SESSION['page']).

  2. Способ написания вашего кода, если $_SESSION['page'] уже установлен, когда пользователь заходит на страницу, они будут перенаправлены на страницу входа. Вы можете исправить это, поместив header('Location:login.php'); exit; в предложение if и полностью удалив предложение else:

    if(!isset($_SESSION['page'])) {
       header('Location:login.php');
       exit;
    }
    $_SESSION['page']=$_SERVER['SCRIPT_NAME'];
    
  3. Вам нужно установить $_SESSION['page'] при первом входе в систему, чтобы они могли просматривать первую страницу.

Я бы рекомендовал использовать целое число для $_SESSION['page'] вместо имени скрипта. Таким образом, вы можете установить $_SESSION['page'] в 1, когда они входят в систему, и каждый раз, когда они успешно просматривают страницу, увеличивают $_SESSION['page'] на единицу. Считайте, что $_SESSION['page'] означает следующую статью, которую этот пользователь может просматривать .

Вы можете установить $pageid на каждой бумаге. Каждый раз, когда они пытаются просмотреть страницу, если $_SESSION['page'] меньше $pageid, не позволяйте им просматривать страницу.

1 голос
/ 25 октября 2010

Много альтернатив. Пара:

  • Не кодируйте названия названий бумаги в URL, а возвращайте содержимое выбранной бумаги со страницы, например, test-paper.php.

  • отслеживать документы, которые пользователь имеет право видеть в сеансе пользователя. На каждой странице тестовой бумаги проверьте, разрешено ли пользователю просматривать эту страницу, и верните 403 Запрещено (или страницу ошибки), если это не так.

Я уверен, что еще много.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...