Логинка. php.

Discussion in 'PHP' started by Ru}{eeZ, 1 Nov 2008.

  1. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Пишу логинку:
    PHP:
    <?php

    $f 
    file("base.php");
    print 
    $f[0] . "and " $f[1];
    foreach(
    $f as $d) {
      
    $d trim($d);
      list(
    $user$pass) = split(":"$d);
    }

    if(isset(
    $login) && isset($password)) {
      if(
    $login == $user && $password == $pass) {
        print 
    "Вошли";
      } else {
        print 
    "Неправильный логин или пароль";
      }
    } else {
    print <<<HERE
    <form method = "post">
    Логин: <input type = "text" name = "login"><br />
    Пароль: <input type = "text" name = "password"><br />
    <input type = "submit" value = "Вход">
    </form>

    HERE;

    }

    ?>
    base.php:
    Code:
    user:coolpass
    luzer:badpass

    Почему логинится только по последней строчке?
    п.с. спс))
     
  2. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    $user, $pass
    перезаписываються при каждом split(). нужно сделать примерно так:
    PHP:
    foreach($f as $d) { 
      
    $d trim($d); 
      list(
    $user$pass) = split(":"$d); 

     if(
    $login == $user && $password == $pass) { 
        print 
    "Вошли"
        exit;
      } else { 
        print 
    "Неправильный логин или пароль"
        exit;
      }

    хотя это тоже не самый оптимальный вариант.
     
    #2 mr.The, 1 Nov 2008
    Last edited: 1 Nov 2008
  3. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    делай:
    Code:
    user:coolpass:
    luzer:badpass:
    и все будет окей)

    у меня такая же проблемма била)
    просто ти не учитаваеш символа переноса..
    user:coolpass<перенос>
    и тебе дает пароль:
    coolpass<перенос>
    вот и несходитса)
     
    1 person likes this.
  4. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    mr.The, при первом же неправильном логине и пассе твой скрипт выйдет просто из выполнения, не проверив все.

    eLWAux, ты сам пробовал так?) В исходном коде вообще-то trim используется, чтобы переносы убрать, и проблема не в этом.

    PHP:
    <?php
    $login
    =isset($_POST['login']) && !is_array($_POST['login']) ? $_POST['login'] : '';
    $pass=isset($_POST['pass']) && !is_array($_POST['pass']) ? $_POST['pass'] : '';
    if(
    strlen($login)>&& strlen($password)>0

      
    $f array_map('rtrim',file("base.php")); 

      foreach(
    $f as $d
      { 
        
    $tmp=explode(':'$d); 

        if(
    $login === $tmp[0] && $password === $tmp[1]) 
          die(
    "Вошли"); 
      } 

      die(
    'Неправильный логин или пароль.'); 



    print <<<HERE
    <form method = "post"> 
    Логин: <input type = "text" name = "login"><br /> 
    Пароль: <input type = "text" name = "password"><br /> 
    <input type = "submit" value = "Вход"> 
    </form> 
    HERE;
    ?>
     
    #4 d_x, 1 Nov 2008
    Last edited: 1 Nov 2008
    1 person likes this.
  5. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    ээ... фак. как-то я этот момент пропустил. там можно флаг устанавливать при логине. и потом, после цикла проверять..
     
  6. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    тот же код =)
    PHP:
    <?php
    $f 
    array_map('trim',file("base.php"));
    if(
    in_array($f,"{$login}:{$password}")) die("Вошли");
    else die(
    'Неправильный логин или пароль.');
    ?>
     
    #6 [Raz0r], 1 Nov 2008
    Last edited: 1 Nov 2008
    2 people like this.
  7. DDoSька

    DDoSька Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    317
    Likes Received:
    352
    Reputations:
    18
    Ты прав, но если обрезать 80 процентов от скрипта(не считать IF и форму)
     
  8. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    PHP:
    <? $login='admin';
    $pass='adminpass';
    $f=file('base.php');
    for (
    $i=0$i<count($f); $i++)
    $a=explode(':',$f[$i]);
     if (
    $a[1]==$login && $a[2]==$pass)
     { die(
    'yeee'); }
     else
     { die(
    'fak('); }
    base.php:
    Code:
    :test:pass:
    :admin:adminpass:
    :xaxa:xaxaxaax:
    :eLWAux:admin:
    пробуй..
     
  9. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Ну вот я сделал такую байду:

    PHP:
    <?php

    $f 
    file('base.php');

    if(isset(
    $login) && isset($password)) {
      foreach(
    $f as $d) {
        
    $d trim($d);
        list(
    $user$pass) = split(":"$d);
        if(
    $login == $user && $password == $pass) {
          die(
    'Вошли');
        }
      }
        print 
    "Неправильный логин или пароль";



    } else {
    print <<<HERE
    <form method = "post">
    Логин: <input type = "text" name = "login"><br />
    Пароль: <input type = "text" name = "password"><br />
    <input type = "submit" value = "Вход">
    </form>

    HERE;

    }
    print 
    "ы";

    ?>
    Но блин, если использовать die(), то мы завершаем скрипт и остальная часть страницы не выполняется (сдесь это "ы" :D ), без завршения как-нибудь можно обойтись?
     
  10. Spyder

    Spyder Elder - Старейшина

    Joined:
    9 Oct 2006
    Messages:
    1,388
    Likes Received:
    1,209
    Reputations:
    475
    вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо
    Делай тогда с .htaccess'ом, а то бред)
     
  11. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Это будет позже продумано =))
     
  12. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Я вот вроде добился своего, код немного смешной, но рабочий :D

    PHP:
    <?php

    $f 
    file("base.php");

    if(isset(
    $login) && isset($password)) {
      foreach(
    $f as $d) {
        
    $d trim($d);
        list(
    $user$pass) = split(":"$d);
        if(
    $login == $user && $password == $pass) {
          print 
    "Вошли";
          
    $good 1;
        } else {
          
    $bad 1;
        }
      }

      if (
    $good == && $bad == 1) {
      } else {
        print 
    "Облом";
      }

    } else {
    print <<<HERE
    <form method = "post">
    Логин: <input type = "text" name = "login"><br />
    Пароль: <input type = "text" name = "password"><br />
    <input type = "submit" value = "Вход">
    </form>

    HERE;

    }

    ?>
     
  13. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    а это регистрация, если кому понадобится...

    PHP:
    <?php

    if (isset($login) && isset($password)) {
        
    $fp fopen('base.php''a');
        
    fputs($fp"\r\n" $login ':' $password);
        
    fclose($fp);
        print 
    $login ", спасибо за регистрацию";
    } else {
        print <<<HERE
    <form method = "post">
    Логин: <input type = "text" name = "login"><br />
    Пароль: <input type = "text" name = "password"><br />
    <input type = "submit" value = "Регистрация">
    </form>

    HERE;

    }

    ?>
     
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Ru}{eeZ меня видимо одного смущает, что с такой регой и страницей логина может быть неограниченное количество строк, с одинаковым логином, но разными паролями, а значит никто из таких пользователей залогиниться не сможет. Включенный Register_globals - зло. Твой скрипт будет рад обрабатывать 10к строк, если к нему будут обращаться каждую секунду.

    Если же хочется мучаться с файлами, то:
    PHP:
    <?

    if (isset(
    $_POST['login']) && isset($_POST['password']))
    {
        
    $f=file('base.php');
        if (
    in_array($_POST['login'].':'.$_POST['password']."\r\n",$f)) {print "Вошли";}
        else {print 
    "Облом";}
    } else {
    ?>
    <form method = "post">
    Логин: <input type = "text" name = "login"><br />
    Пароль: <input type = "text" name = "password"><br />
    <input type = "submit" value = "Вход">
    </form> 
    <?
    }
    ?>
     
    _________________________
  15. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Да ладно, я всё это мутил ради самообразования( :confused: ), cms я пока писать не собираюсь) Но всеравно спасибо)
     
  16. eLWAux

    eLWAux Elder - Старейшина

    Joined:
    15 Jun 2008
    Messages:
    860
    Likes Received:
    616
    Reputations:
    211
    base.php:

    PHP:
    <? header("Location: index.php"); die('хм..');
    admin:test
    ?>
     
  17. SleepShadowWeb

    Joined:
    2 Feb 2006
    Messages:
    26
    Likes Received:
    15
    Reputations:
    0
    советую в цикл foreach добавить break;
    Code:
    if($login == $user && $password == $pass) { 
    print "Вошли"; 
    $good = 1;
    break;
    }
    
    и ещё:
    переменные $good и $bad лучше объявить:
    Code:
    $f = file("base.php");
    $good = 0;
    $bad = 0;
    
    и ещё, вот этот код:
    Code:
    if ($good == 1 && $bad == 1) { 
      } else { 
        print "Облом"; 
      }
    
    в случае, если логин и пароль совпадут с первой строкой в файле и записей в нём будет одна, тогда условие не выполнится! (хотя данные корректны)
    В любом случае, наличие переменной $bad в коде не оправдано! Лучше убери.
    И следует контролировать длину проверяемых данных (функция substr)

    Code:
    $f = file("base.php"); 
    $good = 0;
    
    if(isset($_POST['login']) && isset($_POST['password'])) 
    { 
      $p_pass = substr($_POST['password'], 0, 10);
      $p_login = substr($_POST['login'], 0, 10);
      foreach($f as $d) { 
        $d = trim($d); 
        list($user, $pass) = split(":", $d); 
        if($p_login == $user && $p_pass == $pass)  {
          $good = 1; 
          break;
     }
    }
    
      if ($good == 1) { 
          print "Вошли"; 
      } else { 
        print "Облом"; 
      }
    
    } else { 
    print <<<HERE
    ......
    
    и ещё в файле base.php аккаунты лучше хранить массивом, а не в текстовом виде, тогда автоматом увеличивается скорость работы скрипта и пропадает угроза безопасеости.
    при поиске не нужно будет перебирать все элементы и использовать функцию in_array, а просто обратиться к массиву по индексу.
     
    2 people like this.