Оценка кода скрипта...

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 надо бы использовать.
Тогда и я не просветлен smile

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