Array ( [0] => Array ( [0] => Коля [1] => 123 )
[1] => Array ( [0] => Вася [1] => 456 )
[2] => Array ( [0] => Петя [1] => 789 )
[3] => Array ( [0] => Олег [1] => 000 ) )
Соответственно пользователь вводит свои данные, которые нужно сравнить с каждой из пар, и при совпадении логина и пароля дать добро, в противном случае отказать в авторизации. Как это сделать?
Спустя 45 минут, 51 секунда (26.01.2011 - 04:24) kirik написал(а):
Bandicoot
Используйте ассоциативный массив: логин как ключ а пароль как значение. Только пароль нужно хранить в захэшированном виде.
<<< это просто набросок (ака пример) к нему нужно прикрутить хэширование пароля с солью и приводить значения логинов к одному регистру.
Используйте ассоциативный массив: логин как ключ а пароль как значение. Только пароль нужно хранить в захэшированном виде.
$users = array(
'коля' => 'пароль',
'вася' => 'пароль',
...
);
if(isset($users[$_POST['login']]) && $users[$_POST['login']] == $_POST['password']) {
echo 'OK';
} else {
echo 'FAIL';
}
<<< это просто набросок (ака пример) к нему нужно прикрутить хэширование пароля с солью и приводить значения логинов к одному регистру.
Спустя 9 часов, 9 минут, 50 секунд (26.01.2011 - 13:34) dima4321 написал(а):
Присоединяюсь к предыдущему оратору код должен быть таким:
все отсальное возможно..но надо много оперировать с массивами плюс городить дополнительные циклы
вот посмотри может найдешь что
http://php.su/functions/?cat=array
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
$n=array('0'=>array('dima'=>'abcd','petya'=>'ddd'));
$a='dima';
$p='abcd';
foreach($n as $value)
{
foreach($value as $key=>$new)
{
if($key==$a and $new==$p)
{
echo "ура пароль и логин верны";
}
}
}
?>
все отсальное возможно..но надо много оперировать с массивами плюс городить дополнительные циклы
вот посмотри может найдешь что
http://php.su/functions/?cat=array
Спустя 3 минуты, 40 секунд (26.01.2011 - 13:37) Snus написал(а):
Bandicoot
Уже обсуждалось в этой теме
Уже обсуждалось в этой теме
Спустя 27 минут, 31 секунда (26.01.2011 - 14:05) dima4321 написал(а):
Жду большой большой и толсый плюсик
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
$a='misha';
$p='aaa';
$n=array('0'=>array('1'=>'dima','2'=>'ddd'),'1'=>array('1'=>'misha','2'=>'aaa'));
$i=0;
$kol=count($n);
while($i<$kol)
{
$y= array_search($a, $n[$i]);
if($y=='1' and $n[$i][2]=$p)
{
echo "ура пароль и логин верны";
}
$i++;
}
?>
Спустя 11 минут, 1 секунда (26.01.2011 - 14:16) dima4321 написал(а):
хотя нет..кривовато...но может кто и доведет до ума.
Спустя 8 минут, 21 секунда (26.01.2011 - 14:24) Snus написал(а):
dima4321
А зачем доводить? Я рабочий вариант выложил в другом посте. Ссылку кинул в этой теме.
А зачем доводить? Я рабочий вариант выложил в другом посте. Ссылку кинул в этой теме.
Спустя 48 минут, 15 секунд (26.01.2011 - 15:12) Bandicoot написал(а):
Спасибо ребят, буду разбираться!
Спустя 13 часов, 28 минут, 7 секунд (27.01.2011 - 04:41) Bandicoot написал(а):
Цитата (dima4321 @ 26.01.2011 - 10:34) |
Присоединяюсь к предыдущему оратору код должен быть таким:<?php |
Ребят, я все же не до конца разобрался, поэтому приведу свои исходиники полностью:
Это скрипт-обработчик, сделал, примерно так, как вы и советовали:
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
$username = $_POST['username'];
$password = $_POST['password'];
if (empty($username) || empty($password))
{
echo "Введите логин и пароль";
exit;
}
if (isset($username) || isset($password))
{
$username = trim($username);
$password = trim($password);
$fu = fopen('users.inc', 'r') or die("Ошибка! Не удалось открыть файл");
while(! feof($fu))
{
$user_info = fgetcsv($fu, 100, "|");
$logins[] = $user_info;
}
fclose($fu);
foreach ($logins as $value)
{
foreach ($value as $login => $pass)
{
if ($login == $username and $pass == $password)
{
echo "Добро пожаловать";
} else {
echo "Пошел вон, придурок!";
}
}
}
}
?>
А это файл с данными пользователей:
Коля|123
Вася|456
Петя|789
Олег|000
Итак, при выполнении и вводе правильных данных выводится сообщение об отказе в авторизации 8 раз! В чем моя ошибка?
Спустя 7 минут, 36 секунд (27.01.2011 - 04:48) Bandicoot написал(а):
Цитата (kirik @ 26.01.2011 - 01:24) |
Bandicoot Используйте ассоциативный массив: логин как ключ а пароль как значение. Только пароль нужно хранить в захэшированном виде. $users = array( <<< это просто набросок (ака пример) к нему нужно прикрутить хэширование пароля с солью и приводить значения логинов к одному регистру. |
Идея хорошая, но как привести мне свой двумерный массив, в такой ассоциативный? Мои исходники смотрите выше. Если честно я уже прочитал главу про массивы в книге по PHP раза 3, но так и не смог решить поставленную задачу. Вы конечно можете послать меня опять читать FAQ, но раз я открыл тему, значит для меня не все так просто...
Спустя 15 минут, 14 секунд (27.01.2011 - 05:03) Bandicoot написал(а):
Цитата (dima4321 @ 26.01.2011 - 11:05) |
Жду большой большой и толсый плюсик<?php |
Ваш метод тоже испробовал, не работает. Может я данные из файла неправильно загружаю?
Спустя 5 часов, 28 минут, 57 секунд (27.01.2011 - 10:32) Snus написал(а):
Bandicoot
Ты своим массивом с пользователями не исключаешь возможности дубликата логина! А это отнюдь не хорошо! Делай, как тебе посоветовали!
И зачем тебе создавать многомерный массив?! Тратишь драгоценную память :)
Ты своим массивом с пользователями не исключаешь возможности дубликата логина! А это отнюдь не хорошо! Делай, как тебе посоветовали!
$n = array( 'dima' => 'ddd', 'misha' => 'aaa');
И зачем тебе создавать многомерный массив?! Тратишь драгоценную память :)
Спустя 35 минут, 36 секунд (27.01.2011 - 11:08) kirik написал(а):
Цитата (Bandicoot @ 26.01.2011 - 20:48) |
Идея хорошая, но как привести мне свой двумерный массив, в такой ассоциативный? |
Чет не понял, откуда там двумерный массив, ну да ладно.. Вот попроще вариант немного:
$data = file('users.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$users = array();
foreach($data as $line) {
list($u, $p) = explode('|', $line);
$users[$u] = $p;
}
unset($data); // убиваем, чтобы память не занимать..
print_r($users); // viola!
но все же советую использовать для таких целей БД..
Спустя 12 минут, 52 секунды (27.01.2011 - 11:21) Snus написал(а):
kirik
txt файл вообще никак не защищен. А если его поисковые роботы спалят? - вуаля
смотрите пароли
txt файл вообще никак не защищен. А если его поисковые роботы спалят? - вуаля
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 48 минут, 41 секунда (27.01.2011 - 12:09) Snus написал(а):
Для новичков написал простенький код авторизации
Файл index.php
Файл users.php
Файл index.php
<?php
session_start();
require_once 'users.php';
// Дабы в нескольких частях кода не писать одно и то же
// Выносим простенький код в функцию
function killSess(){
// Обнуляем сессию
$_SESSION['login'] = NULL;
// Рефрешемся
header('Location: '.$_SERVER['PHP_SELF']);
exit;
};
// Если юзверь нажал на EXIT выполняем функцию (та, что выше)
if($_GET['act'] == 'exit') killSess();
// Если сессия зарегистрированна, то объявляем ее в переменную
$sLogin = isset($_SESSION['login']) ? $_SESSION['login'] : NULL;
// Если поля логин и пароль заполнены и нажата кнопка log in
if(!empty($_POST['login']) && !empty($_POST['pass'])){
// Объявляем переменные
$login = $_POST['login']; // логин
$pass = $_POST['pass']; // пароль
// Проверяем есть ли в массиве юзверь с ключом login и сравниваем пароли
if(isset($arrUsers[$login]) && $arrUsers[$login] == $pass){
// Если условия выполнены, регистрируем сессию со значением логина
$_SESSION['login'] = $login;
// Рефрешемся
header('Location: '.$_SERVER['PHP_SELF']);
exit;
} else {
// Если юзверь в массиве отсутствует или пароли не совпадают, кричим об этом.
echo 'Incorrect Password!';
}
}
// Если все-таки сессия зарегистрированна и переменная благополучно объявлена
if(isset($sLogin)){
// На всякий случай сверяемся с текущими показателями массива.
// На случай если юзверя удалили, а сессия у него все еще висит.
if(!isset($arrUsers[$sLogin]) || empty($arrUsers[$sLogin])) killSess();
// Если все бодрячном - выдаем пару несвязанных слов
echo 'Hello, <b>'.$sLogin.'</b>! Your pass is <b>'.$arrUsers[$sLogin].'</b> <a href="?act=exit">EXIT</a>';
// ############## здесь можно инклудить свои странички или писать быдло-код :)
} else {
// А вот в случае, если сессия не зарегистрированна и переменная не объявлена,
// Выдаем форму ввода логина - пароля
// PS: вообще тут можно прописать require 'form.htm';
// А в form.htm закинуть свою форму ввода логина - пароля
echo '<form action="" method="post">';
echo '<table border="1">';
echo '<tr>';
echo '<td><input type="text" name="login"></td>';
echo '</tr>';
echo '<tr>';
echo '<td><input type="password" name="pass"></td>';
echo '</tr>';
echo '<tr>';
echo '<td><input type="submit" value="log in"></td>';
echo '</tr>';
echo '</table>';
echo '</form>';
}
?>
Файл users.php
<?php
// Загоняем юзверей в ассоциативный массив,
// Где Ключ - логин, значение - пароль.
$arrUsers = array(
'user1' => 'pass1',
'user2' => 'pass2'
);
?>
Спустя 2 часа, 51 минута, 30 секунд (27.01.2011 - 15:01) Georg-71 написал(а):
Спасибо огромное ша буду пробовать.
![huh.gif](http://phpforum.ru/html/emoticons/huh.gif)
Спустя 8 часов, 23 минуты, 36 секунд (27.01.2011 - 23:25) kirik написал(а):
Цитата (Snus @ 27.01.2011 - 03:21) |
txt файл вообще никак не защищен |
Да ну?
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Идея изначально провальная. Начиная от хранения пар логин/пароль в открытом виде в файле (не важно в каком), заканчивая потребляемой памятью при большом количестве записей.
Спустя 11 часов, 8 минут, 48 секунд (28.01.2011 - 10:33) Bandicoot написал(а):
Цитата (kirik @ 27.01.2011 - 20:25) | ||
Да ну? ![]() Идея изначально провальная. Начиная от хранения пар логин/пароль в открытом виде в файле (не важно в каком), заканчивая потребляемой памятью при большом количестве записей. |
Я бы конечно использовал MySQL, но не для себя делаю - желание клиента.
Спустя 5 минут, 45 секунд (28.01.2011 - 10:39) Snus написал(а):
kirik
Если пользлвателей менее 1000, то много памяти не займет. А php файл все-таки понадежнее, чем txt. К тому же перед
И в самом users.php в начальной строке прописать
Если пользлвателей менее 1000, то много памяти не займет. А php файл все-таки понадежнее, чем txt. К тому же перед
require_once 'users.php';можно поставить $antihack = 1;
И в самом users.php в начальной строке прописать
if(!$antihack) die('WTF?!');Какая-никакая , но защита... :)
Спустя 3 минуты, 43 секунды (28.01.2011 - 10:43) kirik написал(а):
Цитата (Snus @ 28.01.2011 - 02:39) |
можно поставить $antihack = 1; |
Это явно лишнее.
Цитата (Snus @ 28.01.2011 - 02:39) |
А php файл все-таки понадежнее, чем txt. |
Не спорю, только серьёзная дырка в безопасности, а так конечно понадежнее
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 2 минуты, 46 секунд (28.01.2011 - 10:46) inpost написал(а):
kirik
Чем же опасно хранить пароль в PHP файле?
Чем же опасно хранить пароль в PHP файле?
Спустя 2 минуты, 4 секунды (28.01.2011 - 10:48) Snus написал(а):
kirik
Почему лишнее? Это исключит запуск users.php независимо от основного скрипта (откуда инклудится usres.php).
Почему лишнее? Это исключит запуск users.php независимо от основного скрипта (откуда инклудится usres.php).
Спустя 3 минуты, 13 секунд (28.01.2011 - 10:51) kirik написал(а):
Цитата (inpost @ 28.01.2011 - 02:46) |
Чем же опасно хранить пароль в PHP файле? |
Я не говорил что хранить опасно
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Файл служит БД пользователей. Пользователи регистрируются => файл изменяется автоматически самим php скриптом => этот файл могут изменить другие скрипты ... итп. Если хостинг кривой, то ввобще залететь можно
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Цитата (Snus @ 28.01.2011 - 02:48) |
Почему лишнее? Это исключит запуск users.php независимо от основного скрипта (откуда инклудится usres.php). |
А что будет при его запуске? Вывестись ничего не выведется.. Поэтому строчка лишняя
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
Спустя 4 часа, 31 минута, 38 секунд (28.01.2011 - 15:23) Bandicoot написал(а):
Цитата (kirik @ 27.01.2011 - 08:08) | ||
Чет не понял, откуда там двумерный массив, ну да ладно.. Вот попроще вариант немного: $data = file('users.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); но все же советую использовать для таких целей БД.. |
Спасибо, так действительно проще!
Спустя 1 день, 14 минут, 37 секунд (29.01.2011 - 15:37) Bandicoot написал(а):
Да что за фигня! Вот код скрипта - обработчика:
А это файл с данными:
Для всех пользователей, кроме последнего в списке, скрипт выдает отказ в авторизации. Но последняя строка ничем не отличается принципиально! В чем косяк? Совсем не пойму!
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
$username = $_POST['username'];
$password = $_POST['password'];
// $tarif = $_POST['tarif'];
if (empty($username) || empty($password))
{
echo "Введите логин и пароль";
exit;
} else {
$data = file('users.inc', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$users = array();
foreach($data as $line)
{
list($u, $p) = explode ('|', $line);
$users[$u] = $p;
}
unset($data);
if ($u == $username and $p == $password)
{
echo "Good";
} else {
echo "Fuck";
}
}
?>
А это файл с данными:
Коля|123
Вася|456
Петя|789
Олег|000
Для всех пользователей, кроме последнего в списке, скрипт выдает отказ в авторизации. Но последняя строка ничем не отличается принципиально! В чем косяк? Совсем не пойму!
Спустя 2 минуты, 15 секунд (29.01.2011 - 15:39) Snus написал(а):
Bandicoot
Может косяк в русскоязычных индексах?
Может косяк в русскоязычных индексах?
Спустя 1 минута, 11 секунд (29.01.2011 - 15:41) Bandicoot написал(а):
Цитата (Snus @ 29.01.2011 - 12:39) |
Bandicoot Может косяк в русскоязычных индексах? |
Все логины набраны на кириллице, включая последний, для которого все ОК
Спустя 55 секунд (29.01.2011 - 15:41) Snus написал(а):
Bandicoot
напиши в своем скрипте после цикла
И покажи, что вывело
напиши в своем скрипте после цикла
echo '<pre>';
print_r($users);
echo '</pre>';
И покажи, что вывело
Спустя 55 секунд (29.01.2011 - 15:42) Snus написал(а):
Bandicoot
А только ща заметил...
Откуда у тебя берутся $u и $p?
А только ща заметил...
Откуда у тебя берутся $u и $p?
if ( isset($users[$username]) && $users[$username] == $password)
{
echo "Good";
} else {
echo "Fuck";
}
Спустя 2 минуты, 31 секунда (29.01.2011 - 15:45) Bandicoot написал(а):
Array
(
[Коля] => 123
[Вася] => 456
[Петя] => 789
[Олег] => 000
)
Спустя 1 минута, 37 секунд (29.01.2011 - 15:47) Snus написал(а):
Bandicoot
У тебя $u и $p в массиве используются, вот он тебе и вывел последние объявленные данные.
У тебя $u и $p в массиве используются, вот он тебе и вывел последние объявленные данные.
Спустя 3 минуты, 34 секунды (29.01.2011 - 15:50) Bandicoot написал(а):
А как сделать правильно, не подскажите?
Спустя 1 минута, 21 секунда (29.01.2011 - 15:51) Snus написал(а):
Bandicoot
Я же уже написал
Я же уже написал
if ( isset($users[$username]) && $users[$username] == $password)
{
echo "Good";
} else {
echo "Fuck";
}
Спустя 5 минут, 40 секунд (29.01.2011 - 15:57) Bandicoot написал(а):
Цитата (Snus @ 29.01.2011 - 12:51) |
Bandicoot Я же уже написал if ( isset($users[$username]) && $users[$username] == $password) |
Постойте, $users[$username] == $password, логин = пароль?
Спустя 2 минуты, 12 секунд (29.01.2011 - 15:59) Bandicoot написал(а):
А точно, ассоциативный массив же. Спасибо!
_____________
Работаю с Уии