Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от обращения к страницам напрямую через адресную строку
 
 автор: LexT   (14.06.2009 в 19:23)   письмо автору
 
 

Доброгоо времени суток!
Это моя первая попытка написать сайт, прошу помочь.

1. Описание задачи. Нужен сайт-база данных(для такси), каждый пользователь заходит под своим логином-паролем, есть несколько групп пользователей(5), каждый пользователь в форме редактирования заявки может редактировать только поля, которые прописаны для группы в которой он состоит. На вид список заявок один в один как эксел (наворотов сильных не нужно).
Итак, я сделал отображение заявок в виде с списка с поиском, все работает

стартовая страница ( там где просят ввести имя пользователя и пароль) index.php
главная страница с фреймами main.php , в ней в виде фреймов отображаются файлы list.php(список заявок) , и search.php (поиск
по разным полям) , при клике на каждой заявке окрывается форма редактирования заявки (edit.php?id=343).

В списке отображаемых заявок, отображаются заявки, для конкретного пользователя, заявки других пользователей ему не видны,
но если поменять в ссылке edit.php?id=343, id=XXXX на любое другое , то любой пользователь может открыть любую заявку.
Как организовать защиту от прямого обращения с форме редактирования? Это первый вопрос.

2. При авторизации, данные(имя пользователя, пароль) из формы расположенного в index.php передаются в обработчик auth.php , в обработчике проверяется логин-пароль, в случае успешной авторизации, в переменные загружаются данные о правах для группы, в которой он находится. И перенаправляется на страницу main.php . Как передать значения переменных из обработчика auth.php на страницу main.php , и еще дальше что-бы эти данные передались во фреймы list.php search.php и при отрытии формы edit.php в нее.

Т.е нужно сохранять авторизацию при переходе по заявкам, при использовании постраничной навигации, постоянно.
Авторизация нужна только по сессиям. У меня стандартный сервер (UNIX+mySQL+PHP+Apache). Авторизация средствами Apache
неприменима - только на PHP и сессиях, и без cookies.

Сорри за избитую тему, где то на форуме видел решение по защите страниц от прямого обращения к ним, но поискав уже 6 часов подряд не могу найти снова, если кто знает кинте ссылку.
Вот код:
list.php

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PozzitivePLUS</title>
<body>

<?php 
//Если пользователь не авторизован останавливаем загрузку страницы
include "./config/auth.php"
// Устанавливаем соединение с базой данных 
include "./config/config.php"

// Переменная хранит число сообщений выводимых на станице 
$num 50
// Извлекаем из URL текущую страницу 
$page $_GET['page']; 
// Определяем общее число сообщений в базе данных 
$cnt mysql_query("SELECT COUNT(*) FROM main"); 
$result mysql_result($cnt0);
// Находим общее число страниц 
$total ceil($result/$num);
// Определяем начало сообщений для текущей страницы
$page intval ($page); 
// Если значение $page меньше единицы или отрицательно 
// переходим на первую страницу 
// А если слишком большое, то переходим на последнюю 
if(empty($page) or $page 0$page 1
  if(
$page $total$page $total
// Вычисляем начиная к какого номера 
// следует выводить сообщения 
$start $page $num $num
// Выбираем $num сообщений начиная с номера $start 
$result mysql_query("SELECT * FROM main LIMIT $start$num"); 
// В цикле переносим результаты запроса в массив $postrow 
while ( $list[] = mysql_fetch_array($result));
//Формируем таблицу, в ввиде списка
echo "<pre><table rules=all border=1>"
echo 
"<thead><td><b>Номер заявки</b><td><b>Тип заявки</b><td><b>Статус</b><td><b>Дата ДТП</b><td><b>Название С/К</b><td><b>ФИО клиента</b><td><b>Марка/модель машины</b><td><b>ГОС номер</b><td><b>Номер полиса</b></thead>";
$i=0;
while (
$list[$i])

 echo 
"<tr><td>";
echo 
$list[$i]['id'];
echo 
"<td>";
echo 
$list[$i]['type'];
echo 
"<td>";
echo 
$list[$i]['status'];
echo 
"<td><";
echo 
$list[$i]['date_dtp'];
echo 
"<td>";
echo 
$list[$i]['name_company'];
echo 
"<td>";
echo 
$list[$i]['2_name']," ";
echo 
$list[$i]['1_name']," ";
echo 
$list[$i]['3_name'];
echo 
"<td>";
echo 
$list[$i]['car_mark']," ";
echo 
$list[$i]['car_model'];
echo 
"<td>";
echo 
$list[$i]['car_number']," ";
echo 
$list[$i]['car_region'];
echo 
"<td>";
echo 
$list[$i]['policy_number'];
$i++;

echo 
"</table></pre>";  

//Постраничная навигация

echo "Страницы:<br><br>";
echo 
"<table rules=all border=1><tr>";
for (
$i=1$i <= $total$i++)
{
    echo 
"<td><a href=list.php?page="$i ">"$i  "</a>";
    }
    echo 
"</table>"
?>

index.php

<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>PozzitivePLUS</title>
<body>

<! Форма авторизации - ввода имени пользователя и пароля>

<table align="center">
<form action="/config/auth.php" method=post>
<input type="hidden" name="session" value="<?php echo session_id() ?>">
<tr><td>Имя пользователя:<td><input type=text name=username>
<tr><td>Пароль :<td><input type=password name=pass><br>
<input type=submit value="Войти">
</form>
</table>
<?php if($_GET['bad']) echo ("Неправильные имя пользователя или пароль!"?>
</body>
</html>

auth.php

<?php
//Устанавливаем соединение с базой данных
include "config.php"
//Извлекаем имя пользователя, его пароль, и идентификатор сессии
$username $_POST['username'];
$pass md5($_POST['pass']);
$session $_POST['session'];
//Формируем SQL запрос
$query "SELECT * FROM users WHERE logname = '$username' AND pass='$pass'";
//Выполняем SQL запрос имени пользователя и пароля
$result mysql_query($query);
//При ошибке перенаправляем на index.php
if (!mysql_num_rows($result)) header("Location: ../index.php?bad=1");
//Проверяем заблокирован ли логин
if (mysql_result($result0'active') == 0header("Location: ../index.php?bad=1");
//Извлекаем из базы данных данные о пользователе
header("Location: ../main.php");
?>

  Ответить  
 
 автор: Diplex   (14.06.2009 в 21:30)   письмо автору
 
   для: LexT   (14.06.2009 в 19:23)
 

Первое, что Вам нужно сделать - это разобраться с сессиями, и как они работают.

Потом план такой:
При правильной авторизации, нужно создавать сессию (при выходе из аккаунта - убивать сессию).
А задолго до этого, все страницы должны делиться какбы на 2 части:

Коннектимся к БД, где записаны пароли и имена. Подставляем значения из сессии в запрос, если всё правильно, то берем значения из БД, и сверяем их со значениями ещё раз.

if(сессия1 == из_бд1 && сессия2 == из_бд2)
{
всё ок
}
else
{
не ок
}


или просто, если сессия есть, то открывать доступ; если нету - то не открывать...

  Ответить  
 
 автор: LexT   (14.06.2009 в 21:54)   письмо автору
 
   для: Diplex   (14.06.2009 в 21:30)
 

Спасибо, пока ждал вашего ответа , нашел статью
http://softtime.ru/info/articlephp.php?id_article=34
Даже начинаю вникать в нее, попробую сделать по аналогии

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования