101

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

А где этот журнал обычно находиться?

Если есть панель управления сайтом, то там должен быть доступ к журналам.

102

Re: PHP код для небольшой админки. Ошибка.

А не посоветуете, аутентификацию как делать? Нашел пару примеров http://www.php.ru/manual/ru/features.http-auth.html, но тут что-то про апач написано, и http://deathcoder.ru/index.php?articles=view&id=51 Мне бы надо такой код, чтоб он на любом сервере работал. (а то опять будет такая же фигня, как и с отправкой почты). Насколько я понял, оба этих примера защищают только 1 страницу?

103

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Мне бы надо такой код, чтоб он на любом сервере работал.

Оба варианта должны вас устроить.

Ketsyki сказал:

Насколько я понял, оба этих примера защищают только 1 страницу?

Они защищают все файлы в которых подключены.

104 (изменено: Ketsyki, 2011-04-25 20:51:33)

Re: PHP код для небольшой админки. Ошибка.

Блин. Кучу примеров посмотрел. Они либо только для апача, либо я не понимаю, что там написано.
Вот подобрал боле-менее понятный пример:
index.php

<?php 
session_start();
if (isset($_COOKIE['adm_log']) && isset ($_COOKIE['adm_pass'])) {
 if (($_COOKIE['adm_log']=="a") && ($_COOKIE['adm_pass']=="a")) {
  echo "Привет, админ!";
 } 
} else {
echo 'Привет, гость! Залогинься - <a href="login.php">тут</a>';
}
?>

login.php

<?php session_start(); ?>
<html>
<form action="login.php" method="post">
Ваше имя: <input type="text" name="login"><br>
Ваш пароль: <input type="password" name="pass"><br>
<input type="submit" name="go" value="Enter!">
</form>
</html>
<?php
if ($_POST['go']){
 if (($_POST['login']=="q") &&($_POST['pass']=="q")){
setcookie("adm_log",$_POST['login'],time()+3600,"/");
setcookie("adm_pass",$_POST['pass'],time()+3600,"/");
 header("Location: index.php"); 
 }
}
?>

При вводе неверного логина или пароля ничего не происходит (как и должно быть). При вводе верного логина и пароля появляется вот что:
Warning: Cannot modify header information - headers already sent by (output started at C:\Serv\xampp\htdocs\mysite\auth\login.php:9) in C:\Serv\xampp\htdocs\mysite\auth\login.php on line 12

Warning: Cannot modify header information - headers already sent by (output started at C:\Serv\xampp\htdocs\mysite\auth\login.php:9) in C:\Serv\xampp\htdocs\mysite\auth\login.php on line 13

Warning: Cannot modify header information - headers already sent by (output started at C:\Serv\xampp\htdocs\mysite\auth\login.php:9) in C:\Serv\xampp\htdocs\mysite\auth\login.php on line 14

105

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

headers already sent

Функция setcookie() должна выполняться до вывода HTML кода.

106 (изменено: Ketsyki, 2011-04-26 21:21:03)

Re: PHP код для небольшой админки. Ошибка.

Все. Заработало.
Вот, допустим, есть у меня кроме этих страниц index и login еще страница main. Как сделать, чтоб при попытке зайти на страницу main не авторизовавшись, открывалась бы страница для ввода логина и пароля?
Переписывать этот код:

<?php 
session_start();
if (isset($_COOKIE['adm_log']) && isset ($_COOKIE['adm_pass'])) {
 if (($_COOKIE['adm_log']=="a") && ($_COOKIE['adm_pass']=="a")) {
  echo "Привет, админ!";// Если впихивать этот код на каждую страницу, то придется вместо этой строки писать весь остальной код.
 } 
} else {
echo 'Привет, гость! Залогинься - <a href="login.php">тут</a>';
}
?>

нет желания. Может есть другой способ?

107

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

чтоб при попытке зайти на страницу main не авторизовавшись, открывалась бы страница для ввода логина и пароля

Если проверку не проходит, то перенаправляйте строкой:

header("Location: login.php");

108

Re: PHP код для небольшой админки. Ошибка.

Т.е. этот код все равно надо писать?
session_start();
if (isset($_COOKIE['adm_log']) && isset ($_COOKIE['adm_pass'])) {
if (($_COOKIE['adm_log']=="a") && ($_COOKIE['adm_pass']=="a")) {
  Тут код страницы;
}
} else {
header("Location: login.php");
}

Типа такого?

109

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Типа такого?

Можно так. Вы хоть пробуйте, я же не отладчик, для этого инструменты есть.

110 (изменено: Ketsyki, 2011-04-26 23:02:05)

Re: PHP код для небольшой админки. Ошибка.

Сейчас нет возможности проверить. У меня сервер на ноуте, а я обычно, пишу код, подключаясь с компа к ноуту. А щас с подключением проблемы smile

Так-то это работать должно, но у меня в коде кроме php еще и много html. А переписывать html в echo '<тут html код>' немного лениво. smile

Вот допустим, у меня такая структура:
<?php
?>
<html>
</html>
<?php
?>
...
<?php
?>
В самом начале я написал
session_start();
if (isset($_COOKIE['adm_log']) && isset ($_COOKIE['adm_pass'])) {
if (($_COOKIE['adm_log']=="a") && ($_COOKIE['adm_pass']=="a")) {
  Тут код страницы;

А
}
} else {
header("Location: login.php");
}
Где писать? По идее это должно быть в конце кода, но у меня там html и код как бы разрывается...

111

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Где писать?

Пусть разрывается. Если так не нравится, то попробуйте как-нибудь иначе придумать.

112

Re: PHP код для небольшой админки. Ошибка.

О. Вроде бы все написал smile И даже все работает smile

Осталось только всякие мелочи исправить, чтоб удобнее было пользоваться админкой.
Спс вам огромное smile

113 (изменено: Ketsyki, 2011-05-04 19:56:14)

Re: PHP код для небольшой админки. Ошибка.

Здравствуйте. Маленькая проблемка.

<?php session_start();
//Коннектися к бд
$hostname = "localhost"; 
$username = "myusername"; 
$password = "mypassword";

mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); 
mysql_query('SET NAMES cp1251');
/* выбрать базу данных. Если произойдет ошибка - вывести ее */ 
mysql_select_db(baza) or die(mysql_error());  

$login = 'admin';
$query = "SELECT `password` FROM `users` WHERE `login` = '$login'";
$result = mysql_query($query); 
$row = mysql_fetch_assoc($result); 
$password = $row['password']; //Выбираем password ил БД

mysql_close(); 
//Вводим случайные переменные и находим их сумму
$a=rand(1,20);
$b=rand(1,20);
$sum=$a+$b;
//Если пароль, логин и сумма цифр совапил, то отправляем логин и пароль в кукисы и переходим на главную страницу
 if (($_POST['login']=="admin") &&($_POST['pass']==$password) &&($_POST['sum']==$sum)){
setcookie("adm_log",$_POST['login'],time()+3600,"/");
setcookie("adm_pass",$_POST['pass'],time()+3600,"/");
 header("Location: index.php"); 
 }


 ?>
<html>
//Создаем форму
<form action="login.php" method="post">
Ваше имя: <input type="text" name="login"><br>
Ваш пароль: <input type="password" name="pass"><br>
Введите сумму чисел: <?php echo "<b>"; echo $a; echo "+"; echo $b; echo"</b>";?>
<input type="text" name="sum"><br>
<input type="submit" name="go" value="Enter!">
</form>
</html>

Почему-то, даже если ввожу все правильно, то не могу пройти проверку sad  Если удалить проверку суммы чисел и все, что с ними связано, то все нормально...

114

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Если удалить проверку суммы чисел и все, что с ними связано, то все нормально

Я не понял зачем вы эту проверку сделали, учитывая, что работать она никак не может, ведь при каждом запуске скрипта значения функции rand() будут разные.

115 (изменено: Ketsyki, 2011-05-04 21:25:39)

Re: PHP код для небольшой админки. Ошибка.

Ну, это вместо капчи. Что б брутфорсом было труднее взломать

116

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

Ну, это вместо капчи. Что б брутфорсом было труднее взломать

Это лишнее. Авторизация делается обычно несколько иным образом, через необращаемую кодировку пароля функцией хеширования.

В БД пишем не сам пароль, а его хеш. MD5 хеш - это строка из 32 символов, которая генерируется из любой строки.
$password = md5('пароль');

При сверке паролей, необходимо сравнивать их хеш, то есть хеш из БД и хеш из полученной строки пароля.
if ( $_POST['login'] == "admin" && md5($_POST['pass']) == $password ) {

В кукисы тоже отправляем хеш, а не читаемый пароль.

А от подбора пароля методом перебора есть только один действенный способ блокировки - это таймер на авторизацию. При таймере в 10 секунд, в течении которых пользователю с одного IP нельзя авторизоваться снова, метод перебора не работает абсолютно никак, потому что продлится тысячи лет. Так что лучше продумайте такой механизм защиты для своей авторизации.

117

Re: PHP код для небольшой админки. Ошибка.

А в чем смысл этого хэша? Это что-то типа кодирования? Какая разница. что будет - пароль или хеш? У меня только 1 учетная запись. Я с таким же успехом могу создать 32-значный пароль.

118

Re: PHP код для небольшой админки. Ошибка.

Ketsyki сказал:

А в чем смысл этого хэша?

Перехват хеша не означает перехвата пароля. При одной учетной записи, это, конечно, не столь существенно.