Оценка кода скрипта...
1.
Абдула (28.04.2013 / 11:47)
Всем привет. Вот уже где то неделя прошла, с тех пор как я начал писать на php. Собственно решил написать небольшую админку, других идей для начала не было. Впрочем о скрипте (если так можно сказать о нем ). Есть админка через которую можно создавать страницы и разделы сайта. Ну и естественно эти разделы и страницы выводятся на сайте. Скрипт прикрепляю. Оценивать грубо говоря нечего наверное, ведь за неделя изучения php, что можно написать. Собственно жду от вас критики, что и как лучше сделать, что как выводить. И сразу же такие вопросы.
1. Реализация админки такова. Вы переходите по адресу site.ru/admin.php, вводите там код, если он совпал с тем, что в базе, то для вас открывается сессия, если нет, то вас посылают. И дальше на страницах админки просто проверяется открыта ли сессия. Вопрос: Можно ли так сделать. Или надо как то по другому сделать.
Установка: Пишите данные от базы в файле config.php, переходите по адресу Site.ru/install.php, вводите код который будет стоять на входе в админку, нажимаете ок. Если все прошло успешно, удаляете файл install.php.
2.
iNeeXT (28.04.2013 / 13:02)
Итак.
1. Не храни конфиг доступным из веба. Поставь запрет на его просмотр через .htaccess. Запомни - системные файлы нужно держать в закрытой папке.
2. Прочитай мануалы по составлению SQL-запросов. Те, что в install.php неправильные. Во-первых на большинстве серверов стоит MySQL версии > 5.5, поэтому нужно использовать
ENGINE, а не
TYPE. Во-вторых AUTO_INCREMENT можно использовать когда есть PRIMARY KEY.
3. Используй функцию
mysql_result вместо
mysql_num_rows.
4. Проверка в админке не пойдет. Сам подумай, если хакер узнает название сессии auth, то он сможет подставить в неё любое значение и будет авторизован.
5. В файле page.php выводи шапку после проверки на существование записи, ибо:
Warning: mysql_result() expects parameter 1 to be resource, boolean given in ***********\tests\head.php on line 4
// http://tests/page.php?id=
6. При создании/редактировании учитывай пробелы функцией
trim.
3.
Абдула (28.04.2013 / 13:12)
2.
iNeeXT,
Во-вторых AUTO_INCREMENT можно использовать когда есть PRIMARY KEY. Вот это не очень понял, что ты хотел сказать.
На счет авторизации. Так надо каждый раз сверить содержимое $_SESSION[auth] с тем что есть в базе? Я правильно понял?
P.S. Спасибо...
4.
iNeeXT (28.04.2013 / 13:17)
3.
LN Donokate,
вот здесь пояснение. Если в твоей таблице нету уникального ключа (PRIMARY KEY), то использование AI приведет к ошибке.
Чтобы не создавать "груз" на мускул вообще не нужно хранить пароль в таблице (если не предусмотрено паблишеров или др. админов), а так верно - нужно все время проверять пароль.
Добавлено через 03:11 сек.
А так не плохо, все таки только начал писать на PHP.
5.
Абдула (28.04.2013 / 13:21)
4.
iNeeXT, `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY? что тут исправить? че то никак не могу въехать в то, что ты говоришь
и еще. пароль хранить в файле?
6.
iNeeXT (28.04.2013 / 13:28)
LN Donokate (28 Апреля 2013 / 11:21)
4. iNeeXT, `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY? что тут исправить? че то никак не могу въехать в то, что ты говоришь
и еще. пароль хранить в файле?
Там все правильно, вот:
<?php
$query = array("CREATE TABLE `admin` (
`pass` VARCHAR(128) NOT NULL
) TYPE = MyISAM AUTO_INCREMENT=1;",
AUTO_INCREMENT=1 не нужно.
Да, можно хранить его в переменной.
7.
Абдула (28.04.2013 / 13:29)
6.
iNeeXT, Спасибо. Все понял .
8.
iNeeXT (28.04.2013 / 13:33)
ZiGR (28 Апреля 2013 / 11:30)
2. iNeeXT, mysql_result уже давно устарела, mysql_fetch_row надо бы использовать.
Тогда и я не просветлен
9.
Абдула (28.04.2013 / 13:36)
8.
ZiGR, $name = mysql_fetch_row($result);
echo $name[1]; ???
думал так легче
$name = mysql_result($result, 0, 'name');
ну или так
$name = mysql_result($result, 0, '2');
или так
$result = mysql_query("SELECT `name` FROM `page` WHERE `id` = $_REQUEST['id']");
$name = mysql_result($result, 0); Вроде не ошибся
10.
Абдула (28.04.2013 / 13:49)
11.
ZiGR, Спс. Учту.
11.
Михаил (28.04.2013 / 15:19)
iNeeXT (28 Апреля 2013 / 13:02)
3. Используй функцию mysql_result вместо mysql_num_rows.
Почему?
12.
iNeeXT (28.04.2013 / 15:33)
Flyd (28 Апреля 2013 / 13:19)
Почему?
Быстрее как-бы.
13.
юЮЮфюв (28.04.2013 / 15:41)
14, Никогда вот не понимал этой "мании" скорости выполнения, когда речь идет о ничтожных долях секунды. Никто разницы и не заметит, если скрипт будет выполняться на 2 мс. медленней. Другое дело, если бы разница была в 1-2 секунды. Это сугубо моё мнение, я никому ничего не навязываю - просто не удержался.
14.
iNeeXT (28.04.2013 / 16:27)
15.
DanteS, я же не говорил о простых операциях, верно?
15.
Абдула (28.04.2013 / 16:32)
<?
function is_auth(){
$pass = mysql_fetch_row(mysql_query('SELECT `pass` FROM `admin`'));
if(!isset($_SESSION['auth']) || $_SESSION['auth']!=$pass[0]){
header('Location: '.MYSITE);
}}
?>
Написал такую функцию для проверки авторизации. Функция работает.
Вопрос: Нужно ли еще какие нибудь проверки сделать?
16.
юЮЮфюв (28.04.2013 / 16:51)
17, я бы сначала проверял наличие COOKIES, и только потом (если они есть) проверял бы их достоверность, сверяя с данными в базе. Это чтобы не теребить базу лишний раз.
17.
Абдула (28.04.2013 / 17:41)
18.
DanteS, Ок. Понял. Спасибо. Учту.
Переписал.
<?
function is_auth(){
if(isset($_SESSION['auth'])){
$pass = mysql_fetch_row(mysql_query('SELECT `pass` FROM `admin`'));
if($_SESSION['auth']!=$pass[0]){
header('Location: '.MYSITE);
}
} else header('Location: '.MYSITE);
}
?>
18.
Eyler (28.04.2013 / 18:01)
Вариативно можно хранить пароль в json файле(естественно что в директории с deny from all). Чтение, а в твоем случае "дергание" пароля лучше переложить на что-то иное от БД. И да, вопрос безопасности хранения 1 к 1 в случае с БД, так как если пользователь получит доступ к файлам, то он также сможет прочитать и конфиги коннекта к БД и прочитать пароль оттуда.
19.
iNeeXT (29.04.2013 / 01:39)
Если все же хочешь хранить пароли в БД, то делай кэширование.
URL:
https://visavi.net/topics/37674