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

Форум PHP

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

 

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

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

тема: Авторизация на php.скрипт.
 
 автор: Софья1   (06.09.2014 в 18:57)   письмо автору
 
 

У меня база в Mysql, в ней две таблицы( students и teachers). в каждой уже есть посетители с логинами и паролями. (столбцы: imya, login,parol)
можете помочь со скриптом не могу сделать обыкновенную авторизацию.Спасибо!

  Ответить  
 
 автор: moonfox   (06.09.2014 в 22:21)   письмо автору
 
   для: Софья1   (06.09.2014 в 18:57)
 


<?php
session_start
();


  function 
auth($login$password)
  {

     
$res mysql_query('SELECT `id`, `imya`, `login`, `parol` FROM `'.USER_TABLE.'` WHERE `login` = "'.mysql_real_escape_string($login).'"');
     
$data mysql_fetch_array($res);

     if(
$data['login'] == $login && $data['parol'] == md5(md5($data['login']).md5($password)))
     {
       
$session $data['id'];
       
$agent md5($_SERVER['HTTP_USER_AGENT']);
       
       return array(
$session$agent);
     }
          
     return 
false;
  }  
  
if(isset(
$Submit))
{
   if((
$login trim($_POST['login'])) && $password trim($_POST['parol']))
   {
          list(
$session$agent) = auth($login$password);
       
          if(
$session)
            {
              
$_SESSION['valid_user'] = $session;
              
$_SESSION['HTTP_USER_AGENT'] = $agent;

              
header('location:?success');
            }
            else                 
            
header('location:?error');
                 
   } 
   else   
   
header('location:?empty');
}

?>

  Ответить  
 
 автор: psychomc   (07.09.2014 в 01:34)   письмо автору
 
   для: moonfox   (06.09.2014 в 22:21)
 

не очень хороший пример с точки зрения логики ("агент" в auth, транслит, md5md5) и сама реализация не айс (странное расставление скобок и будут notice)

  Ответить  
 
 автор: moonfox   (07.09.2014 в 03:27)   письмо автору
 
   для: psychomc   (07.09.2014 в 01:34)
 

какой транслит?
какие скобки?
почему у меня нет нотисов? они включены)
чем вам агент там не подходит?
)))))

  Ответить  
 
 автор: psychomc   (07.09.2014 в 14:19)   письмо автору
 
   для: moonfox   (07.09.2014 в 03:27)
 

"parol" - это на каком языке?
если здесь mysql_fetch_array вернет false
$data = mysql_fetch_array($res);

то здесь по-вашему не будет notice?
if($data['login'] == $login && $data['parol'] == md5(md5($data['login']).md5($password)))

или если здесь auth вернёт false
list($session, $agent) = auth($login, $password);  

тоже notice не будет?

)))))))))))))))))))))))))))))))))

  Ответить  
 
 автор: moonfox   (07.09.2014 в 18:56)   письмо автору
 
   для: psychomc   (07.09.2014 в 14:19)
 

parol это не мое если вы не заметили) это из таблицы мадемуазель.
да и это не имеет отношения к работоспособности

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

  Ответить  
 
 автор: moonfox   (07.09.2014 в 19:17)   письмо автору
 
   для: psychomc   (07.09.2014 в 14:19)
 

хм....
в чем засада?)))
если написать
print_r($ttt);
if($data['login'] == .......

я таки получаю, Undefined variable: tttt D:\vhosts\flat\base\func.php in line: 14
но с пустой $data - все норм)))))

вай вай, если вызвать print_r($data) до $data = $this->result->fetch_array(MYSQLI_ASSOC);
- будет nitice
так, почему же его нет после попытки получить массив? который не формирунтся



<?php
class login extends db 
{
protected 
$session;
protected 
$agent;

  function 
auth($name$password)
  {

     
$sql 'SELECT * FROM `'.USER_TABLE.'` WHERE `login` = "'.$this->mysqli->real_escape_string($name).'";';
     
$this->result $this->mysqli->query($sql);
     
     
print_r($data);  // notice
     
$data $this->result->fetch_array(MYSQLI_ASSOC);
     
print_r($data); // нет notice
     

     
if($data['login'] == $name && $data['pass'] == md5(md5($data['milo']).md5($password)))
     {
       
$this->session $data['id'];
       
$this->agent md5($_SERVER['HTTP_USER_AGENT']);
       
       return array(
$this->session$this->agent);
     }
          
     return 
false;
  }  
}
?>

  Ответить  
 
 автор: psychomc   (07.09.2014 в 21:08)   письмо автору
 
   для: moonfox   (07.09.2014 в 19:17)
 

что вы за чушь пишите?

<?php
 print_r
($data);  // notice 
     
$data $this->result->fetch_array(MYSQLI_ASSOC); 
     
print_r($data); // нет notice КОНЕЧНО ЖЕ ЗДЕСЬ ЕГО НЕТ, ПОТОМУ ЧТО $data ОПРЕДЕЛЕНА НА ПРЕДЫДУЩЕЙ СТРОКЕ

засада в мануале.

  Ответить  
 
 автор: moonfox   (07.09.2014 в 21:24)   письмо автору
 
   для: psychomc   (07.09.2014 в 21:08)
 

ох пустая переменная ...
совсем профтыкал
почему должен вообще быть нотис?
data = null

  Ответить  
 
 автор: psychomc   (07.09.2014 в 22:50)   письмо автору
 
   для: moonfox   (07.09.2014 в 21:24)
 

я уже написал про мануал

  Ответить  
 
 автор: moonfox   (07.09.2014 в 22:54)   письмо автору
 
   для: psychomc   (07.09.2014 в 22:50)
 

ссылку можно? что конкретно вы хотите чтоб я увидел?
у вас нотис есть?

  Ответить  
 
 автор: psychomc   (08.09.2014 в 11:22)   письмо автору
 
   для: moonfox   (07.09.2014 в 22:54)
 

мне, чтобы понять что будет notice, не обязательно запускать этот "скрипт".
http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

  Ответить  
 
 автор: moonfox   (08.09.2014 в 16:47)   письмо автору
 
   для: psychomc   (08.09.2014 в 11:22)
 

вы проверьте
и объясните почему его нет.

  Ответить  
 
 автор: psychomc   (08.09.2014 в 17:50)   письмо автору
 
   для: moonfox   (08.09.2014 в 16:47)
 

где нет? здесь?

<?php
print_r
($data);  // notice 
     
$data $this->result->fetch_array(MYSQLI_ASSOC); 
     
print_r($data); // нет notice 

я же уже объяснил. что не понятно?

  Ответить  
 
 автор: moonfox   (08.09.2014 в 17:54)   письмо автору
 
   для: psychomc   (08.09.2014 в 17:50)
 

нет не здесь, здесь я сам протупил.
вы вообще поняли суть запроса?
этим самым вы сами отвечаете на свое "там будет нотис"

$var = null;
echo $var[0];

так вот и расскажите почему должен быть нотис?
приведенный ранее пример не оповещает ни о каких замечаниях.

  Ответить  
 
 автор: psychomc   (08.09.2014 в 18:06)   письмо автору
 
   для: moonfox   (08.09.2014 в 17:54)
 

да, пардон. мой факап, notice будет только если $var массив. проблема в том, что все равно вот так

<?php
    $data 
mysql_fetch_array($res); 
     if(
$data['login'] == $login && $data['parol'] == md5(md5($data['login']).md5($password))) 
     { 

писать неправильно, правильно будет вот так

<?php
    
if ($data mysql_fetch_array($res))  { 
        if(
$data['login'] == $login && $data['parol'] == md5(md5($data['login']).md5($password))) 
        { 

хотя бы с точки зрения дальнейшего сопровождения кода, потому как совсем не обязательно, что в скобках будут те же проверки и не появится каких-либо действий, который там однозначно быть не должно, если mysql_fetch_array вернет false

  Ответить  
 
 автор: moonfox   (08.09.2014 в 18:09)   письмо автору
 
   для: psychomc   (08.09.2014 в 18:06)
 

ну это такое дело)
конечно стоит как вы указали)
спасибо за дискуссию.

  Ответить  
 
 автор: psychomc   (08.09.2014 в 18:15)   письмо автору
 
   для: moonfox   (08.09.2014 в 18:09)
 

взаимно. открыл для себя странность в php с $boolean_var['undefined']

  Ответить  
 
 автор: Valick   (07.09.2014 в 06:26)   письмо автору
 
   для: Софья1   (06.09.2014 в 18:57)
 

Софья, в сети полно скриптов авторизации и регистрации. Я тут выкладывал простенькое решение одним файлом http://softtime.ru/forum/read.php?id_forum=1&id_theme=85497
А вот то что у вас две разные таблицы students и teachers это плохо (очень плохо). Должна быть одна единственная таблица пользователей, а у ж кто они там учителя, студенты, уборщицы, ректоры - это должно быть отражено на уровне данных, а не на уровне сущности таблиц., по крайней мере для авторизации.

  Ответить  
 
 автор: psychomc   (08.09.2014 в 11:23)   письмо автору
 
   для: Valick   (07.09.2014 в 06:26)
 

вам тоже не мешало бы почитать http://php.net/manual/en/errorfunc.configuration.php#ini.error-reporting

  Ответить  
 
 автор: Valick   (08.09.2014 в 19:22)   письмо автору
 
   для: psychomc   (08.09.2014 в 11:23)
 

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

  Ответить  
 
 автор: psychomc   (08.09.2014 в 19:52)   письмо автору
 
   для: Valick   (08.09.2014 в 19:22)
 

Что-то вроде "сначала добейся"? Я просто считаю, что лучше ничего, чем пример с ошибками. У меня, к сожалению, нет времени на это. Давно не пишу в процедурном стиле

  Ответить  
 
 автор: Valick   (08.09.2014 в 20:00)   письмо автору
 
   для: psychomc   (08.09.2014 в 19:52)
 

Ну раз нет времени, то лучше наверно ничего и не писать.
Хотя много времени не надо, взять мой пример и исправить "по вашему" ошибки, кстати тема та для этого и создавалась, только что-то два года назад вас там не было видно.
И кстати если вы не пишите процедурным (но это не мешает вам критиковать процедурный код на право и на лево), то могу себе представить как вы говнокодите ООП.

  Ответить  
 
 автор: psychomc   (08.09.2014 в 20:53)   письмо автору
 
   для: Valick   (08.09.2014 в 20:00)
 

давайте, я буду сам решать что мне писать и где мне писать, ок? я не критикую процедурный код, я критикую ошибки в процедурном коде. а то, как я пишу используя ООП...представляйте, ради бога :)

  Ответить  
 
 автор: Valick   (08.09.2014 в 21:09)   письмо автору
 
   для: psychomc   (08.09.2014 в 20:53)
 

Вот у вас либо борзомертр зашкаливает, либо слабоумие прогрессирует, хотя скорее всего одно другому не мешает, а точнее первое следствие второго.
Давайте я сам буду решать писать мне код с ошибками или не писать совсем ничего, ок?

А то как вы пишите используя ООП можно и показать, а не с умным выражением лица сетовать на отсутствие времени, поверьте его много кому не хватает и вообще тема висит несколько дней, я же не говорю что "код в студию через 5 минут". Вы правда считаете, что я хожу на форум, только лишь для того чтобы уличить вас или кого-либо еще в каких-то ошибках? Поверьте это не так. Я тут спорю иногда с конфирмом, да и то не то что спорю, а дискутирую, потому что мне интересно с ним беседовать и он может действительно сказатьи что важнее показать что-то умное, хотя иногда и придирается к другим больше чем к себе. А вот вы увы покамест мне не интересны, мелковат, так сказать, уровень ;)

  Ответить  
 
 автор: psychomc   (08.09.2014 в 21:34)   письмо автору
 
   для: Valick   (08.09.2014 в 21:09)
 

в каком смысле показать? создавать самому темы на форуме и выкладывать здесь свой код, просто так от нечего делать, типа "посмотрите как я пишу на ООП"? это зачем? я же написал что нету времени и не пишу в процедурном стиле, т.е желания тоже нету писать. только ради вас я это делать не буду.
кстати, как это вы определили мой уровень? есть какая-то универсальная мерялка? :) хотя можем и померяться...вот один из моих проектов https://www.nhs.uk/parentingquiz/, разработан лично мною для британской корпорации здравоохранения (NHS). есть много вещей для не менее известных XFactor. готовы похвастаться подобным проектом или клиентом? заодно определим ваш уровень, мелковат он или нет :)

  Ответить  
 
 автор: Valick   (08.09.2014 в 21:43)   письмо автору
 
   для: psychomc   (08.09.2014 в 21:34)
 

mail.ru знаете? я лично писал от начала до конца (включая все игры) причём процедурным стилем ;)
достаточно или вам еще и про то кто гугл, со всеми его мапсами-шмапсами написал рассказать?
> кстати, как это вы определили мой уровень?
ну мы же с вами не первый день на форуме, я же вижу что и как вы отвечаете.
> заодно определим ваш уровень, мелковат он или нет :)
можно подумать я вам запрещаю читать форум и определять мой уровень :)

  Ответить  
 
 автор: psychomc   (08.09.2014 в 21:52)   письмо автору
 
   для: Valick   (08.09.2014 в 21:43)
 

о, хоспади. да, я пришёл на этот форум чтобы обманывать и понтоваться. теперь верите? https://www.nhs.uk/parentingquiz/hello.php
так будет какой-нибудь интересный проект/клиент от вас, или что-то значимое например? то, кто как пишет на форуме, это совсем не уровень. может быть я вообще сюда захожу оттого что мне скучно?

  Ответить  
 
 автор: Valick   (08.09.2014 в 21:59)   письмо автору
 
   для: psychomc   (08.09.2014 в 21:52)
 

это говорит только о том что у вас есть туда доступ, не более того ;)
доказательств того что вы сами одним умом делали эту игру, вы мне предоставить не сможете, да и меня это не интересует, есть этот конкретный форум, здесь и показывайте свой уровень знаний, ну или не показывайте, я лично ничего не требую. Кроме одного, предъявляя кому-то претензии, будьте любезны играть по тем же правилам.

  Ответить  
 
 автор: psychomc   (08.09.2014 в 22:03)   письмо автору
 
   для: Valick   (08.09.2014 в 21:59)
 

OMG. я не только не смогу, но и не буду. много чести. играю я по своим правилам или не играю вообще

  Ответить  
 
 автор: Valick   (08.09.2014 в 22:10)   письмо автору
 
   для: psychomc   (08.09.2014 в 22:03)
 

играйте вам никто не запрещает, только не надо навязывать свои правила другим

  Ответить  
 
 автор: Enter   (09.09.2014 в 10:21)   письмо автору
 
   для: psychomc   (08.09.2014 в 20:53)
 

Молодой человек, а разве ОО код не может содержать тех же самых ошибок? или вы под ОО кодом имеете в виду какой-то фреймворк типа битрикса?

  Ответить  
 
 автор: psychomc   (09.09.2014 в 11:13)   письмо автору
 
   для: Enter   (09.09.2014 в 10:21)
 

