Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Логинка. php. (https://forum.antichat.xyz/showthread.php?t=90062)

Ru}{eeZ 01.11.2008 21:44

Логинка. php.
 
Пишу логинку:
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:
Код:

user:coolpass
luzer:badpass


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

mr.The 01.11.2008 22:02

$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;
  }


хотя это тоже не самый оптимальный вариант.

eLWAux 01.11.2008 22:03

делай:
Код:

user:coolpass:
luzer:badpass:

и все будет окей)

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

d_x 01.11.2008 22:16

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;
?>


mr.The 01.11.2008 22:26

Цитата:

mr.The, при первом же неправильном логине и пассе твой скрипт выйдет просто из выполнения, не проверив все.
ээ... фак. как-то я этот момент пропустил. там можно флаг устанавливать при логине. и потом, после цикла проверять..

[Raz0r] 01.11.2008 22:31

тот же код =)
PHP код:

<?php
$f 
array_map('trim',file("base.php"));
if(
in_array($f,"{$login}:{$password}")) die("Вошли");
else die(
'Неправильный логин или пароль.');
?>


DDoSька 01.11.2008 22:35

Цитата:

Сообщение от [Raz0r]
тот же код =)
PHP код:

<?php
$f 
array_map('trim',file("base.php"));
if(
in_array($f,"{$login}:{$password}")) die("Вошли");
else die(
'Неправильный логин или пароль.');
?>


Ты прав, но если обрезать 80 процентов от скрипта(не считать IF и форму)

eLWAux 02.11.2008 02:28

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:
Код:

:test:pass:
:admin:adminpass:
:xaxa:xaxaxaax:
:eLWAux:admin:

пробуй..

Ru}{eeZ 02.11.2008 12:28

Ну вот я сделал такую байду:

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 ), без завршения как-нибудь можно обойтись?

Spyder 02.11.2008 13:15

вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо
Делай тогда с .htaccess'ом, а то бред)

Ru}{eeZ 02.11.2008 13:24

Цитата:

Сообщение от Spyder
вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо
Делай тогда с .htaccess'ом, а то бред)

Это будет позже продумано =))

Ru}{eeZ 02.11.2008 13:34

Я вот вроде добился своего, код немного смешной, но рабочий :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;

}

?>


Ru}{eeZ 02.11.2008 14:15

а это регистрация, если кому понадобится...

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;

}

?>


Gifts 02.11.2008 14:53

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> 
<?
}
?>


Ru}{eeZ 02.11.2008 15:32

Да ладно, я всё это мутил ради самообразования( :confused: ), cms я пока писать не собираюсь) Но всеравно спасибо)

eLWAux 04.11.2008 00:40

base.php:

PHP код:

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


SleepShadowWeb 04.11.2008 01:46

советую в цикл foreach добавить break;
Код:

if($login == $user && $password == $pass) {
print "Вошли";
$good = 1;
break;
}

и ещё:
переменные $good и $bad лучше объявить:
Код:

$f = file("base.php");
$good = 0;
$bad = 0;

и ещё, вот этот код:
Код:

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

в случае, если логин и пароль совпадут с первой строкой в файле и записей в нём будет одна, тогда условие не выполнится! (хотя данные корректны)
В любом случае, наличие переменной $bad в коде не оправдано! Лучше убери.
И следует контролировать длину проверяемых данных (функция substr)

Код:

$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, а просто обратиться к массиву по индексу.


Время: 07:58