Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Админка
 
 автор: Лена   (23.12.2008 в 23:38)   письмо автору
 
 

Форма:

<form action='../admin.php' method='post'>
 <input type=hidden name='session_id' value=<?php echo session_id(); ?>>
     <table width=220 border=0 align='center' cellpadding=0 cellspacing=0>
      <tr>
        <td> 
          <div align='center'>
            <input name='name' type='text' id='nick' onFocus="if(this.value=='Логин')
{this.value='';}this.className='loginsover'" onBlur="if(this.value=='')
{this.value='Логин';}this.className='logins'"  value='<?php if($_POST['name']) echo htmlspecialchars($_POST['name']);?>' class='logins'>
            </div></td>
      </tr>
      <tr>
        <td><div align='center'>
          <input name='pass' type='password' id='pass' onFocus="if(this.value=='Пароль')
{this.value='';}this.className='loginsover'" onBlur="if(this.value=='')
{this.value='Пароль';}this.className='logins'" value='<?php if($_POST['pass']) echo 
md5($_POST['pass']);?>' class='logins'>
        </div></td>
      </tr>
      <tr>
        <td><div align='center'><br>
          <input name='Enter' type='submit' class='but' onClick="this.value='Входим...';" 
onMouseOver="this.style.color='#72acdd';" onMouseOut="this.style.color='#6497c2';" value='Войти'>
        </div></td>
      </tr>
    </table>
    </form>


Обработчик:

<?php
include("configs/dbopen.php");
session_start();
//ошибки
$error = array();

if(isset(
$_POST['Enter'])){
    
//Сравниваем переданный идентификатор из формы с текущим идентификатором сессии
    
if($_POST['session_id'] != session_id()){
    echo 
session_id();
    exit(
"Попытка передачи данных с другого хоста. Скрипт остановлен.");
    }
    
// Защита от SQL-инъекции
    
if (!get_magic_quotes_gpc()){
    
$_POST['name'] = mysql_escape_string($_POST['name']);
    
$_POST['pass'] = mysql_escape_string($_POST['pass']);
    }
    
//если есть ошибки, выводим предупреждение
    
if(!$_POST['name']) $error['name'] = "Введите свой логин!";
    if(!
$POST['pass']) $error['pass'] = "Введите пароль";
    
//если ошибок нет...
    
if(!$error){
    
//Формируем и выполняем SQL-запрос имеется ли пользователь
    //с именем $_POST['name']
   
$sql "SELECT pass = MD5('$_POST[pass]'), id_group FROM users WHERE login = '$_POST[name]'";
   
$res mysql_query($sql);

     if(!
$res) exit("Error in $sql: "mysql_error());
     
//Если запрос вернул результат - производим дальнейшую обработку
          
if(mysql_num_rows($res) > 0){
            
//Идентификация прошла успешно - осуществляем
            //вход посетителя
            
if(session_start()){
            
$_SESSION['name'] = $_POST['name'];
            
$_SESSION['pass'] = $_POST['pass'];
            
//статус пользователя
            
$_SESSION['status'] = mysql_result($res,0,"id_group");

                if(!empty(
$_SESSION['name']))
                echo 
"Добро пожаловать, " $_SESSION['name'];
                
                if(isset(
$_SESSION['status'])){
                
$sql "SELECT type_group FROM groups WHERE id_group = '$_SESSION[status]'"
                
//print $sql;
                
$res mysql_query($sql);
                if(!
$res) exit("Error in $sql: "mysql_error());
                
$group mysql_result($res,0,"type_group");
                    if(
$group == 'admin'){
                     echo 
"<br />Привет, админ ".$_SESSION['name'] . ". Заждались тебя...";
                    include(
"cms.php");
                    }else
                        echo 
"Извините, уважаемый, но вы не админ! Уходите по-хорошему.";
                }
              }else exit(
"Ошибка идентификации: неправильный пароль");
          }else exit(
"Ошибка индентификации: пользователь не зарегистрирован"); 
    }
}
if(!isset(
$_POST['Enter'])){
//ошибки
    
if($error)
        print 
"<p style='color: #ff0000;'>" $error "</p>";
//вывод формы
include("admin/admin_form.php");
}
?>