причем тут вообще то, что он может содержать или не содержать? речь не об этом была

  Ответить  
 
 автор: Enter   (09.09.2014 в 11:17)   письмо автору
 
   для: psychomc   (09.09.2014 в 11:13)
 

при том, что ОО код содержит то, что содержит и процедурный. или вы как-то иначе делаете объявление переменных внутри методов, проверяете их типы и т.д.

  Ответить  
 
 автор: psychomc   (09.09.2014 в 11:22)   письмо автору
 
   для: Enter   (09.09.2014 в 11:17)
 

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

  Ответить  
 
 автор: Enter   (09.09.2014 в 11:37)   письмо автору
 
   для: psychomc   (09.09.2014 в 11:22)
 

суть-то я как раз и понимаю. вы дали ссылку на error-reporting. Причем тут ОО код? Если речь идет о протоколировании ошибок, то хоть ОО код, хоть процедурный - сути не меняет. Причем тут парадигмы вообще, если это низкий уровень пхп?
Если у вас нет примера в рабочем виде, то это как минимум странно, не находите? Из выше сказанного вами, я мог понять, что у вас вообще нет рабочего кода.
Если ваш ОО код имеет столько зависимостей, то это не очень хороший код, согласитесь. Как вы его будете использовать в других проектах? Переносить все зависимости, которые не будут нужны? Учите паттерны, особенно DI.

  Ответить  
 
 автор: psychomc   (09.09.2014 в 12:03)   письмо автору
 
   для: Enter   (09.09.2014 в 11:37)
 

ахаха)) ну спасибо конечно, что направили на путь истинный) жду от вас проект на MVC вообще без зависимостей :D
p.s нет, вы вообще ничего не понимаете до сих пор о том, почему я дал ссылку на error_reporting и почему писал про ооп. да и не надо. вам пишешь про зелёное, вы отвечаете про кислое.

  Ответить  
 
 автор: lightning.say   (09.09.2014 в 12:30)   письмо автору
 
   для: psychomc   (09.09.2014 в 12:03)
 

>почему я дал ссылку на error_reporting
Я, как понял, вы хотели показать, что это ваш ресурс? Правильно?

  Ответить  
 
 автор: Enter   (09.09.2014 в 15:04)   письмо автору
 
   для: psychomc   (09.09.2014 в 12:03)
 

да, я не понимаю, причем тут та ссылка и ООП.

  Ответить  
 
 автор: Commander   (07.09.2014 в 08:18)   письмо автору
 
   для: Софья1   (06.09.2014 в 18:57)
 

Вообще-то, хранить учетные записи в двух разных таблицах не дело - как минимум потребуется больше обращений к БД. Проще сделать одну таблицу с дополнительным полем, в котором будет указываться, кем является пользователь, преподавателем или студентом.

Вот пример скрипта авторизации с учетом того, что пользователи находятся в двух таблицах:

<?php
    session_start
();
    
$username $_SESSION["username"];
    
$password $_SESSION["password"];
    
$user_status false;
    if (!empty(
$username) && !empty($password)){
        
$q "SELECT `id`, `imya`, `login`, `parol`, 'student` AS `status` FROM `students` WHERE `login` = '$username' AND `password` = MD5('$password')";
        
$q .= " UNION SELECT `id`, `imya`, `login`, `parol`, 'teacher' AS `status` FROM `teachers` WHERE `login` = '$username' AND `password` = MD5('$password')";
        
$r mysql_query($q);
        if (
$r){
            
$user mysql_fetch_assoc($r);
            
$user_status $user["status"];
        }
    }
    if (!
$user_status && isset($_POST["auth"])){
        
//Если пользователь не авторизован и отправлена форма авторизации
        //В форме авторизации кнопку прописываем так: <input type="submit" name="auth" value="Войти на сайт" />
        
$auth_errors = array();
        if (empty(
$_POST["username"])) $auth_errors[] = "Вы не ввели логин";
        if (empty(
$_POST["password"])) $auth_errors[] = "Нельзя войти на сайт без пароля";
        if (empty(
$auth_errors)){
            
//Если логин и пароль введены, проверяем, есть ли учетная запись, соответствующая им
            
$username mysql_real_escape_string($_POST["username"]);
            
$password mysql_real_escape_string($_POST["password"]);
            
$q "SELECT `id`, `imya`, `login`, `parol`, 'student` AS `status` FROM `students` WHERE `login` = '$username' AND `password` = MD5('$password')";
            
$q .= " UNION SELECT `id`, `imya`, `login`, `parol`, 'teacher' AS `status` FROM `teachers` WHERE `login` = '$username' AND `password` = MD5('$password')";
            
$r mysql_query($q);
            if (
$r){
                if (
mysql_num_rows($r) > 0){
                    
$_SESSION["username"] = $username;
                    
$_SESSION["password"] = $password;
                    
header("Location: ".$_SERVER["HTTP_REFERER"]);
                    exit();
                }
                else {
                    
$auth_errors[] = "Указанные учетные данные не зарегистрированы или неверны";
                }
            }
            else {
                
$auth_errors[] = "Произошла внутренняя ошибка. Попробуйте войти на сайт позднее.";
            }
        }
    }
?>


Для простоты я предположил, что пароль находится в базе в виде MD5-хэша.

  Ответить  
 
 автор: Софья1   (07.09.2014 в 19:30)   письмо автору
 
   для: Commander   (07.09.2014 в 08:18)
 

хорошо.я совместила все в одну таблицу и добавила столбик кто есть кто.
Просто у преподавателя и студента разные должны быть формы внутри.
Авторизация сама получилась.
Как теперь сделать запрос,чтобы для студентов была одна форма а у преподавателей другая?
Новый столбец получился "kto". у преподавателей-пр,у студентов-ст. Таблица называется-kyrsovay

  Ответить  
 
 автор: Commander   (07.09.2014 в 19:34)   письмо автору
 
   для: Софья1   (07.09.2014 в 19:30)
 

Не совсем понятно, что именно надо извлечь.

  Ответить  
 
 автор: Софья1   (07.09.2014 в 19:36)   письмо автору
 
   для: Commander   (07.09.2014 в 19:34)
 

извлекать ничего не надо,как сделать проверку по столбцу "kto"?

  Ответить  
 
 автор: Commander   (08.09.2014 в 04:21)   письмо автору
 
   для: Софья1   (07.09.2014 в 19:36)
 

Ловите:

<?php 
    session_start
(); 
    
$username $_SESSION["username"]; 
    
$password $_SESSION["password"]; 
    
$user_status false
    if (!empty(
$username) && !empty($password)){ 
        
$q "SELECT * FROM `kyrsovay` WHERE `login` = '$username' AND `password` = MD5('$password')"
        
$r mysql_query($q); 
        if (
$r){ 
            
$user mysql_fetch_assoc($r); 
            
$user_status $user["kto"];
        } 
    } 
    if (!
$user_status && isset($_POST["auth"])){ 
        
//Если пользователь не авторизован и отправлена форма авторизации 
        //В форме авторизации кнопку прописываем так: <input type="submit" name="auth" value="Войти на сайт" /> 
        
$auth_errors = array(); 
        if (empty(
$_POST["username"])) $auth_errors[] = "Вы не ввели логин"
        if (empty(
$_POST["password"])) $auth_errors[] = "Нельзя войти на сайт без пароля"
        if (empty(
$auth_errors)){ 
            
//Если логин и пароль введены, проверяем, есть ли учетная запись, соответствующая им 
            
$username mysql_real_escape_string($_POST["username"]); 
            
$password mysql_real_escape_string($_POST["password"]); 
            
$q "SELECT * FROM `kyrsovay` WHERE `login` = '$username' AND `password` = MD5('$password')"
            
$r mysql_query($q); 
            if (
$r){ 
                if (
mysql_num_rows($r) > 0){ 
                    
$_SESSION["username"] = $username
                    
$_SESSION["password"] = $password
                    
header("Location: ".$_SERVER["HTTP_REFERER"]); 
                    exit(); 
                } 
                else { 
                    
$auth_errors[] = "Указанные учетные данные не зарегистрированы или неверны"
                } 
            } 
            else { 
                
$auth_errors[] = "Произошла внутренняя ошибка. Попробуйте войти на сайт позднее."
            } 
        } 
    } 
?> 


Кем является пользователь, записано в $user_status. Если пользователь не авторизован, в этой переменной будет false.

  Ответить  
 
 автор: Enter   (08.09.2014 в 11:53)   письмо автору
 
   для: Commander   (08.09.2014 в 04:21)
 

Я бы так переписал Ваш скрипт:

<?php  
    session_start
();  
    
$username $_SESSION["username"];  
    
$password $_SESSION["password"];  
    
$user_status false;  
    if (!empty(
$username) && !empty($password)){  
        
$q "SELECT * FROM `kyrsovay` WHERE `login` = '$username' AND `password` = MD5('$password')";  
        
$r mysql_query($q);  
        if (
$r){  
            
$user mysql_fetch_assoc($r);  
            
$user_name $user['imya'];
            
$user_login $user['login'];
            
#делаем вторичную проверку на нахождение в БД логина и пароля. Вдруг, такого нет.
            
$qwerty "select id, kto from `kyrsovay` WHERE `login` = '$user_login' and `imya` = '$user_name'";
            
$r2 mysql_query($qwerty);  
            
$user2 mysql_fetch_assoc($r2);  
            
$user_status $user2["kto"]; 
        }  
    }  
    if (!
$user_status && isset($_POST["auth"])){  
        
//Если пользователь не авторизован и отправлена форма авторизации  
        //В форме авторизации кнопку прописываем так: <input type="submit" name="auth" value="Войти на сайт" />  
        
$auth_errors = array();  
        if (empty(
$_POST["username"])) $auth_errors[] = "Вы не ввели логин";  
        if (empty(
$_POST["password"])) $auth_errors[] = "Нельзя войти на сайт без пароля";  
        if (empty(
$auth_errors)){  
            
//Если логин и пароль введены, проверяем, есть ли учетная запись, соответствующая им  
            
$username mysql_real_escape_string($_POST["username"]);  
            
$password mysql_real_escape_string($_POST["password"]);  
            
$q "SELECT * FROM `kyrsovay` WHERE `login` = '$username' AND `password` = MD5('$password')";  
            
$r mysql_query($q);  
            if (
$r){  
                if (
mysql_num_rows($r) > 0){  
                    
#делаем вторичную проверку на нахождение в БД логина и пароля. Вдруг, такого нет.
                    
$qwerty "SELECT * FROM `kyrsovay` WHERE `login` = '$username' AND `password` = MD5('$password')";  
                    
$r2 mysql_query($qwerty);  
                    
$user mysql_fetch_assoc($r2);  
                    
$user_name $user['login'];
                    
$user_password $user['password'];
                    
$_SESSION["username"] = $user_name;  
                    
$_SESSION["password"] = $user_password;  
                    
header("Location: ".$_SERVER["HTTP_REFERER"]);  
                    exit();  
                }  
                else {  
                    
$auth_errors[] = "Указанные учетные данные не зарегистрированы или неверны";  
                }  
            }  
            else {  
                
$auth_errors[] = "Произошла внутренняя ошибка. Попробуйте войти на сайт позднее.";  
            }  
        }  
    }  

