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. Hunter - 10 Января, 2010 - 09:05:29 - перейти к сообщению
привожу пример авторизации для.. ну например для чата, да не важно, для чего угодно.. кому не лень гляньте и подскажите слабые и нехорошие места, где что желательно исправить или доработать.. кому скучно и неинтересно лучше сразу несмотрие, код не маленький, сам знаю что чужой код это скучно и громоздко)))

форма для входа в систему в файле index.php,
данные для подключения к серверу БД в файле db_data_acceess.php
обработчик данных (то бишь сама авторизация) enter.php,
пользовательские функции используемые в обработчике в файле enter)function.php,
результат авторизации - страница формируемая файлом - chat.php
запрос на создание БД со всеми таблицами прилагаю в файле запрос.txt )))

index.php :
PHP:
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3. <title>
  4. HunterChat
  5. </title>
  6. </head>
  7. <body>
  8.     <form action="enter.php" name="user_enter" method="post" enctype="multipart/form-data">
  9.     <?PHP
  10.     if (isset($_GET['action'])) {
  11.     switch($_GET['action']) {
  12.     case 'a':
  13.         echo 'недопустимый ник!' . '<br>';
  14.         break;
  15.     case 'b':
  16.         echo 'недопустимый пароль!' . '<br>';
  17.         break;
  18.     case 'c':
  19.         echo 'неверный пароль!' . '<br>';
  20.         break;
  21.     case 'd':
  22.         echo 'этот ник уже в чате!' . '<br>';
  23.         break;
  24.     case 'e':
  25.         echo 'вход невозможен из за проблем с сервером БД. Обратитесь к администрации.<br>';
  26.         break;
  27.     }
  28.     }
  29.     if (! $_GET['action']) {
  30.         echo 'Введите ник и пароль. Для входа без регистрации пароль вводить необязательно.' . '<br>';
  31.     }
  32. ?>
  33. <input type="text" name="user_login" size="10" maxlength="30" value="Новый Юзер">
  34. <input type="password" name="user_pass" size="10" maxlength="15" value="123456">
  35. <input type="submit" size="8" value="Войти">
  36. </form>
  37. <br>
  38. <a href="registration.php">регистрация</a>&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp <a href="restore_passwd.php">забыли пароль?</a>
  39. </body>
  40. </html>



enter.php :
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     if (session_id() == '') session_start();
  3.     include ('./db_data_access.php');
  4.     include ('./enter_function.php');
  5.     @$dblink = mysql_connect($serv, $user, $pass);
  6.     if ($dblink) {
  7.     }
  8.     else {
  9.         $error_string = mysql_error();
  10. //      ТУТ НЕОБХОДИМО РЕАЛИЗОВАТЬ ЗАПИСЬ ОШИБКИ В ЛОГ        
  11.         $action = 'e';
  12.         header("location: ./index.php?action=$action");
  13.         exit;
  14.     }
  15.     @$selected = mysql_select_db($base, $dblink);
  16.     if ($selected) {
  17.     }
  18.     else {
  19.         $error_string = mysql_error();
  20. //      ТУТ НЕOБХОДИМО РЕАЛИЗОВАТЬ ЗАПИСЬ ОШИБКИ В ЛОГ
  21.         $action = 'e';
  22.         header("location: ./index.php?action=$action");
  23.         exit();
  24.     }
  25.     $sql = "SELECT * FROM chat_setting";
  26.     @$qry = mysql_query($sql, $dblink);
  27.     if ($qry) {
  28.         $setting = mysql_fetch_assoc($qry);
  29.         mysql_free_result($qry);
  30.     }
  31.     else {
  32.         $error_string = mysql_error();
  33. //      ТУТ НЕOБХОДИМО РЕАЛИЗОВАТЬ ЗАПИСЬ ОШИБКИ В ЛОГ
  34.         $action = 'e';
  35.         header("location: ./index.php?action=$action");
  36.         exit();
  37.     }
  38.     if ((strlen($_POST['user_login'])) > ($setting['login_length'])){
  39.         $action = 'a';
  40.         header("location: ./index.php" . "?action=" . "$action");
  41.         exit();
  42.     }
  43.     if (is_inadmissible($_POST['user_login']) === false) {
  44.         $action = 'a';
  45.         header("location: ./index.php" . "?action=" . "$action");
  46.         exit();
  47.         }
  48.     if ((strlen($_POST['user_pass'])) > ($setting['password_length'])) {
  49.         $action = 'b';
  50.         header("location: ./index.php" . "?action=" . "$action");
  51.         exit();
  52.     }
  53.     if (is_inadmissible($_POST['user_pass']) === false) {
  54.         $action = 'b';
  55.         header("location: ./index.php" . "?action=" . "$action");
  56.         exit();
  57.     }
  58.     $login = safe_line($_POST['user_login']);
  59.     $sql = "SELECT * FROM users WHERE user_login = '$login'";
  60.     @$qry = mysql_query($sql, $dblink);
  61.     if ($qry) {
  62.         $user = mysql_fetch_assoc($qry);
  63.         mysql_free_result($qry);
  64.     }
  65.     else {
  66.         $error_string = mysql_error();
  67. //      ТУТ НЕOБХОДИМО РЕАЛИЗОВАТЬ ЗАПИСЬ ОШИБКИ В ЛОГ
  68.         $action = 'e';
  69.         header("location: ./index.php?action=$action");
  70.         exit();
  71.     }
  72.     if (! $user['user_login']) {
  73.         $sql = "SELECT * FROM in_chat WHERE nick = '$login'";
  74.         @$qry = mysql_query($sql, $dblink);
  75.         $in_chat = mysql_fetch_assoc($qry);
  76.         mysql_free_result($qry);
  77.         if ($in_chat['nick'] !== $_POST['user_login']) {
  78.             $_SESSION['nick'] = $login;
  79.             $_SESSION['profile'] = 'default';
  80.             header("location: ./chat.php");
  81.             exit();
  82.         }
  83.         if ($in_chat['nick'] == $_POST['user_login']) {
  84.             $action = 'd';
  85.             header("location: ./index.php" . "?action=" . "$action");
  86.             exit();
  87.         }
  88.     }
  89.     else {
  90.         if ($user['user_password'] == $_POST['user_pass']) {
  91.             $_SESSION['nick'] = $login;
  92.             $_SESSION['profile'] = $user['user_rank'];
  93.             header("location: ./chat.php");
  94.             exit();
  95.         }
  96.         else {
  97.             $action = 'c';
  98.             header("location: ./index.php" . "?action=" . "$action");
  99.             exit();                                                  
  100.         }
  101.     }
  102. ?>


db_data_acceess.php:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $serv = 'localhost';
  3. $user = 'chat_base';
  4. $base = 'chat_base';
  5. $pass = '333123';
  6. ?>


enter_function.php
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include ('./db_data_access.php');
  3.  
  4. /*************************************************************************
  5. * is_inadmissible() - функция проверки на недопустимые символы           *
  6. *************************************************************************/
  7. function is_inadmissible($string){
  8.     $badchar = array('/','~','!','`','"','$','%','&','?','^',';',':','.');  //массив недопустимых символов
  9.     foreach ($badchar as $key=>$value) {
  10.         if (stripos($string, $value) === false) {
  11.             return true;
  12.         }
  13.         else {
  14.             return false;
  15.             break(1);
  16.         }
  17.     }
  18. }
  19. /*************************************************************************
  20. * safe_line - подготовка вносимых в базу данных в безопасный вид         *
  21. *************************************************************************/
  22. function safe_line($line) {
  23.     if (get_magic_quotes_gpc()) {
  24.             $line = stripslashes($line);
  25.         }
  26.         if (! is_numeric($line)) {
  27.             $line = mysql_real_escape_string($line);
  28.         }
  29.         return $line;
  30. }
  31. ?>


все файлы прилагаю в архиве))
2. EuGen - 11 Января, 2010 - 11:01:26 - перейти к сообщению
Не используйте "магические кавычки",
в остальном http://php.net/security
3. Champion - 11 Января, 2010 - 11:07:48 - перейти к сообщению
Hunter пишет:
enter.php :
Осталось добавить комментарии типа /* Открывается фигурная скобка от if */, /* Закрывается фигурная скобка от if */ ...
4. EuGen - 11 Января, 2010 - 11:11:20 - перейти к сообщению
Комментарии должны сообщать не что мы делаем, а зачем. Ну и, хороший код комментирует себя сам.
5. Hunter - 11 Января, 2010 - 17:04:25 - перейти к сообщению
EuGen, Champion все посмеялись?)))) да знаю я, просто код писался для одного человека в качестве примера, а коменты я просто забыл убрать...
(Добавление)
EuGen пишет:
Ну и, хороший код комментирует себя сам.

ну что верно то верно..., но если скажем код занимает строк 300 то трудно представить его без коментариев Подмигивание
6. EuGen - 11 Января, 2010 - 17:28:32 - перейти к сообщению
Мне не было смешно, если честно. То, что я указал - мое личное мнение.
7. Hunter - 11 Января, 2010 - 17:44:39 - перейти к сообщению
EuGen пишет:
в остальном http://php.net/security

с английским у меня туговато...Ну магические кавычки я сейчас уберу.. а что с остальным? Инъекция вроде не должна пройти, да и к базе я обращаюсь только с логином, если такой логин есть то помещаю необходимые данные о нем в массиве и проверка пароля происходит уже "вне базы"...
8. MegaMax - 07 Мая, 2010 - 19:56:14 - перейти к сообщению
Долго мучаюсь над своим проектом. хотел бы воспользоваться кодом данной авторизации. Возможно ли получить код всех страниц?
9. smok - 01 Октября, 2010 - 17:45:00 - перейти к сообщению
При беглом просмотре выявил:
PHP:
скопировать код в буфер обмена
  1.  
  2. function is_inadmissible($string){
  3.     $badchar = array('/','~','!','`','"','$','%','&','?','^',';',':','.');  //массив недопустимых символов
  4.     foreach ($badchar as $key=>$value) {
  5.         if (stripos($string, $value) === false) {
  6.             return true;
  7.         }
  8.         else {
  9.             return false;
  10.             break(1);
  11.         }
  12.     }
  13. }
  14.  


функция проверяет только первый символ, т.к. в обоих ветках if'a присутствует return. break после return не будет работать, т.к. функция вернула значение фолс и закончила свою работу.

 

Powered by ExBB FM 1.0 RC1