[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверьте пожалуйста код авторизации
Landster
Код работает, но хотелось бы узнать, всё ли впорядке с безопасностью и нормально ли в целом написан код.

<?
include ("db.php");
session_start();
if($_SESSION['uid'] and $_SESSION['name']) {
$check = true;
}elseif($_COOKIE['hash'] and $_COOKIE['uid']){
$ip = $_SERVER['REMOTE_ADDR'];
$sql = mysql_query("SELECT * FROM `sess` WHERE `uid` = '".mysql_real_escape_string($_COOKIE['uid'])."' and `hash` = '".mysql_real_escape_string($_COOKIE['hash'])."' and `ip` = '$ip'",$db);
$row = mysql_fetch_array($sql);
if($row['id']) {
$sql2 = mysql_query("SELECT * FROM `users` WHERE `id` = '$row[uid]'",$db);
$row2 = mysql_fetch_array($sql2);
$_SESSION['uid'] = $row['uid'];
$_SESSION['name'] = $row2['name'];
$check = true;
}else{
SetCookie("hash",'');
SetCookie("uid",'');
$check = false;
}
}
elseif($_POST['name'] and $_POST['pass']) {
$name = $_POST['name'];
$pass = sha1($_POST['pass']);
$ip = $_SERVER['REMOTE_ADDR'];
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
$code = "";
$clen = strlen($chars) - 1;
while (strlen($code) < 10) {
$code .= $chars[mt_rand(0,$clen)];
}
$hash = md5($code);
$sql = mysql_query("SELECT * FROM `users` WHERE `name` = '".mysql_real_escape_string($name)."' and `pass` = '".mysql_real_escape_string($pass)."'",$db);
$row = mysql_fetch_array($sql);
if($row['id']) {
$uid = $row['id'];
SetCookie("hash",$hash,time()+60*60*24*30);
SetCookie("uid",$uid,time()+60*60*24*30);
$sql = mysql_query("INSERT INTO sess(uid,hash,ip) VALUES('$uid','$hash','$ip')",$db);
$_SESSION['uid'] = $uid;
$_SESSION['name'] = $row['name'];
header("Location: /login.php");
}else{
echo'Неправильное имя или пароль';
}
}
else{
$check = false;
}

if($check == true) {
echo 'Привет, '.$_SESSION['name'];
}else{
?>
<form
action='' method='post'>
<input
type='text' name='name'><br>
<input
type='password' name='pass'><br>
<input
type='submit'>
</form>
<?

}
?>




Спустя 1 час, 51 минута, 44 секунды (21.02.2012 - 20:54) vagrand написал(а):
Запросы:
SELECT * FROM `sess` WHERE `uid` = ...


и

SELECT * FROM `users` WHERE `id` ...


Спокойно можно объединить в один при помощи inner join


SELECT s.*, u.*
FROM `sess` s
INNER JOIN `users` u on u.id = s.uid
where `uid` = ...







Спустя 29 минут, 12 секунд (21.02.2012 - 21:23) m4a1fox написал(а):
Landster
Цитата
нормально ли в целом написан код
Имхо не фонтан... нет проверок isset и empty
Зачем вам mysql_fetch_array?

Спустя 25 минут, 13 секунд (21.02.2012 - 21:49) Landster написал(а):
Да, согласен, тут не доработал.
А ещё какие замечания?

Спустя 1 час, 18 минут, 24 секунды (21.02.2012 - 23:07) killer8080 написал(а):
Landster
нельзя вызывать mysql_fetch_array сразу после mysql_query, если записей ноль, будет варнинг. Нужно предварительно проверять результат запроса через mysql_num_rows.

Спустя 2 дня, 14 часов, 7 минут, 19 секунд (24.02.2012 - 13:14) Landster написал(а):
Немного доработал код в соответствии с замечаниями, нормально ли теперь?

<?
include ("db.php");
session_start();
if(!empty($_SESSION['uid']) and !empty($_SESSION['name'])) {
$check = true;
}elseif(!empty($_COOKIE['hash']) and !empty($_COOKIE['uid'])){
$ip = $_SERVER['REMOTE_ADDR'];
$sql = mysql_query("SELECT s.*, u.* FROM `sess` s INNER JOIN `users` u on s.uid = u.id WHERE `uid` = '".mysql_real_escape_string($_COOKIE['uid'])."' and `hash` = '".mysql_real_escape_string($_COOKIE['hash'])."' and `ip` = '$ip'",$db);
if(mysql_num_rows($sql) > 0) {
$row = mysql_fetch_assoc($sql);
$_SESSION['uid'] = $row['uid'];
$_SESSION['name'] = $row['name'];
$check = true;
}else{
SetCookie("hash",'');
SetCookie("uid",'');
$check = false;
}
}
elseif(isset($_POST['ok'])) {
$name = !empty($_POST['name']) ? trim($_POST['name']) : FALSE;
$pass = !empty($_POST['pass']) ? sha1(trim($_POST['pass'])) : FALSE;
if($name and $pass) {
$ip = $_SERVER['REMOTE_ADDR'];
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
$code = "";
$clen = strlen($chars) - 1;
while (strlen($code) < 10) {
$code .= $chars[mt_rand(0,$clen)];
}
$hash = md5($code);
$sql = mysql_query("SELECT * FROM `users` WHERE `name` = '".mysql_real_escape_string($name)."' and `pass` = '".mysql_real_escape_string($pass)."'",$db);
if(mysql_num_rows($sql) > 0) {
$row = mysql_fetch_assoc($sql);
$uid = $row['id'];
SetCookie("hash",$hash,time()+60*60*24*30);
SetCookie("uid",$uid,time()+60*60*24*30);
$sql = mysql_query("INSERT INTO `sess`(uid,hash,ip) VALUES('$uid','$hash','$ip')",$db);
$_SESSION['uid'] = $uid;
$_SESSION['name'] = $row['name'];
header("Location: /login.php");
}else{
echo'Неправильное имя или пароль';
}
}
else{
echo'Заполните все поля';
}
}
else{
$check = false;
}

if($check == true) {
echo 'Привет, '.$_SESSION['name'];
}else{
?>
<form
action='' method='post'>
<input
type='text' name='name'><br>
<input
type='password' name='pass'><br>
<input
type='submit' name='ok'>
</form>
<?

}
?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.