форум общения русскоязычных пользователей CMS Текстпаттерн
Вы не зашли.
Проблемма в следующем.
Сейчас допиливаю плагин до ума. Всё довольно интуитивно понятно, медленно но движется.
Но столкнулся с вопросом на котором уже стаю довольно долго.
из формы посылается пароль для подтверждения прав, и что дальше?
Если вызвать пароль из базы, то он будет в зашифрованном виде, и совсем не похож на тот пароль который должен быть ))))
Насколько я понял пароль шифруется
password(lower('$переменная'))
- это односторонне шифрование.
И как быть?
Прошу прощение если вопрос показался идиотским. В пхп почти ноль, а допиливать приходиться, и к сожалению самому.
Заранее спасибо.
Неактивен
Жаль что вопрос не получил ответа, так как у меня есть тоже вопрос про пароли. Каким методом происходит шифрование паролей в Textpattern`е?
В вашем вопросе можно посоветовать только "зашифровать" таким же методом отосланный пароль и сравнить с уже имеющимся, если там в нем нет временной метки
Неактивен
А в дистрибутиве Textpattern, в папке textpattern/lib/ есть файлик PasswordHash.php. Может он волшебный, точно волшебный - там есть класс PasswordHash и в нем функция function CheckPassword.
Отредактированно Redduck (26-08-2011 14:52:33)
Неактивен
Redduck написал:
А в дистрибутиве Textpattern, в папке textpattern/lib/ есть файлик PasswordHash.php. Может он волшебный, точно волшебный - там есть класс PasswordHash и в нем функция function CheckPassword.
Расскажите как этим пользоваться. Я в PHP только новичок и с классами не работал.
Я пытался подключить этот php-файл с помощью include_once и просто воспользоваться функцией CheckPassword($password, $hashpassword), но ошибка в доступе:
Warning: include_once(/textpattern/lib/PasswordHash.php) [function.include-once]: failed to open stream: No such file or directory in /home/aqq9346/public_html/site.ru/where_money.php on line 27 Warning: include_once() [function.include]: Failed opening '/textpattern/lib/PasswordHash.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/aqq9346/public_html/site.ru/where_money.php on line 27 Fatal error: Call to undefined function checkpassword() in /home/aqq9346/public_html/site.ru/where_money.php on line 29
Неактивен
Да видно что не подключился файл. Возможно его можно использовать только в коде плагина.
include_once '/textpattern/include/txp_auth.php';
static $phpass = NULL;
if (!$phpass) {
$phpass = new PasswordHash(PASSWORD_COMPLEXITY, PASSWORD_PORTABILITY);
}
$hash = $phpass->HashPassword("пароль");
Хотя в txp_auth.php уже есть функция function txp_hash_password($password)
Или наверно я ошибся
Нашел небольшую ошибочку! Эти файлы есть в версии textpattern 4.4.1, а в 4.2.0 нет!!!
в 4.4.1 сработало
<txp:php>
global $txpcfg;
include_once '/textpattern/lib/PasswordHash.php';
static $phpass = NULL;
if (!$phpass) {
$phpass = new PasswordHash(8, TRUE);
}
$hash = $phpass->HashPassword("пароль");
echo $hash;
</txp:php>
в 4.2.0 используется функция password мускула! (mysql)
соответственно код надо поменять. Исходя из этого плагин ign_password_protect 0.5b9 при обновлении отвалится!
Если не получится написать самому, пишите, поможем.
Отредактированно Redduck (27-08-2011 21:13:40)
Неактивен
У меня используется именно 4.4.1 и Ваш код у меня заработал, но результат отличается от того, что находится в базе.
Как все же сравнить пароль введенный пользователем и пароль сохраненный в базе TXP или в альтернативной базе плагина ign_password_protect.
И еще вопрос: плагин ign_password_protect использует sha1 или какой-то отличный?
Отредактированно itshaman (27-08-2011 22:04:16)
Неактивен
Раньше txp полагался на встроенную в mysql функцию password. Теперь, как заметил Redduck, пароль шифруется специальной библиотекой. В новых версиях должен сработать код, предложенный выше.
Неактивен
<txp:php>
include_once 'textpattern/lib/PasswordHash.php';
static $phpass = NULL;
if (!$phpass) {
$phpass = new PasswordHash(8, TRUE);
}
$hash = $phpass->HashPassword("пароль");
if($phpass->CheckPassword("пароль", $hash)) { echo 'Yes, good password!'; }
else { echo 'Ай-Ай';}
</txp:php>
А хеш постоянно меняется!
Проверил код рабочий!
И еще вопрос: плагин ign_password_protect использует sha1 или какой-то отличный?
Использует стандартный password мускула.
На счет отвалится беру свои слова обратно!!! Люди делающие textpattern многое предусмотрели!
Отредактированно Redduck (28-08-2011 13:23:22)
Неактивен
Redduck написал:
А хеш постоянно меняется!
Проверил код рабочий!
А есть ли возможность сравнить два хеша одного и того же пароля?
Неактивен
itshaman написал:
А есть ли возможность сравнить два хеша одного и того же пароля?
То есть, пароль неизвестен!? И Вам надо его подобрать
Нет, сравнивать два хеша бесполезно, или должна быть соль одинаковой, тогда можно. Теперь возникает вопрос как посмотреть какая соль у первого хеша. Наверно, надо посмотреть внимательно код PasswordHash.php.
Неактивен
Мне не подобрать его надо, а аутентифицировать пользователя. Есть html-форма, результаты которой вносятся в базу дынных. Чтобы отсечь возможность кому попало это делать я хотел отсылать вместе со всеми параметрами пароль пользователя, который в последствии как-то должен быть сравнен с тем, что находится в базе данных.
Может есть другие методы? Я только начинаю постигать PHP.
И еще вопрос: есть два плагина ign_password_protect и mem_self_register. Если зарегистрировать пользователя плагином mem_self_register, то аутентифицироваться с помощью плагина ign_password_protect не получится. Я так понимаю это все из-за разных методов хэширования пароля? Так ли это? И есть ли какой-то простой способ поправить это?
Неактивен
Оказывается есть ign_password_protect 0.6.2, где все привели в норму. Зарегистрированный пользователь в mem_self_register нормально работает в ign_password_protect
Отредактированно itshaman (28-08-2011 20:57:01)
Неактивен
Redduck написал:
Надеюсь всЁ, свои задачи ты решил
Не все. ))
Хотелось бы понять как можно аутентифицировать пользователя кроме как по паролю, если сравнвать пароли нельзя.
Вы случайно не в курсе как происходит аутентификация при заходе в админ-панель??
Неактивен
itshaman написал:
Не все. ))
Хотелось бы понять как можно аутентифицировать пользователя кроме как по паролю, если сравнвать пароли нельзя.
Вы случайно не в курсе как происходит аутентификация при заходе в админ-панель??
<txp:php>
include_once 'textpattern/lib/PasswordHash.php';
static $phpass = NULL;
if (!$phpass) {
$phpass = new PasswordHash(8, TRUE);
}
$hash = $phpass->HashPassword("пароль");
if($phpass->CheckPassword("пароль", $hash)) { echo 'Yes, good password!'; }
else { echo 'Ай-Ай';}
</txp:php>
А почему Вам этот код для Textpattern 4.4.1 не подходит?
Тут ведь идет проверка пароля функций CheckPassword и если пароль совпадает с хешом пароля то выводится 'Yes, good password!', а вы можете сделать свое действие. Кстати этот код я и взял из кода textpattern, ну немного переделал под слово "пароль", так вы вместо этого слова подставляйте свою переменную. Сейчас нет кода textpattern под рукой, но помню что там точно есть функция проверки имени пользователя и пароля!
Отредактированно Redduck (29-08-2011 14:46:32)
Неактивен
Redduck написал:
itshaman написал:
Не все. ))
Хотелось бы понять как можно аутентифицировать пользователя кроме как по паролю, если сравнвать пароли нельзя.
Вы случайно не в курсе как происходит аутентификация при заходе в админ-панель??<txp:php>
include_once 'textpattern/lib/PasswordHash.php';
static $phpass = NULL;
if (!$phpass) {
$phpass = new PasswordHash(8, TRUE);
}
$hash = $phpass->HashPassword("пароль");
if($phpass->CheckPassword("пароль", $hash)) { echo 'Yes, good password!'; }
else { echo 'Ай-Ай';}
</txp:php>
А почему Вам этот код для Textpattern 4.4.1 не подходит?
Тут ведь идет проверка пароля функций CheckPassword и если пароль совпадает с хешом пароля то выводится 'Yes, good password!', а вы можете сделать свое действие. Кстати этот код я и взял из кода textpattern, ну немного переделал под слово "пароль", так вы вместо этого слова подставляйте свою переменную. Сейчас нет кода textpattern под рукой, но помню что там точно есть функция проверки имени пользователя и пароля!
Извините, я все равно не допонимаю что с чем сравнивать.
Пользователь, заполнил форму и набрал свой пароль (будем считать, что это не подтвержденный пароль). Мой обработчик получил эти данные и отправленный ему пароль. В этот момент мне нужно удостоверится - действительно ли это пользователь заполнил форму. В случае успеха, внести отправленные данные в базу данных.
Что с чем сравнивать?
Заранее спасибо.
Неактивен
1. Хешируете пароль такой же функцией, какой был захеширован пароль пользователя USERNAME при регистрации.
2. Проверяете, что хеш пароля пользователя USERNAME в базе и сгенерированный вами пароль из формы авторизации совпадают.
3. Если п.2 = true => авторизация прошла успешно.
Неактивен
Прямо сейчас не могу проверить вот такой код:
<txp:php>
include_once 'textpattern/include/txp_auth.php';
$name = txp_validate($user,$password);
if($name !== FALSE) { echo "Спасибо, вы тот за кого себя выдаете, а не какой нибудь злодей!"; }
else { echo "Неправильное имя пользователя или пароль!"; }
</txp:php>
надо подставить свои данные $user и $password.
Используя функцию txp_validate вы тем самым используете стандартное поведение, ну там например если включено логирование, то это отметит в базе последний доступ.
Потом скачаю ign_password_protect 0.6.2 и посмотрю как там все это реализовано.
Отредактированно Redduck (30-08-2011 09:27:52)
Неактивен
Redduck написал:
Прямо сейчас не могу проверить вот такой код:
<txp:php>
include_once 'textpattern/include/txp_auth.php';
$name = txp_validate($user,$password);
if($name !== FALSE) { echo "Спасибо, вы тот за кого себя выдаете, а не какой нибудь злодей!"; }
else { echo "Неправильное имя пользователя или пароль!"; }
</txp:php>
надо подставить свои данные $user и $password.
Используя функцию txp_validate вы тем самым используете стандартное поведение, ну там например если включено логирование, то это отметит в базе последний доступ.
Потом скачаю ign_password_protect 0.6.2 и посмотрю как там все это реализовано.
Выдает txpinterface is undefined.
Мне эту проверку нужно приделать к отдельному PHP-файлу. Что-то под вид обработчика формы. Я так понимаю, что эта ошибка как раз из-за этого.
Отредактированно itshaman (30-08-2011 13:06:32)
Неактивен
the_ghost написал:
1. Хешируете пароль такой же функцией, какой был захеширован пароль пользователя USERNAME при регистрации.
2. Проверяете, что хеш пароля пользователя USERNAME в базе и сгенерированный вами пароль из формы авторизации совпадают.
3. Если п.2 = true => авторизация прошла успешно.
Спасибо. Как-то так я и подозревал, но вот 2 пункт меня и волновал.
Как я понял это все делается функцией txp_validate
Неактивен
itshaman написал:
Выдает txpinterface is undefined.
Мне эту проверку нужно приделать к отдельному PHP-файлу. Что-то под вид обработчика формы. Я так понимаю, что эта ошибка как раз из-за этого.
Точно, извини просмотрел в начале if (!defined('txpinterface')) die('txpinterface is undefined.'); Да еще надо было подключиться к базе!
Смотрим index.php и копируем себе только то что надо? правда и этого не мало
Только пути посмотри! Твой файл находится в корне сайта?
if (!defined('txpath')) {define("txpath", dirname(__FILE__).'/textpattern');}
if (!defined('txpinterface')) {define("txpinterface", "public");}
// pull in config unless configuration data has already been provided (multi-headed use).
if (!isset($txpcfg['table_prefix']))
{
// Use buffering to ensure bogus whitespace in config.php is ignored
ob_start(NULL, 2048);
include txpath.'/config.php';
ob_end_clean();
}
include txpath.'/lib/constants.php';
include txpath.'/lib/txplib_misc.php';
include txpath.'/lib/txplib_db.php';
if ($connected && safe_query("describe `".PFX."textpattern`")) {
//Тут мы уже должны быть подключены к базе данных
include txpath.'/include/txp_auth.php';
//А вот тут уже должна быть доступны функции txp_validate
$name = txp_validate($user,$password);
if($name !== FALSE) { echo "Спасибо, вы тот за кого себя выдаете, а не какой нибудь злодей!"; }
else { echo "Неправильное имя пользователя или пароль!"; }
} else {
echo 'Нет подключения к базе данных!';
}
Внимание! код не проверял!
Отредактированно Redduck (30-08-2011 14:44:21)
Неактивен
Посмотрел плагин ign_password_protect 0.6.2
там есть функция ign_validate практически повторяющая txp_validate
Но опять же будет работать только в коде плагина, так как подключение к базе данных уже есть и подключены основные функции textpattern
Неактивен
1.
Redduck написал:
Твой файл находится в корне сайта?
Да! Вставил Ваш код. Вышеозвученная проблема исчезла, но в результате всегда выдает, что пароли разные: Неправильное имя пользователя или пароль!.
2. Вы не могли бы подсказать по еще одному вопросу. Когда стоит плагин ign_password_protect, то в заголовке Last-Modified не отдается. Я открыл код плагина и строки:
header("Cache-Control: must-revalidate"); $prefs['send_lastmod'] = false;
заменил на:
//header("Cache-Control: must-revalidate"); $prefs['send_lastmod'] = true;
Стало отдавать? А вот правильно ли это решение? Я так понимаю Last-Modified - это время изменения страницы, которое необходимо для правильного механизма кэширования. Фактически сайт обновляется ежедневно, то есть Last-Modified будет возвращать всегда сегодняшнее число.
P.S. Можно, кстати, обойтись и без комментирования header
Отредактированно itshaman (01-09-2011 11:54:08)
Неактивен
itshaman написал:
Да! Вставил Ваш код. Вышеозвученная проблема исчезла, но в результате всегда выдает, что пароли разные: Неправильное имя пользователя или пароль!.
По второму вопросу помочь Вам не могу.
Попробуйте вставить такое
if (!defined('txpath')) {define("txpath", dirname(__FILE__).'/textpattern');}
if (!defined('txpinterface')) {define("txpinterface", "public");}
// pull in config unless configuration data has already been provided (multi-headed use).
if (!isset($txpcfg['table_prefix']))
{
// Use buffering to ensure bogus whitespace in config.php is ignored
ob_start(NULL, 2048);
include txpath.'/config.php';
ob_end_clean();
}
include txpath.'/lib/constants.php';
include txpath.'/lib/txplib_misc.php';
include txpath.'/lib/txplib_db.php';
if ($connected && safe_query("describe `".PFX."textpattern`")) {
//Тут мы уже должны быть подключены к базе данных
include txpath.'/include/txp_auth.php';
//Попробуем получить хеш юзера из базы
$my_hash = safe_field('pass', 'txp_users', "name = '$user'");
if($my_hash !== FALSE) { echo 'ХЕШ-->'.$my_hash; }
else { echo 'Не смогли получить хеш!'; }
//А вот тут уже должна быть доступны функции txp_validate
$name = txp_validate($user,$password);
if($name !== FALSE) { echo "Спасибо, вы тот за кого себя выдаете, а не какой нибудь злодей!"; }
else { echo "Неправильное имя пользователя или пароль!"; }
} else {
echo 'Нет подключения к базе данных!';
}
То есть узнаем, получаем хеш из базы или нет. Пользователь точно такой есть?
Отредактированно Redduck (01-09-2011 14:31:06)
Неактивен
Выводит:
ХЕШ-->$P$BRinGEgcpHyRjqxcvtpajWzzEhUsWj.Неправильное имя пользователя или пароль!
Пользователь точно есть и пароль тот же
Неактивен