Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Эксперт по компьютерным сетямЭксперт NIX
13016 / 7407 / 801
Регистрация: 09.09.2009
Сообщений: 28,986
1

Скрипт авторизации не хочет работать с "новой" версией пхп

12.09.2012, 23:30. Показов 1258. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть такой себе файлик авторизации - auth.php:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
<?php
ini_set('display_errors',1);
//  подключаем дополнительные файлы
//    include("./mysql/db_connect.php");
    include("mysql.php");
    include("functions.php");
// определяем язык браузера
if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])){
        $lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2);
// в зависимости от этого подключаем файл с текстовкой
    if ($lang == "ru"){
        include ("russian.php");
    } else {
        include ("english.php");
    }
    }
// если пользователь заполнил форму авторизации
if (isset($_POST["authorize"]))
        {
        $login = mysql_escape_string($_POST['login']);
        $pass = clear_input1($_POST["password"]);
        $err_cnt = 0;
// открываем базу
            $link = db_connect(DB_HOST,DB_USER,DB_PASS) ;
            //or die (db_error());
            mysql_select_db (DB_NAME);
            //or die ("can't connect to database");
// считываем из базы строку, у которой логин совпадает с введеным значением
            $db="SELECT * FROM users WHERE username='".$login."';";
            $res = mysql_query ($db) ;
                $stings = mysql_fetch_array ($res);
// разбираем параметры пользователя - имя, пароль, роль, и пр...
                $base_id = $stings['0'];
                $base_username = $stings['1'];
                $base_password = $stings['2'];
                $base_realname = $stings['3'];
                $base_active = $stings['7'];
                $base_role = $stings['8'];
                $base_zone = $stings['11'];
// смотрим, сколько итого было строк с таким логином
            $numb = mysql_num_rows ($res);
        if ($numb < 1){ // в базе не было строк с таким именем
            $err_cnt ++;
            $errorStr = USER_S." ".$login." ".USER_DONT_EXIST1;
        } elseif ($base_active == 0) { // если в базе пользователь забанен
            $err_cnt ++;
            $errorStr = USER_S." ".$login." ".USER_BANED1 ;
        } elseif (md5($pass) != $base_password) { // если в базе указан другой пароль
            $err_cnt ++;
            $errorStr = WRONG_PASS;
        }
    if ($err_cnt == 0) { // если ошибок не было: логин и пароль введены верные, и юзер не забанен
                session_start();
                        $_SESSION["id"] = $base_id; // в сессию - id пользователя
                        $_SESSION["log"] = $login; // в сессию - логин пользователя
                        $_SESSION["realname"] = $base_realname; //в сессию - имя пользователя
                        $_SESSION["role"] = $base_role; //в сессию - роль пользователя
                        $_SESSION["zone"] = $base_zone; //в сессию - зону пользователя
                        $_SESSION["ip"] = $_SERVER['REMOTE_ADDR']; // в сессию - IP-адрес
// идентификатор сессии
            $ses_id = session_id();
// удаляем из базы если есть все сессии с таким же id
            $db="DELETE FROM sessions WHERE session_id='".$ses_id."';";
            $del = mysql_query ($db);
// пишем информацию о сессии в базу
            $db="INSERT INTO sessions (session_id, user_id, user_role, address) VALUES ('".$ses_id."','".$base_id."','".$base_role."','".$_SERVER['REMOTE_ADDR']."')  ;";
            $res = mysql_query ($db);
// в лог базы пишем, что пользователь успешно авторизовался
            $log_record = "User with login \"".$login."\" from address ".$_SERVER['REMOTE_ADDR']." logged in programm sucessfuly. ";
            $db = "INSERT INTO sys_log SET log_record='".$log_record."';";
            $log = mysql_query ($db);
            mysql_close ($link);
//redirect на запрошенную страницу
//                      header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']."");
//redirect на страницу index.php
                        header("Location: index.php");
        //              exit;
        } else {
// в лог базы пишем, что была попытка неавторизованного входа
            $log_record = "User authorization was unsuccess: login \"".$login."\", password \"".$pass."\", adress ".$_SERVER['REMOTE_ADDR'].". ";
            $db = "INSERT INTO sys_log SET log_record='".$log_record."';";
            $log = mysql_query ($db);
        }
            mysql_close ($link);
    }
// если запрос на выход из системы, уничтожаем сессию...
if (isset($_GET["action"]) AND $_GET["action"] == "logout" ){
        session_start();
            $ses_id = session_id();
// удаляем из базы запись о сессии
//          $ses_id = session_id();
            $link = db_connect(DB_HOST,DB_USER,DB_PASS);
            mysql_select_db (DB_NAME);
            $db="DELETE FROM sessions WHERE session_id='".$ses_id."' ;";
            $res = mysql_query ($db);
            mysql_close ($link);
// --------------------------------
        session_destroy();
        header("Location: index.php");
        exit;
}
 
if (isset($_REQUEST[session_name()])) { session_start();}
    $error = 0;
        $ses_id = session_id();
            $link = db_connect(DB_HOST,DB_USER,DB_PASS) ;
            mysql_select_db (DB_NAME) ;
            $db="SELECT user_id,user_role FROM sessions WHERE session_id='".$ses_id."' ;";
            $res = mysql_query ($db) ;
                $stings = mysql_fetch_array ($res);
                $session_base_id = $stings['0'];
                $session_base_role = $stings['1'];
            mysql_close ($link);
            if (isset($_SESSION['log']) AND $session_base_id != $_SESSION['id']){
            echo "It's an attempt of unauthorized login! (Are you trying to crack this program?)";
            $error = 1;
                        header("Location: auth.php?action=logout");
        session_destroy();
            }
 
if (isset($_SESSION['log']) AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR'] and $error == 0){
    return; }
else {
?>
<html>
<head>
<link rel=STYLESHEET href="style_adm.css" type="text/css">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title><?php echo PAGE_TITLE_AUTH ;?></title></head>
<body>
<p class="login_wrong">
<?php   if (isset($errorStr)) echo "$errorStr"; ?>
</p>
 
    <div id=login_div>
    <table class=login>
    <form name="form1" method="post" action="auth.php">
    <input type="hidden" name="authorize" value="1">
    <tr>
        <td colspan="2" class="login2">
        <h1><?php echo LOGIN_INVITATION;?></h1>
        </td>
    </tr>
    <tr>
        <td class=userdata_left>
            <?php echo LOGIN_FIELD; ?>:
        </td>
        <td class=userdata1 width="50%">
            <input class="enter" type="text" name="login">
        </td>
    </tr>
    <tr>
        <td class=userdata_left>
            <?php echo PASS_FIELD; ?>:
        </td>
        <td class=userdata1>
            <input class=enter type="password" name="password">
        </td>
    </tr>
    <tr>
        <td colspan="2" class="login2">
        <center>
            <input class="btn2" type="submit" value=" <?php echo LOGIN_BTN_NAME; ?> ">
        </center>
  </form>
        </td>
    </tr>
    </table></div>
</body>
</html>
<?
}
exit;
?>
Он без вопросов работал со старым конфигом пхп
(тут должен объяснить - мандрива, обновляя версию пхп, новую версию файла конфига (php.ini) кладет рядом, давая ему другое имя (php.ini.rpmnew), а в работе остается старый конфиг, который был в системе еще до обновления)
На определенном моменте решил я, что раз сам пхп новый, то пусть и конфиг у него будет новый.
После подключения нового конфига и перезапуска системы, скрипт авторизации работать перестал. Так как я им пользуюсь очень редко, то заметил я это тоже не сразу. Когда я это заметил, попытался поискать, что не так. Но безуспешно. Порывшись в памяти, на предмет того, "а что изменилось", я вспомнил про смену конфига. Вернул на место старый, вернул его на место, перезапустил систему и скрипт авторизации заработал снова.

В чем проявляется "неработа". Скрипт подключается в страницу индекса, давая доступ к ней только авторизованным. Подключение такое:
PHP
1
2
3
4
5
6
7
8
<&php
require "auth.php";
....
....
тут весь остальной код index.php
....
....
?>
Так вот, открываю индекс (пока еще не авторизован), как и положено, получаю форму ввода логина и пароля. Ввожу логин и пароль. Когда скрипт работает (со старым конфигом пхп), я попадаю на страницу индекса, и вижу там все то, что и ожидалось. Когда скрипт не работает (с новым конфигом пхп), то вместо страницы индекса снова появляется окно ввода логина и пароля.

В том, что логин и пароль правильные - уверен на все 100%, т.к., во первых, при вводе неверных логинов и паролей скриптом авторизации выводится сообщение об ошибке, а во вторых, скрипт авторизации пишет в базу в том числе лог. В строках 68-72 - код, который вписывает в базу сообщение об успешной авторизации пользователя. Так вот, получив вместо страницы индекса снова форму авторизации, я через phpmyadmin лезу в базу, и там наблюдаю, что пользователь успешно вошел в программу.

Что в этом скрипте авторизации такое, что не хочет работать в новой версии конфигурации?

В случае необходимости готов выложить оба варианта php.ini (с которым работает, и с которым - нет), здоровые они, правда, но zip еще никто не отменял...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2012, 23:30
Ответы с готовыми решениями:

Скрипт не работает с новой версией Jquery
Всем приветик! Вот этот код работает под jQuery 1.3.1, но совсем не хочет работать под jQuery...

Сменил версию пхп с 5.5 на 7.2 и перестал работать скрипт
Всем привет, скрипт раньше работал на версии пхп 5.2 и все было гуд сейчас версия PHP Version...

Сервер HP не хочет работать с новой оперативой
Всем привет!!!! Есть железо: Сервер HP Proliant ML150G6 E5520 (2.26GH-8MB)Quad Core (2 max)/...

Монитор не хочет работать с новой видеокартой
Монитор довольно старенький Bq С VGA разъёмом. Купил видеокарту Radeon RX 550. После установки...

Asus P5E3 pro не хочет работать с новой оперативкой
Доброго времени суток. Подскажите, пожалуйста, может кто в курсе, как решить данную проблему: ...

6
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.09.2012, 23:54 2
Цитата Сообщение от Dmitry Посмотреть сообщение
PHP
1
$login = mysql_escape_string($_POST['login']);
эта функция устарела, используйте mysql_real_escape_string() (а еще лучше mysqli вообще)

Добавлено через 1 минуту
и что будет если включены вдруг магические кавычки с экранированием в mysql_real_escape_string()?

Добавлено через 1 минуту
и они работают только после подсоединения с БД

Добавлено через 4 минуты
при отладке в самом начале
PHP
1
error_reporting(E_ALL | E_STRICT);
помимо вашей display_errors, тогда уже получше будет
И почитайте (или хотя бы вкратце просмотрите) здесь FAQ по распространенным ошибкам и здесь Работа с БД MySQL
0
Эксперт по компьютерным сетямЭксперт NIX
13016 / 7407 / 801
Регистрация: 09.09.2009
Сообщений: 28,986
13.09.2012, 10:16  [ТС] 3
Цитата Сообщение от KOPOJI Посмотреть сообщение
при отладке в самом начале
PHP
1
error_reporting(E_ALL | E_STRICT);
помимо вашей display_errors, тогда уже получше будет
добавил, подключил новый конфиг пхп и перезагрузил апач и пхп
НИКАКИХ сообщений об ошибках нет. Ну, и естественно, авторизации тоже нет.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
13.09.2012, 11:22 4
а Вы почитали по ссылкам что я приводил про отладку запросов и самой программы, пробовали?
0
Эксперт по компьютерным сетямЭксперт NIX
13016 / 7407 / 801
Регистрация: 09.09.2009
Сообщений: 28,986
13.09.2012, 13:09  [ТС] 5
Цитата Сообщение от KOPOJI Посмотреть сообщение
а Вы почитали по ссылкам что я приводил про отладку запросов и самой программы, пробовали?
в данном случае отвечу, что не могу понять, о чем идет речь.
Что именно оптимизировать?
По крайней мере, по вашим ссылкам - по работе с мускульной базе. С этим проблем НЕТ - все что надо в базу пишется и читается без вопросов.

А вот с чем проблема я в упор не могу понять...

Добавлено через 16 минут
Цитата Сообщение от KOPOJI Посмотреть сообщение
про отладку запросов и самой программы
плиз, ткните носом, что именно там искать?

Добавлено через 38 минут
В целях отладки вставил в скрипте
PHP
1
2
3
foreach ($_SESSION AS $field => $value){
     echo "$field = $value <br>";
}
в районе между строками 121 и 122 (то есть, return идет уже после этого цикла)

Когда все ОК, скрипт показывает все параметры, записанные в сессию:
id = 1
username = test_user
realname = Фамилия имя отчество
role = 1
zone = 1
ip = 192.168.1.100
в случае же конфига, с которым не работает, выводится вот тамкое сообщение:
Notice: Undefined variable: _SESSION in /var/www/login/admin/auth.php on line 123 Warning: Invalid argument supplied for foreach() in /var/www/login/admin/auth.php on line 123
Получается, что сессия отсутствует?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
13.09.2012, 13:17 6
Цитата Сообщение от Dmitry Посмотреть сообщение
PHP
1
$db="SELECT * FROM users WHERE username='".$login."';";
Плохо читали. Как раз, про БД и надо было смотреть. Вы уверены что запросы уходят такие как вам надо?
PHP
1
2
$db="SELECT * FROM users WHERE username='".$login."';";
echo $db;exit;
и т.д.
к запросам добавить вывод ошибок, проверять все запросы и переменные. Проверить сессии - почему не работает, быть может есть какой то вывод заголовков в браузер до этого? Почитать про заголовке в прикрепленной теме, в начале скрипта написать ob_start..
0
Эксперт по компьютерным сетямЭксперт NIX
13016 / 7407 / 801
Регистрация: 09.09.2009
Сообщений: 28,986
13.09.2012, 15:11  [ТС] 7
Цитата Сообщение от KOPOJI Посмотреть сообщение
Плохо читали. Как раз, про БД и надо было смотреть. Вы уверены что запросы уходят такие как вам надо?
уверен - т.к. это уже проверялось ранее, вплоть до просмотра считанного из базы содержимого - с базой вопросов никаких. сегодня еще раз перепроверил, считывается именно то, что и хотелось. Дополнительно (и сегодня снова) вносил в скрипт (специально) ошибки в запросы, тогда он выводил как раз матюки про ошибки типа вот таких:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/login/admin/auth.php on line 37 Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /var/www/login/admin/auth.php on line 47 Notice:
То есть, в данном случае проблема не с базой однозначно.

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

Добавлено через 1 час 37 минут
как показала жизнь.... (да-да, именно метод "научного тыка")

...при старом конфиге вот эта конструкция
PHP
1
if (isset($_REQUEST[session_name()])) { session_start();}
размещенная "где-то в глубине файла" РАБОТАЛА

При новом конфиге, даже перенос ее в самую "вторую" (после <?php) строку файла, ничего не давал!

Помогло лишь удаление этой "конструкции", ПЛЮС прописание "второй" строкой ПРЯМОГО БЕЗУСЛОВНОГО указания запустить сессию, т.е. просто такой вот команды:
PHP
1
session_start();
В таком варианте - все заработало как надо и на новом конфиге.

Единственный напросившийся по результатам "вывод", - со старым конфигом "кто-то" (или "что-то") ТАКИ ЗАПРАШИВАЛ имя сессии - $_REQUEST[session_name()], и тогда скрипт ее запускал, а при новом конфиге такого запроса НЕ ПРОИСХОДИТ, и сессию нужно по любому стартовать принудительно....
0
13.09.2012, 15:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2012, 15:11
Помогаю со студенческими работами здесь

скрипт не хочет работать
Решил написать скриптец для авторизации и только после нее что б подключалась база данных, также...

Не хочет работать скрипт
Всем привет! Почему-то не работает, вроде б всё правильно написано.. При клике должен появляться...

скрипт не хочет работать в ІЕ(
есть такой код: &lt;dl class=&quot;top_menu&quot; id=&quot;menu&quot;&gt; &lt;dt&gt;&lt;a href=&quot;#&quot;...

Скрипт авторизации перестал работать
Проблема такая: у меня скрипт проверяет есть ли такой логин в таблице accounts и если да завершает...

Скрипт не хочет работать с <object>
Здравствуйте, столкнулся с такой вот проблемой $(function(){ ...

Скрипт не хочет работать - меню мерцает.
&lt;html&gt; &lt;head&gt; &lt;title&gt;&lt;/title&gt; &lt;META http-equiv=&quot;Content-Type&quot; content=&quot;text/html;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru