Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Проверте пожалуйста
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Проверте пожалуйста

Страниц (1): [1]
 

1. OverNik - 29 Октября, 2009 - 15:25:43 - перейти к сообщению
Скрипт авторизации

index.php (Отобразить)

filtr.php (Отобразить)

mysql.php (Отобразить)


в файле mysql.php проверок на подключения пока нету, поставлю позже, так же нету проверок или файл вызивается с index.php, прошу по этим вопросам замечания не писать.
Скрипт работает так:
Если человек авторизирован, при генерации страници будет проверятся его куки с логином и паролем, если же не совпадают то переменая $enter = 0, если совпадают то $enter =1
Дальше уже так:
PHP:
скопировать код в буфер обмена
  1. if($enter==1)
  2. {
  3.  echo "текст для зарегестрированого пользивателя";
  4. }
  5. else if($enter==0)
  6. {
  7.  echo "текст для не зарегестрированого пользивателя";
  8. }

Дамп базы думаю не нужен так как там всего три столбца, id | user | psw

Спасибо!
2. Sajaxt - 30 Октября, 2009 - 11:48:55 - перейти к сообщению
Я конечно программист не опытный и начинающий, но кажется что зря Вы функцию filtr() писали. Есть такая функция mysql_real_escape_string(), она как раз занимается экранированием спецсимволов и т.д.

И надеюсь никто не обидится, я тоже хотел кинуть на обсуждение скрипт авторизации Улыбка но тему уже открыли, поэтому выложу сюда свой скрипт:

dbaccsess.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. //*********Datenbankanschluss**************//
  4. //------Vipolnenije Zaprosa-----------------
  5. function DBconnect(){
  6.         $con_id = @mysql_connect("localhost","root","") or die("Не могу соедениться с сервером");
  7.         @mysql_select_db("probe",$con_id) or die("Не могу соедениться с БД");
  8.         return $con_id;
  9. }
  10.  
  11. function DBresult($query,$flag){
  12.     $dbresult = mysql_query($query);
  13.  
  14.     if($flag==1){
  15.         return mysql_fetch_array($dbresult);
  16.     }else{
  17.         return $dbresult;
  18.     }
  19. }
  20.  
  21. function DBdisconnect($con_id){
  22.     @mysql_close($con_id) or die("соеденение с сервером не было завершино");
  23. }
  24. ?>
  25.  


authorization.php
PHP:
скопировать код в буфер обмена
  1.  
  2. /*таблица пользователей
  3. CREATE TABLE `probe`.`user` (
  4. `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  5. `email` VARCHAR( 60 ) NOT NULL ,
  6. `pswrd` VARCHAR( 80 ) NOT NULL ,
  7. `hash` VARCHAR( 100 ) NOT NULL ,
  8. `ip` VARCHAR( 20 ) NOT NULL ,
  9. `log_time` INT( 30 ) NOT NULL
  10. ) ENGINE = MYISAM ;
  11. */
  12. <?PHP
  13.         session_start();
  14.         include("../scriptparts/dbaccess.php");
  15.         $con_id=DBconnect();
  16.        
  17.         if(isset($_POST['no_hash'])){//Проверяем перешелли пользователь на страницу с формы
  18.                 if($_POST['email']=='undefined' or $_POST['email']=="") die("Вы не заполнели поле электроной почты!");
  19.         if($_POST['pswrd']=='undefined' or $_POST['pswrd']=="") die("Вы не ввели пароль!");
  20.        
  21.         $email = mysql_real_escape_string($_POST['email']);
  22.        
  23.         $pot_user=DBresult("SELECT id,pswrd FROM user WHERE email='$email' LIMIT 1",1);
  24.        
  25.         if(!$pot_user){
  26.                 die("Вы не зарегестрированы в системе!");
  27.         }elseif(md5($_POST['pswrd'])!=$pot_user['pswrd']){
  28.                 die("Вы ввели не верный пароль!");             
  29.         }else{
  30.                 $hash=md5(uniqid());
  31.                 $ip=$_SERVER["REMOTE_ADDR"];
  32.                 log_time=time();       
  33.        
  34.                 $_SESSION['hash']=$hash;
  35.                 $_SESSION['log_time']=$log_time;
  36.        
  37.                 DBresult("UPDATE user SET hash='$hash',ip='$ip',log_time='$log_time' WHERE email='$email'",0);
  38.         }
  39.         }elseif(isset($_SESSION['hash'])){// Былли пользователь уже авторизирован
  40.                 $ip=$_SERVER["REMOTE_ADDR"];
  41.                 $pot_user=DBresult("SELECT hash,log_time FROM user WHERE ip='$ip' LIMIT 1",1);
  42.                
  43.                 if(!$pot_user){
  44.                         die("Вы не авторизированы!");
  45.                 }elseif((time()-3600)>$pot_user['log_time']){
  46.                         die("Время сессии истекло!");
  47.                 }elseif($_SESSION['hash']!=$pot_user['hash']){
  48.                         die("Вы не авторизированы!");
  49.                 }else{
  50.                         DBresult("UPDATE user SET log_time='".time()."' WHERE ip='$ip' LIMIT 1",0);
  51.                 }
  52.         }else{
  53.                 DBdisconnect($con_id);
  54.                 die("Вы не авторизированы");
  55.         }
  56.        
  57.         DBdisconnect($con_id);
  58. ?>
  59.  


Работает всё так, в начале каждого скрипта вставляется authorazation.php если во время исполнения срипта авторизации ошибок нет, то код доходит до непосредственого исполнения скрипта страницы.
Принцип работы: Сначала смотрим, перешелли пользователь на страницу с формы, если да то сравниваем адрес эл. почты и пассворт, и заносим в базу ip пользователя, время авторизации и уникальный хэш, также записываем эти данные в переменный сессии. При последующем вызове скрипта, проверяем естьли переменные сессии и сверяем их, в скрипте всё прокомментировано.

Пожалуйста кто поопытней, проверьте скрипт на вшивость, дайте пару советов. Просто хочется написать авторизацию и просто использовать её в дальнейшем.

Зарание примного благодарен!
3. OverNik - 30 Октября, 2009 - 15:37:22 - перейти к сообщению
в будущем функция фильтр очень пригодится, от инъекций и XSS
4. lolo - 30 Октября, 2009 - 16:34:21 - перейти к сообщению
OverNik, извините, но уже с самого начала код не гуд.

PHP:
скопировать код в буфер обмена
  1. //проверка куков
  2. $enter = 0;
  3. if(isset($_COOKIE['user']) or isset($_COOKIE['psw']) or $enter ==1) // Такс, проверяете, установлено ли в куку 'user' ИЛИ 'psw' - то есть вам все равно, что из этого установлено? И зачем проверка $enter ==1, если вы строкой выше установили эту переменную равной нулю?
  4. {
  5.     //Фильтрация логина
  6.     $login = $_COOKIE['login']; // А установлено ли в куку 'login' вам, судя по условию выше, наплевать? ;)
  7.     filtr($login, 0);
  8.     $login = $filtr; // не разбиралась в вашем "фильтре", пока ничего по его поводу не скажу, кроме того, что не правильнее было бы сделать, чтобы функция возвращала значение, а не объявляла какую-то переменную $filtr глобальной? Тогда бы выражение выглядело бы проще:  $login = filtr($login, 0);
  9. //фильтрация пароля
  10.     $psw = $_COOKIE['psw'];
  11.     filtr($psw, 0);
  12.     $psw = $filtr;  // Три строчки можно записать в одну: $psw = filtr($_COOKIE['psw'], 0);
  13.  


Дальше не хватило моих слабых сил разбираться, да и времени в конце рабочего дня в пятницу - тоже Радость
5. OverNik - 30 Октября, 2009 - 19:07:07 - перейти к сообщению
Спасибо, сегодне же исправлю.

не совсем понял с функцией filtr, можна пожалуйста подробней
6. lolo - 03 Ноября, 2009 - 10:54:48 - перейти к сообщению
OverNik пишет:
не совсем понял с функцией filtr, можна пожалуйста подробней

Во-первых, убрать global $filtr из функции. Во-вторых, почитать про функции побольше Улыбка
Правильнее сделать, чтобы функция возвращала некий результат, который получается после обработки получаемых значений, а не устанавливала какие-то глобальные переменные.
PHP:
скопировать код в буфер обмена
  1. function filtr($text,$prob = 1)
  2. {
  3.     // здесь обработка $text, $prob
  4.     return preg_replace($pattern, "", $text); // возвращение результата, значение которого примет переменная, если написать напрмер: $var = filtr($x, $y);
  5. }


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

А вообще ваша функция filtr искажает данные, тупо выкидывая все нужное и ненужное, например, если у меня логин окажется o'nill, то она будет искать onill или alloy, а будет искать oy. Но это же неверно. Так что правильнее будет просто экранировать спецсимволы функциями addslashes() или mysql_real_escape_string(). И незачем изобретать велосипед, тем более кривой.
7. Sajaxt - 04 Ноября, 2009 - 23:49:15 - перейти к сообщению
Люди добрые а по поводу моего скрипта, ктонить чтонить скажет? Улыбка
8. JROUD - 05 Ноября, 2009 - 10:03:56 - перейти к сообщению
Sajaxt, большого смысла в функциях DBconnect, DBresult не вижу, но в функции DBdisconnect его вообще нет. Зачем создавать функцию которая передаёт получиное значение другой функции? Да, и я не уверен, но разве не нужно в php указывать void если функция ничего не возвращает?
9. Мелкий - 05 Ноября, 2009 - 15:13:55 - перейти к сообщению
JROUD пишет:
Да, и я не уверен, но разве не нужно в php указывать void если функция ничего не возвращает?

Нет, не надо. Это вы C/C++ перечитали Улыбка

JROUD пишет:
большого смысла в функциях DBconnect, DBresult не вижу

А если подумать? Это общение с СУБД.

JROUD пишет:
но в функции DBdisconnect его вообще нет

Просто правило хорошего тона, сказать СУБД, что это соединение завершено.
10. Champion - 05 Ноября, 2009 - 15:26:30 - перейти к сообщению
Мелкий пишет:
А если подумать? Это общение с СУБД.
JROUD прав.
Мелкий пишет:
Просто правило хорошего тона, сказать СУБД, что это соединение завершено.
И тут тоже.
Вопрос в том, зачем оформлять это в отдельную функцию?
11. JROUD - 05 Ноября, 2009 - 15:36:03 - перейти к сообщению
Мелкий пишет:
JROUD пишет:
но в функции DBdisconnect его вообще нет

Просто правило хорошего тона, сказать СУБД, что это соединение завершено.

Я не против того что нужно закрыть соединение с СУБД, я говорю о том что задача функции DBdisconnect вызвать функцию mysql_close, а зачем если можно вызвать сразу mysql_close?
12. Sajaxt - 05 Ноября, 2009 - 15:47:02 - перейти к сообщению
Хорошо спасибо, буду испровлять.

А что на счет authorization.php?
13. Sajaxt - 14 Ноября, 2009 - 13:49:56 - перейти к сообщению
Что, никто совсем ничего не скажет?

 

Powered by ExBB FM 1.0 RC1