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

Форум PHP

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

 

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

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

тема: насколько надежна данная защита?
 
 автор: necroms   (15.01.2009 в 06:56)   письмо автору
 
 

Вот нашел скрипт по защите админки, и хотел бы узнать можно ли его использовать?

<?php
if (!isset($_SERVER['PHP_AUTH_USER']))

{
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
}

else {
        if (!
get_magic_quotes_gpc()) {
                
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
        }

        
$query "SELECT password FROM table WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
        
$lst = @mysql_query($query);

        if (!
$lst)
        {
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        
Header ("HTTP/1.0 401 Unauthorized");
        exit();
        }

        if (
mysql_num_rows($lst) == 0)
        {
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }

        
$pass =  @mysql_fetch_array($lst);
        if (
$_SERVER['PHP_AUTH_PW']!= $pass['pass'])
        {
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           
Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }


}
?>

  Ответить  
 
 автор: Trianon   (15.01.2009 в 09:56)   письмо автору
 
   для: necroms   (15.01.2009 в 06:56)
 

можете смело выкидывать в корзину..

  Ответить  
 
 автор: necroms   (15.01.2009 в 17:11)   письмо автору
 
   для: Trianon   (15.01.2009 в 09:56)
 

Значит ее можно легко обойти?

  Ответить  
 
 автор: Николай2357   (15.01.2009 в 17:27)   письмо автору
 
   для: necroms   (15.01.2009 в 17:11)
 

Ну почему же сразу - легко... Ничего не легко. Просто код не совсем оптимальный. На мой субъективный взгляд не стоит каждый раз при заходе на страницу дергать MySQL а стоит использовать сессию. Правда я не уверен, что из них экономнее, попросим Trianon'a прокомментировать:
<?php 
if(empty($_SESSION['ok']))
{
    if (empty(
$_SERVER['PHP_AUTH_USER'])) 
    { 
        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
        
Header ("HTTP/1.0 401 Unauthorized"); 
        exit(); 
    } 
    else 
    { 
        
$query "SELECT COUNT(*) AS cnt FROM resume 
        WHERE login='"
.mysql_escape_string($_SERVER['PHP_AUTH_USER'])."' 
        AND password='"
.md5($_SERVER['PHP_AUTH_PW'])."'"
        
$lst mysql_query($query); 

        if (!
$lst
        { 
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
        
Header ("HTTP/1.0 401 Unauthorized"); 
        exit(); 
        } 

        if (
mysql_result($lst,0,'cnt') == 0
        { 
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
           
Header ("HTTP/1.0 401 Unauthorized"); 
           exit(); 
        }
        else
        {
        
$_SESSION['ok'] = "ok";
        } 
    }
}
 
?>

  Ответить  
 
 автор: necroms   (15.01.2009 в 18:10)   письмо автору
 
   для: Николай2357   (15.01.2009 в 17:27)
 

меня вообще-то функция magic_quotes_gpc, больше всего беспокоила, я смотрю ты ее вообще убрал

  Ответить  
 
 автор: Николай2357   (15.01.2009 в 18:34)   письмо автору
 
   для: necroms   (15.01.2009 в 18:10)
 

А тут она не нада, тут же в базу ничего не заносится.

  Ответить  
 
 автор: Trianon   (15.01.2009 в 20:07)   письмо автору
 
   для: Николай2357   (15.01.2009 в 18:34)
 

>А тут она не нада, тут же в базу ничего не заносится.

где логика?

  Ответить  
 
 автор: Николай2357   (15.01.2009 в 20:46)   письмо автору
 
   для: Trianon   (15.01.2009 в 20:07)
 

Вы имеете ввиду логику кода или ответа? С ответом я сглупил, признаю. Он должен был звучать так:
>А тут она не нада, потому что переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] не обрабатываются функцией get_magic_quotes_gpc().
А в коде где логические ошибки, ткните носом...

  Ответить  
 
 автор: Trianon   (15.01.2009 в 21:26)   письмо автору
 
   для: Николай2357   (15.01.2009 в 20:46)
 

логику ответа.

>А в коде где логические ошибки, ткните носом...

это Вы на другую ветвь среагировали чтоли?

  Ответить  
 
 автор: necroms   (16.01.2009 в 01:55)   письмо автору
 
   для: Николай2357   (15.01.2009 в 20:46)
 

Вот вот я где-то читал, что она работает только с GET,POST и COOKIE

  Ответить  
 
 автор: Loki   (16.01.2009 в 09:24)   письмо автору
 
   для: necroms   (16.01.2009 в 01:55)
 

В этом случае для Вас не станет сюрпризом то, что последние три буквы get_magic_quotes_gpc() расшифровываются как GET,POST и COOKIE

  Ответить  
 
 автор: necroms   (16.01.2009 в 12:12)   письмо автору
 
   для: Loki   (16.01.2009 в 09:24)
 

не станет, меня как раз это и насторожило, так как там было еще написано, что именно поэтому данная функция может сделать дыры в скрипте

  Ответить  
 
 автор: Loki   (16.01.2009 в 12:58)   письмо автору
 
   для: necroms   (16.01.2009 в 12:12)
 

данная функция не может наделать дыр в скрипте по той простой причине что она не выполняет никаких активных действий.

  Ответить  
 
 автор: Trianon   (16.01.2009 в 13:05)   письмо автору
 
   для: necroms   (16.01.2009 в 12:12)
 

где было написано?

  Ответить  
 
 автор: necroms   (17.01.2009 в 03:22)   письмо автору
 
   для: Trianon   (16.01.2009 в 13:05)
 

Вообще-то здесь http://vingrad.ru/blogs/dominus/rokovyie-oshibki-php-v2/

  Ответить  
 
 автор: Trianon   (17.01.2009 в 09:16)   письмо автору
 
   для: necroms   (17.01.2009 в 03:22)
 

не нашел.

  Ответить  
 
 автор: necroms   (17.01.2009 в 18:40)   письмо автору
 
   для: Trianon   (17.01.2009 в 09:16)
 

magic_quotes_gpc – BUG?
Практически каждый из нас слышал о «магических» кавычках и их роли в SQL-injection. Но мало кто задумывался, что означает gpc. Если мы обратимся к определению, то там ясно сказано: magic_quotes_gpc=ON автоматически слэширует _GET/_POST/_COOKIE и _REQUEST. А остальное, например, $_FILES, $_ENV, $_SERVER, $_SESSION и множество других глобализаций, никто и не думает слэшировать.

А теперь вспомни предыдущий пункт. Да! Юзер-агент, реферер лежат в _SERVER и magic_quotes’ом не обрабатываются. Значит, если программер не позаботился о фильтре, то репутация продукта висит на волоске.

Кроме того, многие защиты, основываясь на «if(get_magic_quotes_gpc())..», используют add~ или stripslashes. Поскольку такой подход применяется ко всем переменным подряд, являясь корректным лишь для GET/POST/COOKIE/REQUEST, то при magic_quotes=ON приложение становится подверженным SQL-атаке в неGPC-массивах. Хочешь примера? Пожалуйста!

if (!get_magic_quotes_gpc())

{

function addslashes_deep($value)

{

$value = is_array($value) ? array_map(’addslashes_deep’, $value) : addslashes($value);

return $value;

}

$_SERVER = array_map(’addslashes_deep’, $_SERVER);

}
Пусть magic_quotes=ON, тогда User-Agent никоим образом не подвергается addslashes.

  Ответить  
 
 автор: Trianon   (17.01.2009 в 18:45)   письмо автору
 
   для: necroms   (17.01.2009 в 18:40)
 

и где в этом фрагменте сказано, что функция get_magic_quotes_gpc() может наделать дыры в скрипте?

  Ответить  
 
 автор: necroms   (18.01.2009 в 20:35)   письмо автору
 
   для: Trianon   (17.01.2009 в 18:45)
 

ладно может я не совсем правильно сказал, наверное нужно было написать вот так: незнание и использование проверки функцией get_magic_quotes_gpc() на включеность «магических» кавычках, может привести к плохим последствиям.

  Ответить  
 
 автор: Valick   (18.01.2009 в 20:40)   письмо автору
 
   для: necroms   (18.01.2009 в 20:35)
 

опять не угадал)
правильно так:
некорректное использование функций РНР , в том числе и get_magic_quotes_gpc(), неизбежно приведёт к появлению (потенциальной) уязвимости скрипта.

  Ответить  
 
 автор: Trianon   (18.01.2009 в 21:44)   письмо автору
 
   для: necroms   (18.01.2009 в 20:35)
 

да не приведет вызов get_magic_quotes_gpc() никогда ни к чему плохому.
К плохому может привести лишний вызов stripslashes()

  Ответить  
 
 автор: Valick   (18.01.2009 в 22:22)   письмо автору
 
   для: Trianon   (18.01.2009 в 21:44)
 

Ай, давно я с вами не "спорил")) поехали....
Естественно сам по себе вызов этой функции ничего плохого с собой не принесёт, но вот некорректное применение результата возвращаемого этой функцией может привести к уязвимости скрипта.

  Ответить  
 
 автор: Trianon   (18.01.2009 в 23:22)   письмо автору
 
   для: Valick   (18.01.2009 в 22:22)
 

привести к уязвимости скрипта вполне может применение результата чего угодно, если это применение некорректное.

  Ответить  
 
 автор: Valick   (18.01.2009 в 23:30)   письмо автору
 
   для: Trianon   (18.01.2009 в 23:22)
 

угу, об этом я писал двумя постами выше) осталось обьяснить это автору топика)

  Ответить  
 
 автор: Loki   (17.01.2009 в 23:23)   письмо автору
 
   для: necroms   (17.01.2009 в 18:40)
 

Так это просто плагиат!
Льюис Кэррол уже довольно давно описал именно эту ситуацию:
Если разом осушить бутылку с пометкой "яд", то рано или поздно, почти наверняка, почувствуешь легкое недомогание.
Так что читайте классиков - у них все это описано безо всяких иносказаний.

  Ответить  
 
 автор: Trianon   (17.01.2009 в 23:28)   письмо автору
 
   для: Loki   (17.01.2009 в 23:23)
 

к magic quotes это относится в полной мере :)

  Ответить  
 
 автор: necroms   (16.01.2009 в 01:55)   письмо автору
 
   для: Николай2357   (15.01.2009 в 20:46)
 

Вот вот я где-то читал, что она работает только с GET,POST и COOKIE

  Ответить  
 
 автор: Trianon   (15.01.2009 в 20:09)   письмо автору
 
   для: necroms   (15.01.2009 в 17:11)
 

Значит код написан с логическими ошибками

  Ответить  
 
 автор: Николай2357   (15.01.2009 в 10:14)   письмо автору
 
   для: necroms   (15.01.2009 в 06:56)
 

Не желательно пароль хранить в чистом виде, хэшировать надо его. Особенно в админке.
Вот так, мне кажется, будет оптимальней:
<?php 
if (!isset($_SERVER['PHP_AUTH_USER'])) 


        
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
        
Header ("HTTP/1.0 401 Unauthorized"); 
        exit(); 


else { 
        if (
get_magic_quotes_gpc()) { 
                
$_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']); 
                
$_SERVER['PHP_AUTH_PW'] = stripslashes($_SERVER['PHP_AUTH_PW']); 
        } 

        
$query "SELECT COUNT(*) AS cnt FROM table 
        WHERE user='"
.mysql_escape_string($_SERVER['PHP_AUTH_USER'])."' 
        AND password='"
.md5($_SERVER['PHP_AUTH_PW'])."' LIMIT 1"
        
$lst = @mysql_query($query); 

        if (!
$lst
        { 
            
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
        
Header ("HTTP/1.0 401 Unauthorized"); 
        exit(); 
        } 

        if (
mysql_result($lst,0,'cnt') == 0
        { 
           
Header ("WWW-Authenticate: Basic realm=\"Admin Page\""); 
           
Header ("HTTP/1.0 401 Unauthorized"); 
           exit(); 
        } 

}

?>

  Ответить  
 
 автор: Trianon   (15.01.2009 в 10:59)   письмо автору
 
   для: Николай2357   (15.01.2009 в 10:14)
 

Вот это вот
if (get_magic_quotes_gpc()) {
$_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']);
$_SERVER['PHP_AUTH_PW'] = stripslashes($_SERVER['PHP_AUTH_PW']);
}
оно зачем?

Вот это вот LIMIT 1
оно зачем?

  Ответить  
 
 автор: Николай2357   (15.01.2009 в 15:28)   письмо автору
 
   для: Trianon   (15.01.2009 в 10:59)
 

>Вот это вот
if (get_magic_quotes_gpc()) {
$_SERVER['PHP_AUTH_USER'] = stripslashes($_SERVER['PHP_AUTH_USER']);
$_SERVER['PHP_AUTH_PW'] = stripslashes($_SERVER['PHP_AUTH_PW']);
}
оно зачем?

Действительно... Рефлекс сработал...

>Вот это вот LIMIT 1
оно зачем?

Специально поставил, проверить ))) Мне всё кажется, что мускул перестанет отрабатывать таблицу после того, как найдет первую запись.

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

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