1Bot |
Отправлено: 29 апреля 2011 — 23:45
|
Super Member
Покинул форум
Сообщений всего: 773
Дата рег-ции: Апр. 2009
Откуда: Днепропетровск
Репутация: 69
|
Виктория пишет:Начала сравнивать ExBB и столкнулась вот с чем. При удачной попытке логина администртора регистрируется $_SESSION['admin'] - для чего? Дальше как она используется? И как вообще можно защитить админку кроме пароля? Достаточно ли проверок на такую сессионную переменую?
И второй вопрос. После логина юзера, что писать в куки? его id ведь недостаточно? можно легко подставить! Помогайте, вся уже замучалась!
Если работаете через механизм сессий, то куки сохраняются автоматически при открытии сессии.
Виктория пишет:где можно про это доходчиво почитать?
Почитайте книги Котерова (одного из авторов Денвера) по PHP, да и любая книга по языку не обходит стороной механизмы защиты.(Отредактировано автором: 29 апреля 2011 — 23:46) |
|
|
Виктория |
Отправлено: 1 мая 2011 — 15:44
|
Newbie
Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2009
Откуда: Россия, Пермь
Репутация: 0
|
1Bot пишет:Если работаете через механизм сессий, то куки сохраняются автоматически при открытии сессии.
немножко не поняли вы меня...
1Bot пишет:Почитайте книги Котерова (одного из авторов Денвера) по PHP, да и любая книга по языку не обходит стороной механизмы защиты.
Спасибо, посмотрю.
igrok54 пишет:Пишите только самое необходимое, чем меньше инфы будет храниться в куки, тем сложнее взломать через украденный кукис. Шифруйте данные, хранящиеся в нем. Связка логин-пароль в незашифрованном виде записывающиеся в куки можно считать дырой в безопасности.
Просто речь идет вот о чем. Авторизацию я сделала через сессии. Юзер логинится,
md5($_POST['pas']) сравнивается с хранимым паролем в БД, также проверяя соответствует ли введеный емайл, емэйлу хранимомому в БД. Если все ок, я стартутую сессию и кладу туда user['id']. В родительском классе есть функция, которая уже возвращает ассоциативный масив со всеми данными этого юзера. Дак вот. Везде, где мне надо проверить залогинился ли пользователь, я проверяю наличае этого массива (который заполнен от сессионой перименной с айди юзера) и вот теперь речь о куках! Функционал "запомнить меня" при логине я сделала так. В момент авторизации кладу в куку тотже айди и все, а потом уже проверяю: если в куках есть айди, то взять от туда, если нет, то из сессии, а иначе гость.
Виктория пишет:что писать в куки? его id ведь недостаточно?
Вот он и вопрос. Достаточно ли там id или это легко подменить и зайти под кем угодно? Что туда еще писать, может md5 пароля?
Извините за длинную тираду (Отредактировано автором: 1 мая 2011 — 15:46) |
|
|
Виктория |
Отправлено: 1 мая 2011 — 16:12
|
Newbie
Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2009
Откуда: Россия, Пермь
Репутация: 0
|
BON хм, это не форум, это совершенно другое приложение. И оно пока токо на локальной машине.
(Добавление)
Так выглядит метод login_user
login_user (Отобразить)CODE:function login_user(){
//логин пользователя
$mail = $_POST['mail'];
$pas = $_POST['pas'];
$cookie = $_POST['cookie'];
//проверка почты
if (!$mail) {
$this->message_back($this->emptyMail);
exit;
}
if (!$this->valid_email($mail)) {
$this->message_back($this->errorMail);
exit;
}
//проверка пароля
if (!$pas) {
$this->message_back($this->emptyPas);
exit;
}
if (!$this->valid_pas($pas)) {
$this->message_back($this->errorPas2);
exit;
}
$connect = $this->db_connect();
$query = "select * from users where mail = '".$mail."' and pas = '".md5($pas)."'";
$result = $connect->query($query);
$user = $result->fetch_assoc();
if ($user) {
session_start();
$_SESSION['tid'] = $user['id'];
if($cookie){
setCookie("tid", $user['id'], time() + 31104000, "/");
}else setCookie("tid", "", 0, "/");
//+1 к колличеству входов и обновление последнего захода
$login = $user['login']+1;
$editdate = mktime();
$query = "update users set login = '".$login."', editdate = '".$editdate."' where id = '".$user['id']."'";
$result = $connect->query($query);
$connect->close();
//запись лога о входе
$log_type = 2;
$this->logs($user['id'], $log_type);
if ($user['type'] == 2 or $user['type'] == 3 or $user['type'] == 4){
$url = "page.php?id=".$user['id'];
} else {
$url = "index.php";
}
$this->message($this->logOK,$url);
} else {
$url = "loginout.php?act=f_login_user";
$this->message($this->logFail,$url);
}
}
(Отредактировано автором: 1 мая 2011 — 16:26) |
|
|
shyuser |
Отправлено: 1 мая 2011 — 22:49
|
Member
Покинул форум
Сообщений всего: 111
Дата рег-ции: Июль 2009
Откуда: Лукоянов, Нижегородская область, Россия
Репутация: 16
|
Виктория, при регистрации пользователя генерируется ключ и добавив его к паролю кодируем md5. В куки добавляем и логин и пароль, но при этом правильность пароля пользователя можно проверить только зная ключ, который хранится на сервере.
Вот часть кода, несколько функций, которые я набросал для своего сайта. Пока только начинаю в php, поэтому не судите строго. Может пригодится.
код (Отобразить)CODE:
#Функция для генерации соли, используемоей в хешировании пароля, возращает 3 случайных символа
function GenerateSalt($n=3)
{ $key='';
$pattern = '1234567890abcdefghijklmnopqrstuvwxyz.,*_-=+';
$counter = strlen($pattern)-1;
for($i=0;$i<$n;$i++)
{
$key.=$pattern{rand(0,$counter)};
}
return $key;
};
#+|id|date|login|email|salt|password
#0 1 2 3 4 5 6
#функция возвращает $id из базы с введенными логином и паролем
function user_id($login,$password)
{ global $path_data;
$path_user=$path_data.'user.dat';//путь к файлу списка пользователей
$arr_user=file($path_user); //считываем список статей
$id=0;
for ($i=1;$i<count($arr_user);$i++) {
$subarr=trim($arr_user[$i]);// Удаляем пробелы из строки
$subarr_user = explode('|',$subarr);
if (($subarr_user[0] == "+") and ($subarr_user[3] == $login) and ($subarr_user[6] ==$password))
{$id=$subarr_user[1]; break;};
};
return $id;
};
#функция проверяет есть ли в базе пользователь под таким id и возвращает логин
function find_id_user($id)
{ global $path_data;
$path_user=$path_data.'user.dat';//путь к файлу списка пользователей
$arr_user=file($path_user); //считываем список статей
$login='';
for ($i=1;$i<count($arr_user);$i++) {
$subarr=trim($arr_user[$i]);// Удаляем пробелы из строки
$subarr_user = explode('|',$subarr);
if (($subarr_user[0] == "+") and ($subarr_user[1] ==$id))
{$login=$subarr_user[3]; break;};
};
return $login;
};
#функция проверяет есть ли в базе пользователь под таким логином
function find_user($login)
{ global $path_data;
$path_user=$path_data.'user.dat';//путь к файлу списка пользователей
$arr_user=file($path_user); //считываем список статей
$flag=false;
for ($i=1;$i<count($arr_user);$i++) {
$subarr=trim($arr_user[$i]);// Удаляем пробелы из строки
$subarr_user = explode('|',$subarr);
if (($subarr_user[0] == "+") and ($subarr_user[3] == $login))
{$flag=true; break;};
};
return $flag;
};
#функция добавляет в базу пользователя с введенными логином и паролем
function save_new_user($login,$password,$email)
{ global $path_data;
$path_user=$path_data.'user.dat';#путь к файлу списка пользователей
$arr_user=file($path_user); //считываем список статей
$subarr=trim($arr_user[count($arr_user)-1]);// Удаляем пробелы из строки
if ($subarr != "")
{
$subarr_user = explode('|',$subarr);
$id=$subarr_user[1]+1;
}
else
{
$id=1;
};
$salt = GenerateSalt();
$hashed_password = md5(md5($password).$salt);
$realdate=date("Y-m-d");
$subtext="\n".'+|'.$id.'|'.$realdate.'|'.$login.'|'.$email.'|'.$salt.'|'.$hashed_password;
if (file_exists($path_user))#проверяем существование файла
{
$open=fopen($path_user,"a+");#открываем файл для записи
flock ($open,LOCK_EX);#блокировка файла
fwrite($open,$subtext);#добавляем строку
fflush ($open);#очищение файлового буфера и запись в файл
flock ($open,LOCK_UN);#разблокировка файла
fclose($open);#закрываем файл
}
else
{};
return $id;
};
#функция возвращает $salt из базы по логину и паролю
function user_salt($login)
{ global $path_data;
$path_user=$path_data.'user.dat';//путь к файлу списка пользователей
$arr_user=file($path_user); //считываем список статей
$salt=0;
for ($i=1;$i<count($arr_user);$i++) {
$subarr=trim($arr_user[$i]);// Удаляем пробелы из строки
$subarr_user = explode('|',$subarr);
if (($subarr_user[0] == "+") and ($subarr_user[3] == $login))
{$salt=$subarr_user[5]; break;};
};
return $salt;
};
(Отредактировано автором: 2 мая 2011 — 10:42) |
|
|
igrok54 |
Отправлено: 1 мая 2011 — 23:32
|
Advanced Member
Покинул форум
Сообщений всего: 470
Дата рег-ции: Янв. 2010
Откуда: Пермь
Репутация: 57
|
Виктория пишет:Авторизацию я сделала через сессии. Юзер логинится,
md5($_POST['pas']) сравнивается с хранимым паролем в БД, также проверяя соответствует ли введеный емайл, емэйлу хранимомому в БД. Если все ок, я стартутую сессию и кладу туда user['id']. В родительском классе есть функция, которая уже возвращает ассоциативный масив со всеми данными этого юзера. Дак вот. Везде, где мне надо проверить залогинился ли пользователь, я проверяю наличае этого массива (который заполнен от сессионой перименной с айди юзера) и вот теперь речь о куках! Функционал "запомнить меня" при логине я сделала так. В момент авторизации кладу в куку тотже айди и все, а потом уже проверяю: если в куках есть айди, то взять от туда, если нет, то из сессии, а иначе гость.
Землячка , какой смысл делать двойное хранение авторизации - и в сессии и в куки? Зачем? Поясните, плиз, Ваше мнение. (Отредактировано автором: 1 мая 2011 — 23:38) |
|
|
Виктория |
Отправлено: 2 мая 2011 — 10:20
|
Newbie
Покинул форум
Сообщений всего: 22
Дата рег-ции: Нояб. 2009
Откуда: Россия, Пермь
Репутация: 0
|
BON пишет:Виктория, а ваш интсрумент будеи платно или бесплатно распространяться?
BON он вообще не будет распространятся. Он будет в единственном экземпляре. Участие в проекте полностью бесплатно.
shyuser пишет:при регистрации пользователя генерируется ключ и добавив его к паролю кодируем md5. В куки добавляем и логин и пароль, но при этом правильность пароля пользователя можно проверить только зная ключ
Вот это очень хорошо! Чтото подобное сделано и в ExBB, только ключ похоже тоже стоит в куки писать. спасибо.
shyuser пишет:Вот часть кода, несколько функций, которые я набросал для своего сайта.
Ваши функции предназначены для работы с файлами, а я использую бд, про "соль" конечно знаю.
igrok54 пишет:какой смысл делать двойное хранение авторизации - и в сессии и в куки?
Хм, сессия живет до закрытия страницы в браузере а у кук указано время жизни.
Цитата:setCookie("tid", $user['id'], time() + 31104000, "/" ; (Отредактировано автором: 2 мая 2011 — 18:55) |
|
|
|