|
|
|
| Подскажите, как лучше всего организовывать админку? | |
|
|
|
|
|
|
|
для: Ванек2010
(31.07.2010 в 23:09)
| | Что вы ожидаете увидеть в ответ? | |
|
|
|
|
|
|
|
для: Ванек2010
(31.07.2010 в 23:09)
| | Почему бы рядом с кнопкой ответить, в зависимости от полномочий конечно, не поставить кнопки редактировать/удалить/переименовать/и т.д.? Тогда и организовывать почти ничего не надо, разве что полномочия. | |
|
|
|
|
|
|
|
для: Рома
(01.08.2010 в 00:44)
| | Ага, а двойной щелчок на контентной области открывает глобальные настройки типа доступов к бд и кол-ва записей на страницу :) | |
|
|
|
|
|
|
|
для: neadekvat
(01.08.2010 в 01:44)
| | Например, что скажите на счет этого скрипта авторизации? Я его чуток доделал, с md5 и логирование, кто зашел, кто пытается зайти и т.д.
<?php
if (!isset($_SERVER['PHP_AUTH_USER']))
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
table_error("Вход в Админ-Панель"); // Логирование
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']);
$password = md5("$_SERVER[PHP_AUTH_PW]");
}
$query = "SELECT password FROM admins_m WHERE login='".$_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");
table_error("Не верный логин или пароль"); // Логирование
exit();
}
$pass = @mysql_fetch_array($lst);
if ($password != $pass['password'])
{
Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
Header ("HTTP/1.0 401 Unauthorized");
table_error("Не верный логин или пароль"); // Логирование
exit();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Ванек2010
(02.08.2010 в 10:01)
| | 1.
> Я его чуток доделал
То есть не вы это писали?
Выкиньте и пишите с нуля.
2.
> if (!get_magic_quotes_gpc())
Раньше я делал также. Вы не представляете, насколько облегчается жизнь, когда не надо вспоминать об это фигне.
В .htaccess выставьте
php_flag magic_quotes_gpc Off
|
И на случай, если .htaccess не поддерживается, сначала (например, у меня это файл, который подключается в начале каждого скрипта) обрабатывайте данные подобным образом:
<?php
function OwnStripSlashes($data)
{
if(is_array($data))
$data = array_map('OwnStripSlashes', $data);
else
$data = stripslashes($data);
return $data;
}
if (get_magic_quotes_gpc()) {
$_GET = OwnStripSlashes($_GET);
$_POST = OwnStripSlashes($_POST);
$_COOKIE = OwnStripSlashes($_COOKIE);
}
|
3.
> mysql_escape_string
Эта функция помечена как устаревшая и будет удалена в следующей версии PHP, используйте mysql_real_escape_string
4.
> $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
В суперглобальных массивах желательно хранить исходные данные, чтобы далее всегда можно было к ним обратиться, а для обработанных данных создавать новую переменную.
5.
Грубейшая ошибка, вы экранируете пароль, а потом хэшируеете его. Но ведь хэш вычисляется уже не от пароля, а от пароля, в котором экранированы символы. Экранировать пароль не нужно.
<?php
$_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
$password = md5("$_SERVER[PHP_AUTH_PW]");
|
6.
> @mysql_query
Зачем здесь и далее по скрипту подавление ошибок?
Вы знаете, когда mysql_query или mysql_fetch_array начинают сами по себе выводить на экран ошибки? Когда есть ошибки в синтаксисе или когда во вторую функцию подставлен не ресурс, указывающий на ответ бд.
Поэтом убирайте все эти собачки, выставляйте уровень ошибок E_ALL, откатывайте скрипт так, чтобы никаких нотайсов даже не было. А на рабочем проекте ставьте уровень ошибок в 0.
7.
Для интерпритатора что !$var, что $var == 0 - это одно и то же. Поэтому вы, фактически, два раза одно и то же проверяете. Один блок лишний.
<?php
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");
table_error("Не верный логин или пароль"); // Логирование
exit();
}
|
8.
> mysql_fetch_array
Используйте лучше mysql_fetch_assoc, ибо первая функция возвращает на один ненужный массив больше.
Кстати говоря, чтобы вернуть один столбец, есть функция mysql_result:
<?php
$pass = mysql_result($lst, 0);
if ($password != $pass)
|
Однако, помню, на каком-то форуме сильно протестовали против ее использования..так что выбор за вами.
9.
С именованием переменных у вас проблемы.
Для запросов, например, принято использовать $query или $result - так просто проще ориентироваться в чужом коде. Сравнение двух паролей, тем более, если использовать приведенный мной вариант, вообще может вызвать когнитивный диссонанс.
Вот такие дела, если в двух словах. | |
|
|
|
|
|
|
|
для: neadekvat
(02.08.2010 в 10:23)
| | Ух, спасибо за такую информацию | |
|
|
|
|
|
|
|
для: neadekvat
(02.08.2010 в 10:23)
| | Реализация вот этой функции очень понравилась:
<?php
function OwnStripSlashes($data)
{
if(is_array($data))
$data = array_map('OwnStripSlashes', $data);
else
$data = stripslashes($data);
return $data;
}
if (get_magic_quotes_gpc()) {
$_GET = OwnStripSlashes($_GET);
$_POST = OwnStripSlashes($_POST);
$_COOKIE = OwnStripSlashes($_COOKIE);
}
|
У меня тоже во всех скриптах подлючается подобная, но не такая изящная. | |
|
|
|
|
|
|
|
для: Ирбис
(02.08.2010 в 11:55)
| | Этот принцип есть в открытом доступе, я тут ничего не придумал :) | |
|
|
|
|
|
|
|
для: neadekvat
(02.08.2010 в 13:46)
| | Но зато открыли для меня такую полезную функцию. Возьму на вооружение. Спасибо! | |
|
|
|
|
|
|
|
для: neadekvat
(02.08.2010 в 10:23)
| | Не согласен вот с этим пунктом:
7.
Для интерпритатора что !$var, что $var == 0 - это одно и то же. Поэтому вы, фактически, два
раза одно и то же проверяете. Один блок лишний.
<?php
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");
table_error("Не верный логин или пароль"); // Логирование
exit();
}
|
В первом случае проверяеться прошел ли запрос к базе и если он прошел но вернул 0 строк то $lst все равно примет значение истины, а вот mysql_num_rows($lst - позволяет подсчитать сколько именно строк пришло с запросом. | |
|
|
|
|
|
|
|
для: tvv123456
(02.08.2010 в 18:33)
| | Да, точно, !$lst сработает только в случаи какой-то ошибки, а не пустого результата.
Спасибо, что поправили. | |
|
|
|
|
|
|
|
для: Ванек2010
(02.08.2010 в 10:01)
| | А у вас очень серьезная дыра в коде:
<?
if (!get_magic_quotes_gpc()) {
$_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
...........................
|
_gpc это абривиатура от GET/POST/COOKIE, и сюда как видите не входит $_SERVER. следовательно когда включены магические кавычки не факт что будет обрабатываться $_SERVER, а следовательно дырка | |
|
|
|
|
|
|
|
для: neadekvat
(01.08.2010 в 01:44)
| | Это вы к чему? | |
|
|
|