но у меня возник вопрос, а почему Вы делаете на сессиях, а не на куках? Еще же можно писать данные в файл, например, $user_login.doc. Есть же много кода для чтения MS Word, или Excel. хотя можно свой формат придумать. Например, основанный на сериализованном json. то есть сначала создаем json, потом его сериализуем, оборачиваем какой-нить md5 и пишем в файл. Потом, естественно, дешифруем и извлекаем из json нужную информацию. Так же проще будет, согласитесь, чем писать логин и пароль в сессию.

и ни в коем случае, ни при каких обстоятельствах, нельзя передавать в сессию значение поля kto. это очень серьезная брешь в системе бИзАпаснАсти будет. так как злоумышленник сможет украсть значение этого поля и узнать, студент это или профессор. Этого ни в коем случае нельзя допустить. поэтому надо все переписать на файлах с особым форматом данных.

  Ответить  
 
 автор: KPETuH   (08.09.2014 в 12:03)   письмо автору
 
   для: Enter   (08.09.2014 в 11:53)
 

Зачем файлы когда есть база данных? А вот про пароль в сессии вы совершенно правы, вообще никакого смысла внесения пароля в сессии нет. Вред есть. Кстати как-то у вас защита от SQL-инъекция кривовато реализована в одном месте есть в другом нет.

  Ответить  
 
 автор: Enter   (08.09.2014 в 12:09)   письмо автору
 
   для: KPETuH   (08.09.2014 в 12:03)
 

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

  Ответить  
 
 автор: KPETuH   (08.09.2014 в 13:20)   письмо автору
 
   для: Enter   (08.09.2014 в 12:09)
 

Так как сами БД не обходятся без файлов, не думаю что файлы обижены.

  Ответить  
 
 автор: Enter   (08.09.2014 в 13:30)   письмо автору
 
   для: KPETuH   (08.09.2014 в 13:20)
 

тогда это совершенно меняет дело! естественно, что тогда надо делать на БД!!!

  Ответить  
 
 автор: KPETuH   (08.09.2014 в 13:38)   письмо автору
 
   для: Enter   (08.09.2014 в 13:30)
 

Хорошо что мы с вами сошлись во мнении, а то мне как-то без вашего одобрения было неуютно. теперь я снова в форме, спасибо.

  Ответить  
 
 автор: Enter   (08.09.2014 в 13:39)   письмо автору
 
   для: KPETuH   (08.09.2014 в 13:38)
 

да всегда пожалуйста. я обожаю помогать людям.

  Ответить  
 
 автор: Enter   (08.09.2014 в 12:11)   письмо автору
 
   для: KPETuH   (08.09.2014 в 12:03)
 

>Кстати как-то у вас защита от SQL-инъекция кривовато реализована в одном месте есть в другом нет.
естественно. как и сам скрипт :)

  Ответить  
 
 автор: Grays   (10.09.2014 в 10:57)   письмо автору
 
   для: Enter   (08.09.2014 в 12:11)
 

А будет ли работать авторизация в таком варианте при отключённых в браузере cookies?

  Ответить  
 
 автор: Valick   (10.09.2014 в 11:01)   письмо автору
 
   для: Grays   (10.09.2014 в 10:57)
 

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

  Ответить  
 
 автор: Grays   (10.09.2014 в 21:04)   письмо автору
 
   для: Valick   (10.09.2014 в 11:01)
 

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

"в случае с сессиями, при отключенных куках сид можно транслировать в адресную строку..."

и тогда авторизация возможна в любом случае, как это реализовано, к примеру, на phpBB, но, видимо, дополнительно придётся усилить защиту и контроль.- однако выход, получается, есть.

И пару слов о psychomc, я не первый год посещаю этот форум и благодарен ему за высококвалифицированные комментарии по различным темам, впрочем, как и другим программистам за бескорыстную помочь новичкам.

  Ответить  
 
 автор: Enter   (10.09.2014 в 12:47)   письмо автору
 
   для: Grays   (10.09.2014 в 10:57)
 

показал табличку "сарказм".

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

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