Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Логико-техническое ветвление в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.062 c
4-1234856626
Encore
2009-02-17 10:43
2010.08.27
Handle процесса


2-1273775590
Германн
2010-05-13 22:33
2010.08.27
MessageDlg и русские буквы


15-1275036604
12
2010-05-28 12:50
2010.08.27
Идея игрушки: Программируемый мини-футбол.


6-1216719811
GraySE
2008-07-22 13:43
2010.08.27
TWebBrowser. Доступ к заголовкам.


15-1274687750
AKE
2010-05-24 11:55
2010.08.27
У меня много электронной технической литературы...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский