|
|
|
|
<?php
include("db.php");
if (!isset($_SERVER['PHP_AUTH_USER']))
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
else
{
$log = mysql_real_escape_string($_SERVER['PHP_AUTH_USER']);
$pasw = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
function OwnStripSlashes($pasw)
{
if(is_array($pasw))
$pasw = array_map('OwnStripSlashes', $pasw);
else
$pasw = stripslashes($pasw);
$pasw = htmlspecialchars ($pasw);
return $pasw;
}
if ( get_magic_quotes_gpc() )
{
$_GET = OwnStripSlashes($_GET);
$_POST = OwnStripSlashes($_POST);
$_COOKIE = OwnStripSlashes($_COOKIE);
$_SERVER = OwnStripSlashes($_SERVER);
}
// нужно ли тут это?
if ( !get_magic_quotes_gpc() )
{
$_SERVER['PHP_AUTH_USER'] = $log;
$_SERVER['PHP_AUTH_PW'] = $pasw;
}
$query = "SELECT * FROM adm_zone WHERE user='".$log."'";
$lst = mysql_query($query);
error_reporting (E_ALL ^ E_NOTICE);
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 ( $pass['pass'] != md5( md5($pass['salt1']).md5($pasw).md5($pass['salt2']) ) )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 19:20)
| | Ужас | |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 19:45)
| | Почему ужас?
Здесь http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=75291&page=4 советовали как раз то, что я и реализовал. | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 19:50)
| | >Советовали то что я здесь реализовал
Я вот сколько не смотрел, даже намека не увидел на то что вы здесь "реализовали"
Вы похоже не поняли чуток сути придирок там :) или очень бегло прочитали отзывы
Еще не надо под одну гребенку пихать GPC(get/post/coockie) и $_SERVER Это может создать некоторые проблемы при эксплуатации сайта | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 19:20)
| | Ну а нахрена делать серверную аутентификацию? Неужели простой формы не хватит?
Теперь критика:
1. Зачем else здесь?
<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
else
{
|
2. Вот это глаз вообще режет... Найди какой-нить класс для удобной работы с базой, а лучше фреймворк.
<?php
$log = mysql_real_escape_string($_SERVER['PHP_AUTH_USER']);
$pasw = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
function OwnStripSlashes($pasw)
{
if(is_array($pasw))
$pasw = array_map('OwnStripSlashes', $pasw);
else
$pasw = stripslashes($pasw);
$pasw = htmlspecialchars ($pasw);
return $pasw;
}
if ( get_magic_quotes_gpc() )
{
$_GET = OwnStripSlashes($_GET);
$_POST = OwnStripSlashes($_POST);
$_COOKIE = OwnStripSlashes($_COOKIE);
$_SERVER = OwnStripSlashes($_SERVER);
}
// нужно ли тут это?
if ( !get_magic_quotes_gpc() )
{
$_SERVER['PHP_AUTH_USER'] = $log;
$_SERVER['PHP_AUTH_PW'] = $pasw;
}
|
Да еще и с отступами намудрил... Я ничего не понял. Удали дримвивер или то чем пользуешься и поставь например PhpStorm, Eclipse или NetBeans.
3. Вот это уже не в первый раз вижу, нахрена спрашивается создавать переменную? Если сразу аргументом запрос писать, то не влезает в экран монитора что-ли?
<?php
$query = "SELECT * FROM adm_zone WHERE user='".$log."'";
$lst = mysql_query($query);
|
4. Ну яебал... Нахрена такую кашу строить? Уровень ошибок в таком уж случае выставь в самом начале кода.
<?php
error_reporting (E_ALL ^ E_NOTICE);
|
5. Соль в базе хранится вместе с паролем? Круто. Смысл тогда какой? В этой соли.
<?php
md5( md5($pass['salt1']).md5($pasw).md5($pass['salt2']) )
|
| |
|
|
|
|
|
|
|
для: nikita2206
(13.08.2010 в 20:03)
| | >Удали дримвивер
Ну это дело привычки. Мне дак он вполне нравиться. Только вот пользуюсь еще 3 версией :))))))))) Никак руки не доходят более современный поискать
Еще насчет п.3 .
В принципе это удобно когда может возникнуть какая-то проблема при проведении запроса к базе. Можно сразу же вывести сам запрос(он выделен в отдельной переменной) а ниже вывести ответ mysql и сразу наглядно найти свою ошибку в составлении запроса :)
и еще если уж используеться такой метод то тогда и экранирование лучше проводить сразу наместе что-то типа:
<?
$query = "SELECT * FROM adm_zone WHERE user='".mysql_real_escape_string($log)."'";
$result=mysql_query($query) or die(mysql_error());
|
| |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 20:07)
| | На все это ответ - п.2 | |
|
|
|
|
|
|
|
для: nikita2206
(13.08.2010 в 20:26)
| | >На все это ответ - п.2
Это вы про дремивер я так полагаю?
Но не дримивер тут далеко виноват поверьте. | |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 20:28)
| | Вот щас не понял. Это не про дримвивир, а про фреймворк... На это:
Еще насчет п.3 .
В принципе это удобно когда может возникнуть какая-то проблема при проведении запроса к базе. Можно сразу же вывести сам запрос(он выделен в отдельной переменной) а ниже вывести ответ mysql и сразу наглядно найти свою ошибку в составлении запроса :)
и еще если уж используеться такой метод то тогда и экранирование лучше проводить сразу наместе что-то типа:>>На все это ответ - п.2 | |
|
|
|
|
|
|
|
для: nikita2206
(13.08.2010 в 20:03)
| | Спасибо. Понял, что нужно все переделывать и покупать книги....
После первой строчки задумался, стоит ли держать аутентификацию или все же сделать проверку по имени пользователя. Как думаете?
Вот 3-й пункт вообще странный... В той теме (ссылка в начале) советовали результат в переменную занести, тут на оборот.
А 5-й пункт обидел даже. Нет конечно, в базе хэш храниться. | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 20:21)
| | > После первой строчки задумался, стоит ли держать аутентификацию или все же сделать проверку по имени пользователя. Как думаете?
Ваше дело. Но мало кто любит аутентификацию. По многим причинам, самое главное - интерфейс, который в большинстве случаев перехватывает фокус на себя, блокирует остальные вкладки в браузере(или нет? непомню).
> Вот 3-й пункт вообще странный...
Если не работает такой код:
<?php
$result = mysql_query('SELECT * FRO `table`');
|
Просто пишем так:
<?php
$result = mysql_query($sql = 'SELECT * FRO `table`');
|
По крайней мере кода меньше, но опять же - п.2 - фреймворк вам поможет в этом...
> А 5-й пункт обидел даже. Нет конечно, в базе хэш храниться.
Да, в базе, и там же почему-то соль. Может я чего-то не понимаю, но какая логика в этом? | |
|
|
|
|
|
|
|
для: nikita2206
(13.08.2010 в 20:35)
| | >Да, в базе, и там же почему-то соль. Может я чего-то не понимаю, но какая логика в этом?
А как надо? Хеш в одной таблице, а соль(-и) в других? В этом какая логика? Как надо?
И еще пользоваться этой темой можно пользоваться, что бы доступ а админке ограничить? В смысле там ошибок нет? | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 20:44)
| | >А как надо? Хеш в одной таблице, а соль(-и) в других? В этом какая логика? Как надо?
Ну как я понял это нужно чтобы защититься от взлома админки(точнее усложнить расшифровку пароля(подбор)) если у злоумышленика каким то образом оказался хеш пароля на руках, отсюда следует что соли хранить разумней всего в каком-нибудь файле(в виде переменной) или другой БД или что-то в этом роде, хотя я особенно в этом смысла не вижу, даже если получить хеш пароля, то подобрать его будет достаточно сложно, а если использовать цифры и буквы с разным регистром и другие спец символы, то подобрать такой пароль быдет практически невозможно
Вы не метайтесь от способа к способу а попробуйте переделать приведенный вами скрипт в порядок, тут вам уже указали на основные ошибки | |
|
|
|
|
|
|
|
для: nikita2206
(13.08.2010 в 20:03)
| | Можно немного пояснить, а то я не совсем доганяю.
1. Зачем else? Ведь идет проверка, было ли обращение к скрипту. Если нет, то exit, else идти дальше.
2. Что именно режет глаза? По-подробнее пожалуйста. Т.к. воспользоваться Фрейворком нет возможности ("знания").
Если в .htaccess вставить
php_flag magic_quotes_gpc Off
| , как писали в прошлой теме, можно этот код:
<?
function OwnStripSlashes($pasw)
{
if(is_array($pasw))
$pasw = array_map('OwnStripSlashes', $pasw);
else
$pasw = stripslashes($pasw);
$pasw = htmlspecialchars ($pasw);
return $pasw;
}
|
убрать?
Немного поправил код. надеюсь, не в худшею сторону.
<?php
include("db.php");
error_reporting (E_ALL ^ E_NOTICE);
if ( $_SERVER['PHP_AUTH_USER'] )
{
if ( !get_magic_quotes_gpc() )
{
$pasw = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
}
$query = "SELECT * FROM adm_zone WHERE user='".mysql_real_escape_string($_SERVER['PHP_AUTH_USER'])."'";
$lst = mysql_query($query);
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 ( $pass['pass'] != md5($pasw) )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
}
else
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
?>
|
| |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 21:50)
| | уже лучше :)
только вот этого не нужно:
<?
if ( !get_magic_quotes_gpc() ) // не пользуйтесь вы такой конструкцией а просто всегда отключайте магические кавычки
{
$pasw = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
}
// мы же не используем пароль для запроса к базе?
........
if ( mysql_num_rows($lst) == 0 ) // а если вернет 2 это разве правильно?
|
и еще вот что
действительно не надо делать тут if ( $_SERVER['PHP_AUTH_USER'] ) а затем еще else
просто сделайте так что если нету данного массива то пусть браузер выводит запрос на ввод логина и пароля а сервер завершает выполнение скипта | |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 22:07)
| | >мы же не используем пароль для запроса к базе?
Нет :).
Что еще можно дописать в коде, что бы он был "идеален"?
Еще такой вопрос, по самой защите.
У меня есть лишний домен, жить он будет еще около полугода. Посетителей 0, известности тоже 0. Т.е. заходить на него будут от силы 2 человека в месяц (и то по случайности). И этот домен лежит на том же сервере, что и основной (для которого админку делаю).
Так вот, вопрос: стоит ли эту админку перекинуть на тот домен? Что бы управлять БД с другого сайта.
1. Есть ли в этом смысл?
2. разумно ли это? | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 22:13)
| |
<?
$pass = mysql_fetch_array($lst); // лучше не _array,a _assoc
//и вот тут еще малец:
$lst = mysql_query($query); //диагностика ошибки не помешает:
$lst = mysql_query($query) or die(mysql_error());
|
и еще вместо этого:
<?
else
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
|
сделайте лучше так:
<?
//в самом начале кода заместо
if ( $_SERVER['PHP_AUTH_USER'] )
{
//сделайте следующее:
if ( !isset($_SERVER['PHP_AUTH_USER'] ))
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
|
>1. Есть ли в этом смысл?
>2. разумно ли это?
Ну я особого смысла не вижу, если уж так хотите админку скрыть дайте ей какое-нибудь экзотическое название :)
Жду конечного варианта :)
Конечно можно почистить $_SERVER в начале от магических кавычек, но все-таки лучшех их всегда отключать, слышал в php6 их вообще уберут | |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 22:20)
| | Все, все позаменял. Может что еще? :)
Имя я ей-то уже придумал, но опасения все-равно есть. Есть ли у вас какие-то соображение по этому поводу?
Собственно, конечный вариант группового строения админки готово:
<?php
include("db.php");
error_reporting (E_ALL ^ E_NOTICE);
if ( $_SERVER['PHP_AUTH_USER'] )
{
$pasw = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
$query = "SELECT * FROM adm_zone WHERE user='".mysql_real_escape_string($_SERVER['PHP_AUTH_USER'])."'";
$lst = mysql_query($query) or die(mysql_error());
if ( mysql_num_rows($lst) == 0 )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
$pass = mysql_fetch_assoc($lst);
if ( $pass['pass'] != md5($pasw) )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
}
if ( !$_SERVER['PHP_AUTH_USER'] )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
?>
|
| |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 22:27)
| | > но опасения все-равно есть.
Вы бы лучше опасались того что при каждом обращении к серверу ваш браузер в открытом виде передает пароль $_SERVER['PHP_AUTH_PW']); и это существенный недостаток basic-аутентификации, если так подумать то это большая опастность чем обнаружении админки | |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 22:30)
| | Варианты исправления есть? | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 22:32)
| | Другой способ защиты(но все равно хотя бы 1 раз вы будете отсылать свои данные серверу) или купить SSL(самый лучший вариант)
так ради интереса можете посмотреть:
НА рабочем столе: ПУСК->выполнить, там пишем cmd, нажимаем ентер и печатаем tracert yourdomain.ru нажимаем ентер и смотрим сколько потенциальных сниферов :)
(это чтобы усилить вашу параною) | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 22:32)
| | Вообщем не парьтесь сильно, вам еще далеко до создания более менее приемлемых проектов
советую посмотреть: http://www.softtime.ru/info/apache.php?id_article=27
удобная вещь особенно когда в админке много файлов, и куда нибудь но забудешь подключить файл lock(у меня такое было) а тут кинул файлик .htaccess в папку админки и живешь хорошо :) | |
|
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 22:27)
| | ОПять косяк
<?
if ( !$_SERVER['PHP_AUTH_USER'] )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
//в самое начало и лучше так:
if ( !isset($_SERVER['PHP_AUTH_USER'] ))
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
|
а это вообще уберите:
if ( $_SERVER['PHP_AUTH_USER'] )
{
|
и уберите эту строку!!!!:
<?
$pasw = mysql_real_escape_string($_SERVER['PHP_AUTH_PW']);
|
И такой код рассчитан что на сервере выключены МАГИЧЕСКИЕ КАВЫЧКИ(покрайней мере те что работают с $_SERVER(Не помню точно по этому поводу)) | |
|
|
|
|
|
|
|
для: tvv123456
(13.08.2010 в 22:35)
| | А чем отличается от ? | |
|
|
|
|
|
|
|
для: lElectroHardl
(14.08.2010 в 14:20)
| | Ошибкой уровня Notice | |
|
|
|
|
|
|
|
для: lElectroHardl
(13.08.2010 в 19:20)
| | Всем спасибо за помощь!
Вот результат собственно:
<?php
include("db.php");
error_reporting (E_ALL ^ E_NOTICE);
$query = "SELECT * FROM adm_zone WHERE user='".($_SERVER['PHP_AUTH_USER'])."'";
$lst = mysql_query($query) or die(mysql_error());
if ( mysql_num_rows($lst) == 0 )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
$pass = mysql_fetch_assoc($lst);
if ( $pass['pass'] != md5($_SERVER['PHP_AUTH_PW']) )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
if ( !isset($_SERVER['PHP_AUTH_USER']) )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
|
| |
|
|
|
|
|
|
|
для: lElectroHardl
(14.08.2010 в 14:18)
| | Да вы видать через строчку читаете
Я насчет этого блока:
if ( !isset($_SERVER['PHP_AUTH_USER']) )
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
exit();
}
|
Его нужно в самое начало, иначе от него смысла 0
И зря вы из этой вот(именно этой строки!!!
$query = "SELECT * FROM adm_zone WHERE user='".($_SERVER['PHP_AUTH_USER'])."'";
|
убрали mysql_real_escape_string(),
из вышесказанного вывод-> вы вообще не понимаете(даже приблизительно) как работает этот скрипт и для чего нужен тот или иной его элемент, а следовательно рано еще заниматься сайтом, самое время заняться самообразованием | |
|
|
|
|
|
|
|
для: lElectroHardl
(14.08.2010 в 14:18)
| | Сама логика скрипта путанная, говорит, что вы не совсем понимаете, что в нем делается. Я бы делала так(показываю схематически, т.к. так быстрее):
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
// пользователь неизвестен
header("WWW-Authenticate: Basic realm=\"My Realm\"");
header("HTTP/1.0 401 Unauthorized");
exit;
} else {
//пользователь($_SERVER['PHP_AUTH_USER') есть, надо проверить, есть ли запись про него в базе
//ваш запрос
if (mysql_num_rows($lst) == 0)
// пользователя с таким именем нет в БД, отклик 401
Header("WWW-Authenticate: Basic realm="Admin Center"");
Header("HTTP/1.0 401 Unauthorized");
exit();
}else{
// пользователь с таким именем есть в БД, надо проверить совпадают ли пароли
$pass = mysql_fetch_assoc($lst);
if ( $pass['pass'] != md5($_SERVER['PHP_AUTH_PW']) ){
//пароли не совпали - отклик 401
}
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(14.08.2010 в 16:17)
| | Вообще-то у меня такая же структура скрипта. Почему вы считаете ее путаной, если написали в точности такой же скрипт (за исключением запроса к базе)? | |
|
|
|
|
|
|
|
для: lElectroHardl
(14.08.2010 в 17:01)
| | Я говорила по коду от (14.08.2010 в 14:18) - как я поняла, улучшенному и дополненному. Все, что выше, я почти не смотрела. Сравните еще раз внимательно свое и мое. Вы, не зная, есть ли у вас пользователь или нет, начинаете с запроса к базе - это по вашему одно и то же? | |
|
|
|
|
|
|
|
для: Лена
(14.08.2010 в 17:06)
| | Я это исправил уже, спасибо. | |
|
|
|
|
|
|
|
для: Лена
(14.08.2010 в 17:06)
| | Можно же еще проще... Одним запросом все решить раз и на всегда. Лень переписывать, вот тут есть. | |
|
|
|
|
|
|
|
для: Николай2357
(15.08.2010 в 15:00)
| | Можно и так. А можно вообще совместить все в 1. | |
|
|
|
|
|
|
|
для: Лена
(14.08.2010 в 16:17)
| | Извиняюсь что снова поднимаю тему, но впредь кто прочитает эту тему:
вот такой конец :
Это не очень хорошо.
По логике: на кой черт вам вся эта уйма else?
........................
<?
if (mysql_num_rows($lst) == 0)
// пользователя с таким именем нет в БД, отклик 401
Header("WWW-Authenticate: Basic realm="Admin Center"");
Header("HTTP/1.0 401 Unauthorized");
exit();
}else // на кой черт оно тут ? если в итоге выполниться условие, то скрипт итак остановиться,
//на кой черт тут(и не только тут это else?
|
| |
|
|
|