PDA

Просмотр полной версии : Логинка. php.


Ru}{eeZ
01.11.2008, 21:44
Пишу логинку:

<?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(). нужно сделать примерно так:
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
$login=isset($_POST['login']) && !is_array($_POST['login']) ? $_POST['login'] : '';
$pass=isset($_POST['pass']) && !is_array($_POST['pass']) ? $_POST['pass'] : '';
if(strlen($login)>0 && 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
$f = array_map('trim',file("base.php"));
if(in_array($f,"{$login}:{$password}")) die("Вошли");
else die('Неправильный логин или пароль.');
?>

DDoSька
01.11.2008, 22:35
']тот же код =)
<?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
<? $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

$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
вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо
Делай тогда с .htaccess'ом, а то бред)

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

Ru}{eeZ
02.11.2008, 13:34
Я вот вроде добился своего, код немного смешной, но рабочий :D


<?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 == 1 && $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

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к строк, если к нему будут обращаться каждую секунду.

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

<?

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:

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