Просмотр полной версии : Логинка. 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
Почему логинится только по последней строчке?
п.с. спс))
$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;
}
}
хотя это тоже не самый оптимальный вариант.
делай:
user:coolpass:
luzer:badpass:
и все будет окей)
у меня такая же проблемма била)
просто ти не учитаваеш символа переноса..
user:coolpass<перенос>
и тебе дает пароль:
coolpass<перенос>
вот и несходитса)
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, при первом же неправильном логине и пассе твой скрипт выйдет просто из выполнения, не проверив все.
ээ... фак. как-то я этот момент пропустил. там можно флаг устанавливать при логине. и потом, после цикла проверять..
тот же код =)
<?php
$f = array_map('trim',file("base.php"));
if(in_array($f,"{$login}:{$password}")) die("Вошли");
else die('Неправильный логин или пароль.');
?>
']тот же код =)
<?php
$f = array_map('trim',file("base.php"));
if(in_array($f,"{$login}:{$password}")) die("Вошли");
else die('Неправильный логин или пароль.');
?>
Ты прав, но если обрезать 80 процентов от скрипта(не считать IF и форму)
<? $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:
пробуй..
Ну вот я сделал такую байду:
<?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 ), без завршения как-нибудь можно обойтись?
вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо
Делай тогда с .htaccess'ом, а то бред)
вот кто нить напрямую обратиться к base.php и вся ваша хэк логинка летит мимо
Делай тогда с .htaccess'ом, а то бред)
Это будет позже продумано =))
Я вот вроде добился своего, код немного смешной, но рабочий :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;
}
?>
а это регистрация, если кому понадобится...
<?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;
}
?>
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>
<?
}
?>
Да ладно, я всё это мутил ради самообразования( :confused: ), cms я пока писать не собираюсь) Но всеравно спасибо)
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, а просто обратиться к массиву по индексу.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot