Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2010, 18:36   #1
skeletor
Пользователь
 
Аватар для skeletor
 
Регистрация: 21.06.2010
Сообщений: 13
По умолчанию Покритикуйте код авторизации

Скажу сразу, код работает, просто интересно, может стоит где-то оптимизировать или поправить, как нужно.

Собственно имеем такую структуру:
connect.php - подключение к БД
functions.php - описание функций для обработки вводимых данных
index.php - страница с формой авторизации
login.php - авторизация
logout.php - выход
main.php - главная страница

Интересует правильно ли провожу авторизацию и выход.

login.php

Код:
<?php

include 'functions.php';
include 'connect.php';

if (isset($_COOKIE['name'])) 
{
    header("Location: main.php");
    exit(0);
} 

if (!isset($fPassword) or !isset($fUsername))
{
    header("Location: index.php");
    exit(0);   
}

$table_admin = "admin";
$table_domain_admins = "domain_admins";

$result = mysql_query ("SELECT password FROM $table_admin WHERE username='$fUsername' AND active='1'");
$row = mysql_fetch_row($result);   
     
$password = pacrypt ($fPassword,$row['0']);
       
    if ($password == $row['0'])
    {
        session_start();
        session_regenerate_id();
        $sessid = session_id();
        setcookie("name",$fUsername,time()+3600);
        setcookie("sessid",$sessid,time()+3600);       
        header("Location: main.php");
        exit(0);
    }

    else die('error set cookies');

mysql_close();

if (!isset($_COOKIE['name'])) 
{
    header("Location: index.php");
    exit(0);
} 

?>
logout.php


Код:
<?php

if (isset($_COOKIE['name']))
{
    session_start();
    setcookie('name', '', -1);
    session_destroy();  
}

header("Location: index.php"); 
 
?>
"Винда съела дрова и резет здесь не фурычит."
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих фалов вообще нет!"
skeletor вне форума Ответить с цитированием
Старый 28.07.2010, 19:17   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

1.У вас register_globals=On что ли..??? :
Цитата:
if (!isset($fPassword) or !isset($fUsername))
2.Ваш SELECT лучше ограничить LIMIT 1 на всяк случай + проверять в WHERE нужно бы пару Username/Password,а не только Username (на случай если вдруг у вас случатся юзеры с одинаковым Username)

3.Данные перед запросом к БД обработайте хотя бы mysql_real_escape_string();

4.Не совсем понятно без описания функции вот это:
Цитата:
$password = pacrypt ($fPassword,$row['0']);
Формируем $password на основании пользовательского $fPassword и $row['0'] из БД - затем используем его в проверке на идентичность тому же $row['0'] :
Цитата:
if ($password == $row['0'])
- ну мож это я чего не знаю....
Andkorol вне форума Ответить с цитированием
Старый 28.07.2010, 19:24   #3
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Также неплохо бы проверить сначала,вернул ли ваш запрос результат(mysql_num_rows() например) - а то без результата заругается ваш pacrypt()
Andkorol вне форума Ответить с цитированием
Старый 28.07.2010, 19:32   #4
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

В принципе правильно, только у Вас:
- register_globals=On.
- из примера непонятно откуда берётся $fPassword.
- logout.php на некоторых версиях FF может глючить.
Виталий Желтяков вне форума Ответить с цитированием
Старый 28.07.2010, 19:53   #5
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
из примера непонятно откуда берётся $fPassword.
Из register_globals=On и берётся,вероятно....)))))
Andkorol вне форума Ответить с цитированием
Старый 29.07.2010, 12:56   #6
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

5 минут на взлом такого скрипта. Облегчить взлом скрипта можно только написанием админского логина и пароля на главной странице.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 30.07.2010, 05:53   #7
dekameron
Форумчанин
 
Аватар для dekameron
 
Регистрация: 27.04.2010
Сообщений: 185
По умолчанию

Johnatan, полностью согласен

Я раньше так делал
PHP код:
<?php 
//Куча require_once() для задания настроек, декларации функций, коннекта к БД и прочей хрени
if(isset($_POST['auth_ok'])){
    if(isset(
$id)){
        
$_SESSION['er']='is_auth';
        
header("location: /?");
        exit;
    }else{
        
$login=check(strtolower($_POST['log']));
        
$pass=md5($_POST['pswd']);
        
$query=mysql_query("SELECT id FROM `users` WHERE login = '$login' AND pass = '$pass' LIMIT 1;")or die(mysql_error());
        if(
mysql_num_rows($query)==0){
            
$_SESSION['er']='err_auth';
            
header("location: /?");
            exit;
        }else{
            
$id=mysql_result($query,0,0);
            
$_SESSION['id']=$id;
            
$_SESSION['pass']=$pass;
            
$_SESSION['login']=$login;
            
setcookie('id',$id,$time+30672000,'/');
            
setcookie('pass',$pass,$time+30672000,'/');
            
setcookie('login',$login,$time+30672000,'/');
            
$_SESSION['er']='auth_ok';
            
header("location: /?");
            exit;
        };
    };
};
endpage(); //Дисконнект, выход
 
?>

Функции
PHP код:
<?php
function check($message){ 
    
$message=str_replace("|","I",$message); 
    
$message=str_replace("||","I",$message);
    
$message=htmlspecialchars($message);                  
    
$message=str_replace("'","'",$message);            
    
$message=str_replace("\"",""",$message);  
    
$message=str_replace("\$","$",$message);    
    
$message=str_replace("$","$",$message);          
    
$message=str_replace("\\","\", $message);                            
    
$message=str_replace("`","", $message);  
    
$message=str_replace("^","^", $message);   
    
$message=str_replace("%","%", $message);  
    
$message=str_replace(":",":",$message);  
    
$message=preg_replace("|:|",":",$message,3); 
    
$message=stripslashes(trim($message));               
    
$message=mysql_real_escape_string($message);               
    return 
$message;
    //Не знаю, как подшаманить, чтобы вывело (&_#39; (без подчеркивания)), а не сразу символы, но суть ясна :)
}

function endpage(){
    mysql_close();
    exit;
}

?>
Помог - тырк на весы

Последний раз редактировалось dekameron; 30.07.2010 в 05:59.
dekameron вне форума Ответить с цитированием
Старый 30.07.2010, 08:03   #8
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Цитата:
Я раньше так делал
А где здесь проверка кук? Где очищение сессии и убийство кук?
Код:
function check($message){  
    $message=str_replace("|","I",$message);  
    $message=str_replace("||","I",$message); 
    $message=htmlspecialchars($message);                   
    $message=str_replace("'","'",$message);             
    $message=str_replace("\"",""",$message);   
    $message=str_replace("$","$",$message);     
    $message=str_replace("$","$",$message);           
    $message=str_replace("","", $message);                             
    $message=str_replace("`","", $message);   
    $message=str_replace("^","^", $message);    
    $message=str_replace("%","%", $message);   
    $message=str_replace(":",":",$message);   
    $message=preg_replace("|:|",":",$message,3);  
    $message=stripslashes(trim($message));                
    $message=mysql_real_escape_string($message);                
    return $message; 
    //Не знаю, как подшаманить, чтобы вывело (&_#39; (без подчеркивания)), а не сразу символы, но суть ясна :) 
}
Подход неправильный. Тут проверка по белому списку, а надо использовать черный, т.к. взломщик может использовать различные спецсимволы.
Виталий Желтяков вне форума Ответить с цитированием
Старый 30.07.2010, 09:29   #9
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

dekameron
ааааааааааааааааааааа!!!!!!!!
Это вообще что такое?
PHP код:
$message=str_replace("$","$",$message);
$message=str_replace("^","^"$message);    
$message=str_replace("%","%"$message);
$message=str_replace(":",":",$message); 
Зачем вы меняете символ на такой же? Почему вы хотя-бы не делает это в цикле, хотя это вообще делать не надо.
PHP код:
$message=str_replace("",""$message); 
ХИТ всех времён и народов!
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 30.07.2010, 11:57   #10
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Цитата:
Сообщение от dekameron Посмотреть сообщение
Я раньше так делал
Мне Вас искренне жаль. Молюсь богам программеров, чтобы вы больше так не делали.
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на С++. Покритикуйте код, будьте добры)) iehf Помощь студентам 9 30.03.2010 15:02
Подскажите по авторизации Rock'n'rolla Работа с сетью в Delphi 3 22.01.2010 19:21
Вопрос по авторизации Anatol_rus Работа с сетью в Delphi 2 15.10.2009 16:20
Окно авторизации HAMMAN Помощь студентам 2 13.05.2008 11:58