Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Авторизация на сесиях, НАДЕЖНО?
 
 автор: Doorgen   (23.12.2008 в 15:57)   письмо автору
 
 

Вот переписал на сесии. Так надежно? Если нет то что поправить.

<?

session_start
();

require_once (
"config.php");

echo 
$_SESSION['username'];
if(!
$_SESSION['username'])

{


echo 
"
<center>
<table border=0 cellspacing=0 cellpadding=0 width=40% height=100% >
<tr>
<td>
<center>
<table border=0 cellspacing=00 cellpadding=50 bgcolor=#ffffff width=500>
<tr>
<td>
<img src='skin/31.png' align=left ><br><br>

<form action='armor.php' method='POST'>
<center>Пользователь: <input type=text name=user size='25'><br><br>
<center>Пароль: <input type=password name=pswrd size='25'><br><br>
<center><input type='submit' name=go value='Войти в панель администрирования'>
</form><br><br>
<center><a href='../'>На главную страницу</a></center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</center>"
;

if(isset(
$go))

{
$pswrd MD5($_POST['pswrd']); 
$user $_POST['user'];

  
$nme mysql_query("SELECT pass = '$pswrd' FROM users WHERE user='$user'"); 


 if(!
$nme) exit ("Ошибка выполнения запроса"); 


 if (
mysql_num_rows ($nme) > 0)


$username md5($_POST['pswrd'],$_POST['user']);
$_SESSION['username'] = "$username"
echo 
"<html><head><META HTTP-EQUIV='REFRESH' CONTENT='1; URL=index.php'></head><html>";
}


}

exit;

}


?>

  Ответить  
 
 автор: Doorgen   (24.12.2008 в 08:50)   письмо автору
 
   для: Doorgen   (23.12.2008 в 15:57)
 

Что не кто не может подсказать надежно это или нет?

  Ответить  
 
 автор: Valick   (24.12.2008 в 09:18)   письмо автору
 
   для: Doorgen   (24.12.2008 в 08:50)
 

Мягко говоря это ненадёжно...
где вы взяли вот это?
$nme = mysql_query("SELECT pass = '$pswrd' FROM users WHERE user='$user'");

  Ответить  
 
 автор: sl1p   (24.12.2008 в 09:35)   письмо автору
 
   для: Doorgen   (24.12.2008 в 08:50)
 

эта 5

  Ответить  
 
 автор: SteAlzzer   (24.12.2008 в 10:26)   письмо автору
 
   для: Doorgen   (23.12.2008 в 15:57)
 

на мой взгляд запрос к бд лучше такой
SELECT * FROM user WHERE login='$login' AND pass='$pass'
И в сессии заносить так же id пользователя, на мой взгляд так проще реализовать работу.

  Ответить  
 
 автор: Doorgen   (24.12.2008 в 11:53)   письмо автору
 
   для: SteAlzzer   (24.12.2008 в 10:26)
 

Запрос уже поменян давно :) просто редактировать не могу первое сообщение :)

А насчет id у меня только 1 пользователь, это как бы вход в админку.

  Ответить  
 
 автор: SteAlzzer   (24.12.2008 в 12:08)   письмо автору
 
   для: Doorgen   (24.12.2008 в 11:53)
 

тогда былобы не плохо сделать авторизацию через .htaccess

  Ответить  
 
 автор: SteAlzzer   (24.12.2008 в 12:08)   письмо автору
 
   для: Doorgen   (24.12.2008 в 11:53)
 

тогда былобы не плохо сделать авторизацию через .htaccess

  Ответить  
 
 автор: SteAlzzer   (24.12.2008 в 12:08)   письмо автору
 
   для: Doorgen   (24.12.2008 в 11:53)
 

тогда былобы не плохо сделать авторизацию через .htaccess

  Ответить  
 
 автор: Zend72   (24.12.2008 в 12:16)   письмо автору
 
   для: SteAlzzer   (24.12.2008 в 12:08)
 

О да!

  Ответить  
 
 автор: Doorgen   (25.12.2008 в 17:46)   письмо автору
 
   для: Zend72   (24.12.2008 в 12:16)
 

А если все таки посмотреть на то что я написал, а не то что можно, это надежно?

Другой вариант просто не приемлем. Только сессии

  Ответить  
 
 автор: Николай2357   (25.12.2008 в 17:58)   письмо автору
 
   для: Doorgen   (25.12.2008 в 17:46)
 

Нет, не надёжно. Вы не обработали переменную при запросе и это чревато инъекцией. ВОО(.............)ООТ ТАКЕННАЯ ИГЛА!!!

  Ответить  
 
 автор: Avanturer   (25.12.2008 в 17:58)   письмо автору
 
   для: Doorgen   (25.12.2008 в 17:46)
 

само использование сессий достаточно надежно

единственное,
что хотелось бы посоветовать не использовать в запросах непроверенных переменных,
вы про инъекции что-нибудь слышали?

  Ответить  
 
 автор: Doorgen   (26.12.2008 в 22:38)   письмо автору
 
   для: Avanturer   (25.12.2008 в 17:58)
 

Нет не слышал, ну думаю догадываюсь про что говориться.

Наверное про то что можно скрипт вписать в это поле. Я прав?

А если я проверю их тогда так можно защититься?

  Ответить  
 
 автор: AcidTrash   (26.12.2008 в 22:53)   письмо автору
 
   для: Doorgen   (26.12.2008 в 22:38)
 

Не проверить, а правильно обработать.
if(!get_magic_quotes_gpc())
$_POST['user'] = mysql_escape_string($_POST['user']);
$user = $_POST['user'];

  Ответить  
 
 автор: Doorgen   (27.12.2008 в 15:04)   письмо автору
 
   для: AcidTrash   (26.12.2008 в 22:53)
 

Вот так нормально?
if(!$_SESSION['username'])

{

echo "<center>
<table border=0 cellspacing=0 cellpadding=0 width=40% height=100% >
<tr>
<td>
<center>
<table border=0 cellspacing=0 cellpadding=50 bgcolor=#ffffff width=600>
<tr>
<td>
<img src='skin/31.png' align=left ><br><br>

<form action='header.php' method='POST'>
<center>Пользователь: <input type=text name=user size='25'><br><br>
<center>Пароль: <input type=password name=pswrd size='25'><br><br>
<center><input type='submit' name=auto value='Войти в панель администрирования'>
</form><br><br>
<center><a href='../'>На главную страницу</a></center>
</td>
</tr>
</table>
</center>
</td>
</tr>
</table>
</center>";

if(isset($auto))

{

$user = mysql_escape_string($_POST['user']); 
$pswrd = mysql_escape_string(MD5($_POST['pswrd'])); 

$nme = mysql_query("SELECT * FROM user WHERE user='$user' and pswrd = '$pswrd'"); 


if(!$nme) exit ("Ошибка выполнения запроса"); 
if (mysql_num_rows ($nme) > 0)


$username = md5($_POST['pswrd'],$_POST['user']);
$_SESSION['username'] = "$username"; 
echo "<html><head><META HTTP-EQUIV='REFRESH' CONTENT='1; URL=index.php'></head><html>";
}

}
exit;
}

  Ответить  
 
 автор: AcidTrash   (27.12.2008 в 21:18)   письмо автору
 
   для: Doorgen   (27.12.2008 в 15:04)
 

Нет, не нормально.
if(isset($auto))
{

Вот использование это полный п... ц
Если register_globals будет выключен условие не сработает.
Проверяйте if(isset($_POST[auto]))
Не надо быть зависимым от register_globals, тем более вам это может стать большой проблемой.
Далее нет проверки, включены ли магические кавычки, а применять без этого mysql_escape_string не целесообразно.
Пароль, смысла нет обрабатывать, если вы уже его захешировали.

P.S. Выше привел пример.

  Ответить  
 
 автор: Doorgen   (29.12.2008 в 14:54)   письмо автору
 
   для: AcidTrash   (27.12.2008 в 21:18)
 

А могли бы вы переделать как надо, эту авторизацию. Я бы вам был очень благодарен.

А то не совсем понимаю что нужно изменить.

  Ответить  
 
 автор: Николай2357   (29.12.2008 в 18:16)   письмо автору
 
   для: Doorgen   (29.12.2008 в 14:54)
 

Переделать не переделать, но кое что посоветовать я Вам наверное смог бы...
Для начала позаботьтесь о магических кавычках, вот тут хотя бы почитайте. Ну и:
<? 
session_start
(); 
require_once (
"config.php"); 
if(!
$_SESSION['username']) 

// тег <center> не желателен к применению, так как выведен из обихода в новом стандарте
// и вообще лучше поменять блоки местами и ывыводить html не через echo, а в чистом виде
echo "<center> 
<table border=0 cellspacing=0 cellpadding=0 width=40% height=100% > 
<tr> 
<td> 
<center> 
<table border=0 cellspacing=0 cellpadding=50 bgcolor=#ffffff width=600> 
<tr> 
<td> 
<img src='skin/31.png' align=left ><br><br> 

<form action='header.php' method='POST'>
<center>Пользователь: <input type=text name=user size='25'><br><br> 
<center>Пароль: <input type=password name=pswrd size='25'><br><br> 
<center><input type='submit' name=auto value='Войти в панель администрирования'> 
</form><br><br> 
<center><a href='../'>На главную страницу</a></center> 
</td> 
</tr> 
</table> 
</center> 
</td> 
</tr> 
</table> 
</center>"

// Вот это откуда взялось - не понятно. 
if(isset($auto)) 

$user mysql_escape_string($_POST['user']);
// Тут обработка явно лишняя, всё равно из хэша иньекции не сделать. 
//$pswrd = mysql_escape_string(md5($_POST['pswrd'])); 
$pswrd md5($_POST['pswrd']);  
// Здесь совсем не обязательно перебирать все записи, достаточно одной. 
// И еще, переменные внутри кавычек конечно интерпретируются, но это делает код не очень читаемым, 
// а самое главное, такой запрос проходит в почти 1,5 раза медленнее.
//$nme = mysql_query("SELECT * FROM user WHERE user='$user' and pswrd = '$pswrd'");
$nme mysql_query("SELECT * FROM users WHERE user='".$user."' AND pswrd = '".$pswrd."' LIMIT 1");  

// Оставлять юзера один на один с пустым экраном и непонятной надписью не очень то красиво. 
// Отправьте его на форму хотя бы.
    
if(!$nme)
    { 
//exit ("Ошибка выполнения запроса");
    
header("location: header.php");
    exit();
    }
      
    if (
mysql_num_rows ($nme) > 0
    {
// Вот эта комбинация совсем не понятна, какая разница, что записано в переменную 
// сессии, можно просто "ok" или 1  
//$username = md5($_POST['pswrd'],$_POST['user']); 
//$_SESSION['username'] = $username;
$_SESSION['username'] = 1;
// Тут мне кажется уместнее был бы хидер  
//echo "<html><head><META HTTP-EQUIV='REFRESH' CONTENT='1; URL=index.php'></head><html>";
header("location: index.php"); 
    } 
}
// И это в конце скрипта совсем не обязательно.
//exit; 
}

  Ответить  
 
 автор: Doorgen   (31.12.2008 в 00:22)   письмо автору
 
   для: Николай2357   (29.12.2008 в 18:16)
 

С пустым экраном я пользователя не оставляю, если пароль не верен то форма не пропадает.

Не вижу вообще не каких изменения в защите.

А почему center вышел? Все работает причем во всех браузерах. И сомневаюсь что куда то денется.

  Ответить  
 
 автор: Николай2357   (31.12.2008 в 01:58)   письмо автору
 
   для: Doorgen   (31.12.2008 в 00:22)
 

1.Форма у Вас пропадет при неудачном запросе.
2. А о какой защите вообще речь, если тут не понятно что и как должно работать. Откуда Вы достали переменную $auto? Я Вам написал советы по оптимизации кода, а защита - дело индивидуальное. Или Вы хотите потом кого то крайним сделать, мол это не я защиту писал? Сами, сами...))))
3. Не факт что будет работать через пару тройку лет. Или Вы сайт на один день делаете? В новом стандарте разметки такого тега нет, значит и новые версии браузеров могут их проигнорировать.

  Ответить  
 
 автор: xx77   (31.12.2008 в 03:26)   письмо автору
 
   для: Doorgen   (31.12.2008 в 00:22)
 

Примерно такая структура должна быть чтобы не было пустых страниц
<?
define
('MQ'get_magic_quotes_gpc()); 
//  MQ чтобы было видно внутри функций
$error '';

function 
mq_strip($txt$length=1024) { // удаление слэшей
// можно убрать ограничение  $length
// ,  но сним можно например mq_strip($msg, 2048) ограничить сообщения
 
$txt = (MQ) ? stripslashes(trim($txt)): trim($txt);
    return 
substr($txt0$length);
// end of  mq_strip

session_start();

if(isset(
$_POST['user']) && isset($_POST['pswrd']) ) {
 
// если заполонили и отправили
 
$user mq_strip($_POST['user'], 25);
 
$pswrd mq_strip($_POST['pswrd'], 25); // 25 maximum
 
if ($user == ''
    
$error .= '<div>Не указан пользователь.</div>';
  else 
$_SESSION['username'] = htmlspecialchars($user);
  
// сразу htmlspecialchars чтобы выводить
  
if (strlen($pswrd) < 3// 3 minimum
    
$error .= '<div>Не указан пароль.</div>';

 else if (
$error == '') {
    
// всё заполнено
   
require_once ("config.php");
   
   
$sql mysql_query('SELECT u_id FROM users WHERE user="'
     
mysql_escape_string($user) . '" AND pswrd = "'
     
md5($pswrd) . '" LIMIT 1');
     
   if(!
$sql$error .= '<div>Ошибка запроса.</div>';
   else if (
mysql_num_rows($sql) > 0) {
    
$_SESSION['u_id'] = mysql_result($sql0);
    
// тоже не помешает , если конечно в таблице есть  u_id
    
header("location: index.php");
    
//там уже можно показать echo    $_SESSION['username'];
    
exit;
   }
   else 
$error .= '<div>Ошибка идентификации.</div>';
 }
// 
}
?>
<style>
.error * { text-align:center; color: red; border:double 3px darkred; padding: 1ex;}
</style>
<?
if ($error != '') echo '<div class="error">'
               
$error "</div>\n";
?>

<center>  
<table border=0 cellspacing=0 cellpadding=0 width=40% height=100% >  
<tr>  <td>  <center>  
<table border=0 cellspacing=0 cellpadding=50 bgcolor=#ffffff width=600>  
<tr><td><img src='skin/31.png' align=left ><br><br>  

<form action='' method='POST'> 
<center>Пользователь: <input type=text name=user size='25' value="<?
if (isset($_SESSION['username']))
 echo 
$_SESSION['username'];
?>"><br><br>  
<center>Пароль: <input type=password name=pswrd size='25'><br><br>  
<center><input type='submit' name=auto value='Войти в панель администрирования'>  
</form><br><br>  
<center><a href='../'>На главную страницу</a></center> 
</td></tr></table>  
</center>  
</td></tr></table>  
</center> 
Но не запускал , и SELECT u_id FROM users

  Ответить  
 
 автор: Root   (31.12.2008 в 11:39)   письмо автору
 
   для: xx77   (31.12.2008 в 03:26)
 

>define('MQ', get_magic_quotes_gpc());
>// MQ чтобы было видно внутри функций

А get_magic_quotes_gpc() внутри функций не видно?

  Ответить  
 
 автор: xx77   (31.12.2008 в 13:29)   письмо автору
1.2 Кб
 
   для: Root   (31.12.2008 в 11:39)
 

Мне так больше нравится.
Легко изменить, если таких функций много , и всётаки чуть менее затратно , читать константу , чем вызывать функцию,если надо много раз вызывать.
Вот прикрепил например тест.
Не на много конечно, и может повлиять только если много-много вызовов функций
, но всётаки что-то в этом есть :)

// Хотя возможно был смысл в том чтобы запихать определение этой константы вместе с определением функции в ту часть кода которая выполняется только если передана форма , но так оно виднее :)

  Ответить  
 
 автор: Yarovoews   (01.01.2009 в 15:26)   письмо автору
 
   для: xx77   (31.12.2008 в 13:29)
 

1 Форму прошить сессией
2 Капча)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования