Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Логико-техническое ветвление в PHP. Как?   Найти похожие ветки 

 
12 ©   (2010-04-28 13:04) [0]

Надо в зависимости от логин/пароль ветвится
Пишу так
если пользователь в БД есть, то переход
{
include_once "Work.php";
}
правильно?

Гложет смутное сомнение,
если просто набрать в строке site\Work.php
то результат будет тот же

Если передать в Work.php что-то типа
$_SESSION["user_id"] и проверять, что не с балды зашли, а через авторизацию?

Я еще хочу много форм написать, и перекидывать юзера между ними
но тогда это что же получается - всегда проверять и постоянно?

Наверное, неправильно что-то или думаю или делаю..


 
antonn ©   (2010-04-28 13:09) [1]

в корне сайта вызываемые скрипты, в кажом в начале создается переменная флаг.
в подпапке находятся скрипты для инклуда, в каждом проверяется наличие переменной-флага. Плюс на апаче можно кинуть htaccess с "deny from all"


 
TUser ©   (2010-04-28 13:09) [2]


> Гложет смутное сомнение,
> если просто набрать в строке site\Work.php
> то результат будет тот же

пиши work.php.inc, и храни его в месте, откуда сервер не выдаст листинг

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


 
McSimm ©   (2010-04-28 13:48) [3]


> а вот  отдельно выполнять не будет (ну, если апач не настроить
> специально)

Будет.
На этом базируются некоторые методы взлома (не буду конкретизировать)


 
Идентификация   (2010-04-28 14:05) [4]

//Идентификация
session_start();
if ($_SESSION["authorized"]<>1) {
 header("location:admin/index.php");
 exit;
}


 
xayam ©   (2010-04-28 14:09) [5]


> 12 ©   (28.04.10 13:04) 
> Гложет смутное сомнение, если просто набрать в строке site\Work.php
> то результат будет тот же
> antonn ©   (28.04.10 13:09) [1]
> Плюс на апаче можно кинуть htaccess с "deny from all"

Можно специальный символ в именах файлов ввести, который будет означать что прямой доступ к скрипту запрещен и настроить .htaccess, например, так для знака подчеркивания:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)_(.*)$ /404.php [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?$1 [L,QSA]
</IfModule>

Соответственно скрипт переименовать в _Work.php, ну и сессии конечно проверять. Не?


 
MonoLife ©   (2010-04-28 14:14) [6]


> Если передать в Work.php что-то типа
> $_SESSION["user_id"] и проверять, что не с балды зашли,
> а через авторизацию?

Может, в первый раз куки недолговременные записать, а потом проверять их?


 
12 ©   (2010-04-28 14:17) [7]

спасибо
буду пробовать


 
12 ©   (2010-04-28 14:17) [8]


> куки

нежелательны


 
antonn ©   (2010-04-28 14:21) [9]

куки - это клиентский текст, там что угодно может быть


 
12 ©   (2010-04-28 14:22) [10]


> Идентификация   (28.04.10 14:05) [4]


так примерно и писал


mssql_select_db("ccc",$link);

if($_SESSION["user_id"] == -1)
{ $login = isset($_POST["login"])?$_POST["login"]:"";
 $passwd = isset($_POST["passwd"])?$_POST["passwd"]:"";
 if($login != "" || $passwd != "")
 { $sql = "SELECT * FROM rnrEmployee WHERE Login = "$login" AND Pass = "$passwd"";
   $qry = mssql_query($sql, $link);
   if($qry)
  { if(mssql_num_rows($qry) > 0)
    { echo "Доступ разрешен<br />" . "\n";
      $row = mssql_fetch_array($qry);
     echo "Пользователь: " . $row["EmployeeName"];
     $_SESSION["user_id"] = $row["IdEmployee"];
     $_SESSION["user_name"] = $row["EmployeeName"];
     include_once "IndexFirst.php";
    }
    else
     { echo "Доступ запрещен!";
      echo "Введите логин и пароль";
       echo "<form action=\"index.php\" method=\"post\" enctype=\"application/form-data\">";
       echo "<input type=\"text\" value=\"\" name=\"login\" />";
       echo "<input type=\"password\" value=\"\" name=\"passwd\" />";
       echo "<input type=\"submit\" value=\"LogIn\" />";
       echo "</form>";
     }
   }
 }
 else
 { echo "Введите логин и пароль";
   echo "<form action=\"index.php\" method=\"post\" enctype=\"application/form-data\">";
   echo "<input type=\"text\" value=\"\" name=\"login\" />";
   echo "<input type=\"password\" value=\"\" name=\"passwd\" />";
   echo "<input type=\"submit\" value=\"LogIn\" />";
   echo "</form>";
 }
}
else
{ echo "Здравствуйте, " . $_SESSION["user_name"]; }


 
12 ©   (2010-04-28 14:23) [11]


> antonn ©   (28.04.10 14:21) [9]
>
> куки - это клиентский текст, там что угодно может быть

и могут неприниматься браузером


 
xayam ©   (2010-04-28 14:27) [12]


> 12 ©   (28.04.10 14:22) [10]

экранирование mysql_real_escape_string ($login) и mysql_real_escape_string ($passwd) забыл написать :)


 
xayam ©   (2010-04-28 14:35) [13]

опс, не знаю такая штука для ms есть или нет?


 
Dimka Maslov ©   (2010-04-28 15:08) [14]

Подключаемому файлу даём расширение inc затем записываем в .htaccess

<Files *.inc>
order allow,deny
deny from all
</Files>


 
MonoLife ©   (2010-04-28 18:53) [15]


> и могут неприниматься браузером

браузером много что может "не приниматься":) в т.ч. и ява-скрипты и т.п.

Но, собственно, согласен, с куками чревато..

> так примерно и писал

пароль хранится в открытом виде?


 
ProgRAMmer Dimonych ©   (2010-04-28 19:21) [16]

Узнал много новых способов извращений. IMHO :)

Использовал в нескольких реальных (уже оплаченных ;)) проектах такой кусочек кода:

if (basename($_SERVER["SCRIPT_FILENAME"]) == basename(__FILE__))
{
 echo "<h1>This script is not for execution!</h1>"; exit;
}


Случаев, чтобы не работало, ещё не видел. Вставляется в начале "невыполняемого" скрипта.

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

Кстати, по [0]... Мне одному кажется, что включение куска кода и выполнение фрагмента кода - действия немного разные? Использую подключение по "паскалевскому" принципу: программа, а остальные - библиотеки, т.е. только набор функций. Задержек по времени выполнения не замечал.

P.S. Всё вышесказанное - тройное IMHO.


 
12 ©   (2010-04-29 08:08) [17]


> ProgRAMmer Dimonych ©   (28.04.10 19:21) [16]

подумаю над этим.


> пароль хранится в открытом виде?

пока да. Я же учусь..


 
12 ©   (2010-04-29 09:09) [18]

вопрос к коду из [10]
почему, когда после успешной регистрации нажимаешь обновить - браузер (и IE, и FF) спрашивают о повторении отправки неких(??) данных?

а теперь я написал в самом начале
<?php
if (isset($bgcolor)) { setcookie("bgcolor", $bgcolor, time()+3600);}
session_start();
и тд
и теперь, если обновить, о повторении отправки больше не спрашивает.
Причем кукис этот нигде больше не используется
Такое впечатление, что только по факту использования кука, браузер работает иначе.

на всякий, весь код еще раз
<?php
if (isset($bgcolor)) { setcookie("bgcolor", $bgcolor, time()+3600);}

session_start();
if (!$_SESSION["user_id"])
 $_SESSION["user_id"] = -1;
 
include "Head.php";
//include "Tables.php";
include_once "MsSql.php";

if (ConnectMssql("192.168.17.9,1433", "DieLogin", "DerParol", $link) == 0)
{
// echo "Соединен! <br>";
}
else
{
 echo "НЕ соединен <br>";
}
mssql_select_db("ccc",$link);

if($_SESSION["user_id"] == -1)
{ $login = isset($_POST["login"])?$_POST["login"]:"";
 $passwd = isset($_POST["passwd"])?$_POST["passwd"]:"";
 if($login != "" || $passwd != "")
 { $sql = "SELECT * FROM rnrEmployee WHERE Login = "$login" AND Pass = "$passwd"";
   $qry = mssql_query($sql, $link);
   if($qry)
  { if(mssql_num_rows($qry) > 0)
    { echo "Доступ разрешен <br>";
      $row = mssql_fetch_array($qry);
     echo "Пользователь: " . $row["EmployeeName"]."<br>";
     $_SESSION["user_id"] = $row["IdEmployee"];
     $_SESSION["user_name"] = $row["EmployeeName"];
     include_once "IndexFirst.php";
    }
    else
     { echo "Доступ запрещен! <br>";
      echo "Введите логин и пароль";
       echo "<form action=\"index.php\" method=\"post\" enctype=\"application/form-data\">";
       echo "<input type=\"text\" value=\"\" name=\"login\" />";
       echo "<input type=\"password\" value=\"\" name=\"passwd\" />";
       echo "<input type=\"submit\" value=\"LogIn\" />";
       echo "</form>";
     }
   }
 }
 else
 { echo "Введите логин и пароль <br>";
   echo "<form action=\"index.php\" method=\"post\" enctype=\"application/form-data\">";
   echo "<input type=\"text\" value=\"\" name=\"login\" />";
   echo "<input type=\"password\" value=\"\" name=\"passwd\" />";
   echo "<input type=\"submit\" value=\"LogIn\" />";
   echo "</form>";
 }
}
else
{ echo "Здравствуйте, " . $_SESSION["user_name"]."<br>";
 include_once "IndexFirst.php";
}

//<?php
//mssql_free_result($res);
mssql_close($link);

echo "<br>";
include "Foot.php";
?>


 
ProgRAMmer Dimonych ©   (2010-05-02 13:03) [19]

> [18] 12 ©   (29.04.10 09:09)

А точно что-то меняется от куки? Я, например, не вижу нигде после успешной обработки POST-запроса редиректа. Соответственно при обновлении страницы, выданной по итогам обработки брофзер думает, а стоит ли отправлять повторно уже отправленные для получения этой страницы данные. Отправить - возможно, продублировать информацию в базе или ещё что-нить в таком духе, не отправить - вообще никакой страницы можно не получить.

P.S. Особо не вчитывался.


 
Dimka Maslov ©   (2010-05-03 20:49) [20]


> почему, когда после успешной регистрации нажимаешь обновить
> - браузер (и IE, и FF) спрашивают о повторении отправки
> неких(??) данных?

Если страница получена по запросу POST обновление страницы подразумевает повторную отправку данных формы. Чтобы этого не происходило, скрипт, получивший данные должен выдать браузеру редирект.


 
12 ©   (2010-05-05 15:07) [21]


> скрипт, получивший данные должен выдать браузеру редирект.

как это?


 
Lamer@fools.ua ©   (2010-05-05 16:14) [22]


> 12 ©   (05.05.10 15:07) [21]
> > скрипт, получивший данные должен выдать браузеру редирект.
> как это?


http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#3xx_Redirection


 
ProgRAMmer Dimonych ©   (2010-05-05 23:47) [23]

А проще - в соли, специальной соли, в которой есть йод (С) Реклама

header("Location: index.php");


 
12 ©   (2010-05-06 08:30) [24]

это понятно, но написано

PHP redirect
Redirect или перенаправление на другую страницу в PHP осуществляется путем отправки специального HTTP заголовка функцией header:
<?php
header("Location: http://www.tigir.com/php.htm");
exit;
?>
ВАЖНО!!! Заголовки функцией header нужно отправлять до любого вывода текста в браузер! Даже перед <?php не должно быть пробелов!
Как это сделать, когда страница загружена и есть поля ввода в зависимости от которых надо направлять по разным направлениям?


 
12 ©   (2010-05-06 08:41) [25]

понял кажись
в примере моем надо
<?php
session_start();
if ($_SESSION["user_id"] > 0) {
 header("Location: http://www.tigir.com/php.htm");
 exit;
}
так написать, вроде


 
xayam ©   (2010-05-06 08:46) [26]


> Как это сделать, когда страница загружена и есть поля ввода
> в зависимости от которых надо направлять по разным направлениям?

Одно из двух:

document.location.href = "http://<?php echo $_SERVER["SERVER_NAME"]; ?>";

<?php if ( ? ) echo "<meta HTTP-EQUIV=\"REFRESH\" CONTENT=\"0;URL=http://{$_SERVER["SERVER_NAME"]}/...\" />"; ?>


Не?


 
xayam ©   (2010-05-06 08:57) [27]

хотя по-моему лучше header пользоваться и все условия до вывода производить и в зависимости от результата сравнения формировать результирующую страницу, тогда, во-первых, вся структура сайта в одном входном месте (index.php) и, во-вторых, ЧПУ элементарно делается на основе .htaccess [5] и кода разбора входящего раздела на php примерно так:

<?php
error_reporting ( E_ALL & ~ E_NOTICE );
set_time_limit ( 300 );
$params = explode ( "/", $_SERVER ["QUERY_STRING"] );
require_once "_mydbconfig.php";
for($i = 0; $i < count ( $params ); $i ++)
$params [$i] = mysql_real_escape_string ( $params [$i] );
//...здесь анализ разделов/подразделов, которые храняться в массиве $params
?>


 
12 ©   (2010-05-06 09:10) [28]

echo "<meta HTTP-EQUIV=\"REFRESH\" CONTENT=\"0;URL=http://www.ya.ru\" ";
работает, спасибо..

книжку бы мне, тока путевую,
через web тока кусочно-непрерывно получается учится :)


 
xayam ©   (2010-05-06 09:15) [29]


> книжку бы мне, тока путевую,

http://www.htmlbook.ru/ (рус. справочник html/css, книга, статьи, примеры)
http://www.htmlref.com/ (анг. справочник html/css, примеры)
http://www.php.net/   :)


 
xayam ©   (2010-05-06 09:21) [30]

и в догонку:
http://jquery.com/  для супер-пупер сайтов, как у меня :)
http://jqueryui.com/ виджеты-плагины для jquery
http://biblio-globus.ru/description.aspx?product_no=9491903 и книга по всему этому делу


 
12 ©   (2010-05-06 15:04) [31]


> echo "<meta HTTP-EQUIV=\"REFRESH\" CONTENT=\"0;URL=http:
> //www.ya.ru\" ";
> работает, спасибо..

работает то работает, но

>    echo "id =" . $_SESSION["user_id"]."<br>";
>    echo "name =" . $_SESSION["user_name"]."<br>";


не видит уже ничего..

не понимаю что-то, для особо одаренных, напишите пожалуйста пример

как понял, надо 4 файла
1. Регистрация
2. ДА
3. НЕТ
4. Работа

с Регистрации, в зависимости от, переправляем на ДА или НЕТ
ДА и НЕТ - заранее подготовленные, с авторедиректом.
if ($_SESSION["user_id"] > 0) {   //перенаправить
 header("Location: IndexFirst.php");
 exit;
}

ДА на Работа, НЕТ на Регистрация


                               регистрация  \
                               /             \    /
                           ДА               НЕТ
                         /
                   работа  

Так?
А как вызывать эти ДА и НЕТ?

что-то совсем запутался - то вдруг опять переотправить данные просит, то не просит, но тогда не видит сессии.


 
12 ©   (2010-05-06 15:06) [32]

кстати, а как сессия реализована?
Как это может сервер помнить клиента?
Я делал на delphi вставкой скрытых полей, но тут нет ничего такого. Куки запрещены. Как же помнит? Принцип какой?

Если быстро никак не объяснить - то не надо, потом дойду.


 
antonn ©   (2010-05-06 15:27) [33]


> ВАЖНО!!! Заголовки функцией header нужно отправлять до любого
> вывода текста в браузер! Даже перед <?php не должно быть
> пробелов!
> Как это сделать, когда страница загружена и есть поля ввода
> в зависимости от которых надо направлять по разным направлениям?
>

поля ввода лежат в FORM, у которого есть action.
А по поводу хедеров: есть распространенный затык, когда скрипты в юникоде не дают котправить заголовок, из-за BOM. Эту метку всегда ставит notepad.exe, и проинклудив такой скрипт выведется сначала BOM, а потом попытается отправиться хедер, ругаца будет :)


> кстати, а как сессия реализована?
> Как это может сервер помнить клиента?

сессии - обычно файл на сервере, к клиенту "привязывается" через SID, это текстовая строчка похожая на хеш. Если клиент подерживает куки то SID хранится в куках, если клиент не поддерживает куки - при генерации страницы добавляется ко всем внутренним ссылкам и формам (в ссылках параметр, в формах невидимое поле). При самом первом заходе когда куки чисты страница отдается именно с такими подставленными параметрами (хорошо видно на форумах ipb, хоть у них и свои сессии).


 
12 ©   (2010-05-06 15:37) [34]


> поля ввода лежат в FORM, у которого есть action.

ну да.
есть index.php, в нем есть FORM, у форм есть action. Он у меня равен index.php
т.е. опять же сам и смотрит что ввели.

А надо на другой скрипт? (чтоб не просил переотправить данные, если щелкнуть на Обновить. Ну, как Маслов сказал.. тока я не понял)


> сессии - обычно файл на сервере, к клиенту "привязывается"
> через SID, это текстовая строчка похожая на хеш. Если клиент
> подерживает куки то SID хранится в куках, если клиент не
> поддерживает куки - при генерации страницы добавляется ко
> всем внутренним ссылкам и формам (в ссылках параметр, в
> формах невидимое поле). При самом первом заходе когда куки
> чисты страница отдается именно с такими подставленными параметрами
> (хорошо видно на форумах ipb, хоть у них и свои сессии).

А! Так и знал, все- таки обманывают :)
Так и сам могу..


 
antonn ©   (2010-05-06 16:05) [35]


>
> А надо на другой скрипт? (чтоб не просил переотправить данные,
>  если щелкнуть на Обновить. Ну, как Маслов сказал.. тока
> я не понял)

я разделаю скрипты вывода и внесения информации, в index.php отправляю данные чата (к примеру) скрипту chat_add.php, а в нем в конце делаю:
header("Location: index.php");

При обновлении страницы спокойно опять обновится index.php без повторной отправки. Привычка у меня такая - разделять, не люблю когда все в одну кучу мешается.


 
ProgRAMmer Dimonych ©   (2010-05-10 18:26) [36]

> [34] 12 ©   (06.05.10 15:37)

Можно и на тот же, главное - чтобы он понял, чего от него хотят. POST-данные в любом случае не переотправятся. Если при успешной обработке POST-запроса чистить сессию или добавлять в неё какое-нибудь хитрое значение (по вкусу) - то проблема с определением ситуации отпадает.


 
12 ©   (2010-05-12 10:56) [37]

БЛИН!!!!

    session_start();
забыл :) Потому то и SESSION["user_id"] не помнил у меня, а я всю башку сломал, и всех напряг..

    include_once "ConstantsRNR.php";
    if (isset($_SESSION["user_id"]))
    {
      if ($_SESSION["user_id"] < 0)
        {
        header("Refresh: 5; URL=".$site_path."");
        echo "Вы или неавторизовались или долго ничего не делали, например отходили от компьютера <br>";
        echo "Через 5 сек. вы будете перенаправлены на регистрацию, для подтверждения, что подошли к компьютеру именно Вы.<br>";
        exit;
        }
    }
    else
    {
        header("Refresh: 5; URL=".$site_path."");
        echo "Вы или неавторизовались или долго ничего не делали, например отходили от компьютера";
        echo "Через 5 сек. вы будете перенаправлены на регистрацию, для подтверждения, что подошли к компьютеру именно Вы .";
        exit;
    }



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.191 c
2-1275459989
novai
2010-06-02 10:26
2010.08.27
Не минимизация второй формы


6-1220728807
Andrey.Beliakov
2008-09-06 23:20
2010.08.27
htmldocument и элемент web формы select


15-1268762686
TStas
2010-03-16 21:04
2010.08.27
Как заставить подпрограмму считать быстрее


15-1273508224
AKE
2010-05-10 20:17
2010.08.27
Где можно найти программиста на C++?


2-1271803296
RGV
2010-04-21 02:41
2010.08.27
alt+Tab