|
|
|
| Вот нашел скрипт по защите админки, и хотел бы узнать можно ли его использовать?
<?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();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: necroms
(15.01.2009 в 06:56)
| | можете смело выкидывать в корзину.. | |
|
|
|
|
|
|
|
для: Trianon
(15.01.2009 в 09:56)
| | Значит ее можно легко обойти? | |
|
|
|
|
|
|
|
для: 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";
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Николай2357
(15.01.2009 в 17:27)
| | меня вообще-то функция magic_quotes_gpc, больше всего беспокоила, я смотрю ты ее вообще убрал | |
|
|
|
|
|
|
|
для: necroms
(15.01.2009 в 18:10)
| | А тут она не нада, тут же в базу ничего не заносится. | |
|
|
|
|
|
|
|
для: Николай2357
(15.01.2009 в 18:34)
| | >А тут она не нада, тут же в базу ничего не заносится.
где логика? | |
|
|
|
|
|
|
|
для: Trianon
(15.01.2009 в 20:07)
| | Вы имеете ввиду логику кода или ответа? С ответом я сглупил, признаю. Он должен был звучать так:
>А тут она не нада, потому что переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] не обрабатываются функцией get_magic_quotes_gpc().
А в коде где логические ошибки, ткните носом... | |
|
|
|
|
|
|
|
для: Николай2357
(15.01.2009 в 20:46)
| | логику ответа.
>А в коде где логические ошибки, ткните носом...
это Вы на другую ветвь среагировали чтоли? | |
|
|
|
|
|
|
|
для: Николай2357
(15.01.2009 в 20:46)
| | Вот вот я где-то читал, что она работает только с GET,POST и COOKIE | |
|
|
|
|
|
|
|
для: necroms
(16.01.2009 в 01:55)
| | В этом случае для Вас не станет сюрпризом то, что последние три буквы get_magic_quotes_gpc() расшифровываются как GET,POST и COOKIE | |
|
|
|
|
|
|
|
для: Loki
(16.01.2009 в 09:24)
| | не станет, меня как раз это и насторожило, так как там было еще написано, что именно поэтому данная функция может сделать дыры в скрипте | |
|
|
|
|
|
|
|
для: necroms
(16.01.2009 в 12:12)
| | данная функция не может наделать дыр в скрипте по той простой причине что она не выполняет никаких активных действий. | |
|
|
|
|
|
|
|
для: necroms
(16.01.2009 в 12:12)
| | где было написано? | |
|
|
|
|
|
|
|
|
для: necroms
(17.01.2009 в 03:22)
| | не нашел. | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: necroms
(17.01.2009 в 18:40)
| | и где в этом фрагменте сказано, что функция get_magic_quotes_gpc() может наделать дыры в скрипте? | |
|
|
|
|
|
|
|
для: Trianon
(17.01.2009 в 18:45)
| | ладно может я не совсем правильно сказал, наверное нужно было написать вот так: незнание и использование проверки функцией get_magic_quotes_gpc() на включеность «магических» кавычках, может привести к плохим последствиям. | |
|
|
|
|
|
|
|
для: necroms
(18.01.2009 в 20:35)
| | опять не угадал)
правильно так:
некорректное использование функций РНР , в том числе и get_magic_quotes_gpc(), неизбежно приведёт к появлению (потенциальной) уязвимости скрипта. | |
|
|
|
|
|
|
|
для: necroms
(18.01.2009 в 20:35)
| | да не приведет вызов get_magic_quotes_gpc() никогда ни к чему плохому.
К плохому может привести лишний вызов stripslashes() | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2009 в 21:44)
| | Ай, давно я с вами не "спорил")) поехали....
Естественно сам по себе вызов этой функции ничего плохого с собой не принесёт, но вот некорректное применение результата возвращаемого этой функцией может привести к уязвимости скрипта. | |
|
|
|
|
|
|
|
для: Valick
(18.01.2009 в 22:22)
| | привести к уязвимости скрипта вполне может применение результата чего угодно, если это применение некорректное. | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2009 в 23:22)
| | угу, об этом я писал двумя постами выше) осталось обьяснить это автору топика) | |
|
|
|
|
|
|
|
для: necroms
(17.01.2009 в 18:40)
| | Так это просто плагиат!
Льюис Кэррол уже довольно давно описал именно эту ситуацию:
Если разом осушить бутылку с пометкой "яд", то рано или поздно, почти наверняка, почувствуешь легкое недомогание.
Так что читайте классиков - у них все это описано безо всяких иносказаний. | |
|
|
|
|
|
|
|
для: Loki
(17.01.2009 в 23:23)
| | к magic quotes это относится в полной мере :) | |
|
|
|
|
|
|
|
для: Николай2357
(15.01.2009 в 20:46)
| | Вот вот я где-то читал, что она работает только с GET,POST и COOKIE | |
|
|
|
|
|
|
|
для: necroms
(15.01.2009 в 17:11)
| | Значит код написан с логическими ошибками | |
|
|
|
|
|
|
|
для: 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();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Николай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
оно зачем? | |
|
|
|
|
|
|
|
для: 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
оно зачем?
Специально поставил, проверить ))) Мне всё кажется, что мускул перестанет отрабатывать таблицу после того, как найдет первую запись. | |
|
|
|