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

Форум PHP

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

 

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

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

тема: насколько незащищен скрипт (внутри)
 
 автор: amitiresome   (12.06.2005 в 05:14)   письмо автору
 
 

Скрипт авторизации через сравнение логина и пароля из базы.

<?php
//начинаю сессию
session_start();
//избавляюсь от тегов (не уверен нужно ли здесь это, потому как не вижу возможности через тэги в этих полях сделать что-то плохое)
$login htmlspecialchars($_POST['login']);
$password htmlspecialchars($_POST['password']);

//достаю пароль из базы данных
mysql_connect('localhost''root''password') or die ("No connection");

mysql_select_db("database") or die ("No base");

$query "SELECT password FROM users WHERE login='$login'";

$result mysql_query($query);

$rightpassword mysql_result($result,0,"password");

if(
$_POST['submit'])
//сравниваю пароли
 
{
  if(
$password=$rightpassword)
  {
  
$logged_user $login;
  
$_SESSION['logged_user']='logged_user';
  
header("Location: SECRET_PLACE.php");
  }
  elseif(
$password!=$result)
  {
  
header("Location: ACCESS_DENIED_MESSAGE.php");
  }
  exit;
 }

?>

   
 
 автор: cheops   (12.06.2005 в 12:27)   письмо автору
 
   для: amitiresome   (12.06.2005 в 05:14)
 

Можно считать, что скрипт взломан с помощью SQL-инъекции http://www.softtime.ru/info/articlephp.php?id_article=35. Для того, что защитить его от этого, требуется прогнать $login через функцию mysql_escape_string()
<?php
  
if (!get_magic_quotes_gpc())
  {
    
$login mysql_escape_string($login);
    
$password mysql_escape_string($password);
  }
?>

   
 
 автор: Artem S.   (12.06.2005 в 12:47)   письмо автору
 
   для: amitiresome   (12.06.2005 в 05:14)
 

Нашел 2 ляпа.
1)
if($password=$rightpassword)

Тут идет присваивание, а не сравнение. И почти всегда срабатывает.
2)
Не проверяется информация от базы данных. Если передать не существующего user’a и указать пустой пароль (или скажем "0") то мы попадем в SECRET_PLACE, так как null == "0"

   
 
 автор: amitiresome   (13.06.2005 в 16:57)   письмо автору
 
   для: Artem S.   (12.06.2005 в 12:47)
 

не подскажите как исправить? буду признателен

   
 
 автор: Ащьф   (13.06.2005 в 17:03)
 
   для: amitiresome   (13.06.2005 в 16:57)
 

По моему скромному опыту следует просто проверить поля на наличие в них текста... (хотя не уверен - слишком мало опыта...)ТИпа:

if (empty($_POST['Login']) || empty($_POST['pass']))
{
//Выводишь поле для ввода, иначе кидаешь куда надо
}

   
Rambler's Top100
вверх

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