Обработчик выдает пустую страницу, без ошибок

  Ответить  
 
 автор: Valick   (23.12.2008 в 23:54)   письмо автору
 
   для: Лена   (23.12.2008 в 23:38)
 

прпробуйте для начала поменять местами.. вот так:

session_start();
include("configs/dbopen.php"); 

  Ответить  
 
 автор: Trianon   (24.12.2008 в 00:00)   письмо автору
 
   для: Лена   (23.12.2008 в 23:38)
 

факт равенства хешей паролей Вы не проверяете.
В качестве пароля можно набирать что угодно.

  Ответить  
 
 автор: Лена   (24.12.2008 в 21:31)   письмо автору
 
   для: Trianon   (24.12.2008 в 00:00)
 

Вот так поменяла:

<?php
if(!$error){
    
//Формируем и выполняем SQL-запрос имеется ли пользователь
    //с именем $_POST['name']
    
$pass md5($_POST['pass']);
    
$sql "SELECT * FROM users WHERE login = '$_POST[name]'";
    
$res mysql_query($sql);
     if(!
$res) exit("Error in $sql: "mysql_error());
     
//Если запрос вернул результат - производим дальнейшую обработку
          
if(mysql_num_rows($res) > 0){
            
$log_pass mysql_fetch_assoc($res); 
            if (
$pass == $log_pass['pass']) {
            
//вход посетителя
                
if(session_start()){
?>


Без изменений. Пустая страница

  Ответить  
 
 автор: Николай2357   (25.12.2008 в 00:27)   письмо автору
 
   для: Лена   (24.12.2008 в 21:31)
 

Ну вот, стоп. На самом интересном месте... ))) А почему Вы сразу не хотите запрос по условию сформировать? Вроде так проще обработать потом:
<?
$sql 
"SELECT * FROM users WHERE login = '$_POST[name]' AND pass='".md5($_POST['pass'])."'";

  Ответить  
 
 автор: Trianon   (25.12.2008 в 01:03)   письмо автору
 
   для: Николай2357   (25.12.2008 в 00:27)
 

человек хочет подумать сам. А Вы ему в этом нехитром желании отказали. Довольно редком, среди обитателей этого портала, между прочим... Фу.

  Ответить  
 
 автор: Николай2357   (25.12.2008 в 01:13)   письмо автору
 
   для: Trianon   (25.12.2008 в 01:03)
 

Можно не смотреть, если не хочет. А может потом поможет... А мне спать пора. Ни чё не Фу.

  Ответить  
 
 автор: Лена   (25.12.2008 в 20:23)   письмо автору
 
   для: Trianon   (25.12.2008 в 01:03)
 

Получилось вот что:

<?php
session_start
();
include(
"configs/dbopen.php");
//ошибки
$error = array();
if(isset(
$_POST['Enter'])){
print_r($_POST);
    
// Защита от SQL-инъекции
    
if (!get_magic_quotes_gpc()){
    
$_POST['name'] = mysql_escape_string($_POST['name']);
    
$_POST['pass'] = mysql_escape_string($_POST['pass']);
    }
    
//если есть ошибки, формируем массив ошибок
    
if(empty($_POST['name'])) $error['name'] = "Введите свой логин!";
    if(empty(
$POST['pass'])) $error['pass'] = "Введите пароль!";
    
//Формируем и выполняем SQL-запрос имеется ли пользователь
    //с именем $_POST['name']
    
$sql "SELECT * FROM users WHERE login = '$_POST[name]' AND pass = '" md5($_POST['pass']) ."'";
    
    
$res mysql_query($sql);
     if(!
$res) exit("Error in $sql: "mysql_error());
     
//Если запрос вернул результат - производим дальнейшую обработку
          
if(mysql_num_rows($res) > 0){
            
//вход посетителя
                
if(session_start()){
                
$_SESSION['name'] = $_POST['name'];
                
$_SESSION['pass'] = $_POST['pass'];
                
//статус пользователя
                
$_SESSION['status'] = mysql_result($res,0,"id_group");
                    if(!empty(
$_SESSION['name']))
                    echo 
"Добро пожаловать, " $_SESSION['name'];
                    if(isset(
$_SESSION['status'])){
                    
$sql "SELECT type_group FROM groups WHERE id_group = '$_SESSION[status]'"
                    
//print $sql;
                    
$res mysql_query($sql);
                    if(!
$res) exit("Error in $sql: "mysql_error());
                    
$group mysql_result($res,0,"type_group");
                        if(
$group == 'admin'){
                         echo 
"<br />Привет, админ ".$_SESSION['name'] . ". Заждались тебя...";
                        include(
"admin/cms.php");
                        }else
                        echo 
"Извините, уважаемый, но вы не админ! Уходите по-хорошему.";
                    }
                }
        }
}
if(!isset(
$_POST['Enter']) || $error){
//ошибки
        
foreach ($error as $e)
            print 
"<center><strong><p style='color: #ff0000;'>" $e "</p></strong></center>";
//вывод формы
include("admin/admin_form.php");
}
?>



Когда не заполняю поля - появляются сообщения об ошибках, как и надо. А когда заполняю все поля, пост массив, допустим, такой Array ( [name] => admin [pass] => admin [Enter] => Войти ), то вместе с надписью "Добро пожаловать, admin" появляется сообщение "Введите пароль!" и сама форма, хотя пароль уже введен и передан. В чем причина - не пойму.

  Ответить  
 
 автор: Николай2357   (25.12.2008 в 20:46)   письмо автору
 
   для: Лена   (25.12.2008 в 20:23)
 

Вот эта строчка:
<?
$_POST
['pass'] = mysql_escape_string($_POST['pass']);
у Вас явно лишняя, и может испортить всё дело.Инъекция и так не пролезет, Вы же подставляете в запрос хэш, а не значение переменной.
А вот тут Вы пропустили чёрточку ))):
<?
if(empty($POST['pass'])) $error['pass'] = "Введите пароль!";

  Ответить  
 
 автор: Лена   (25.12.2008 в 23:13)   письмо автору
 
   для: Николай2357   (25.12.2008 в 20:46)
 

Представляете, вот из-за этой черточки и не работало! Спасибо.
Просто вбиваю все сама и как-то пропустила. Буду внимательней.

  Ответить  
 
 автор: AcidTrash   (24.12.2008 в 22:01)   письмо автору
 
   для: Trianon   (24.12.2008 в 00:00)
 

-

  Ответить  
 
 автор: AcidTrash   (24.12.2008 в 22:19)   письмо автору
 
   для: Лена   (23.12.2008 в 23:38)
 

<input name='pass' type='password' id='pass' onFocus="if(this.value=='Пароль')
{this.value='';}this.className='loginsover'" onBlur="if(this.value=='')
{this.value='Пароль';}this.className='logins'" value='<?php if($_POST['pass']) echo
md5($_POST['pass']);?>' class='logins'>
SELECT pass = MD5('$_POST[pass]'),

Здесь уже будет хеш, далее получается вы хотите вывести из базы то, что вы захешировали в форме и повторным MD5 в запросе, пытаетесь вывести хеш хеша(пароля) при выводе, соответственно равенства не будет.

  Ответить  
 
 автор: Лена   (24.12.2008 в 23:00)   письмо автору
 
   для: AcidTrash   (24.12.2008 в 22:19)
 

Это уже исправила.
Данные формы вообще не передаются в обработчик. Все из-за <input type= 'hidden' name='session_id' value='<?php echo session_id(); ?>'>
Если его нет - все нормально.

  Ответить  
 
 автор: Valick   (24.12.2008 в 23:26)   письмо автору
 
   для: Лена   (24.12.2008 в 23:00)
 

print_r($_POST); 

  Ответить  
 
 автор: Лена   (25.12.2008 в 00:06)   письмо автору
 
   для: Valick   (24.12.2008 в 23:26)
 

print_r($_POST) выводит переданный массив. А страница пустая.
Дайте сама подумаю. Всем стоп!

  Ответить  
 
 автор: devzorg   (24.12.2008 в 23:37)   письмо автору
 
   для: Лена   (24.12.2008 в 23:00)
 

а зачем сессию передавать в форме ?? она и так доступна всегда

  Ответить  
 
 автор: AcidTrash   (24.12.2008 в 23:39)   письмо автору
 
   для: Лена   (24.12.2008 в 23:00)
 

session_id();
А зачем вам оная нужна?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования