crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> вопрос по php и htpasswd
deex
  опции профиля:
сообщение 11.7.2010, 8:24
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 45
Регистрация: 12.3.2009
Пользователь №: 608

Спасибо сказали: 0 раз(а)




Репутация:   0  


на других форумах молчат, попытаю счастья здесь :)

народ, помогите пожалуйста правильно создать пароль для htpasswd средствами php

вот пример, но пароль получается невалидный:
<?php   

if($_POST)  
{  
    $text = trim($_POST['pass']);  
    $pass = crypt($text, base64_encode($text));  

    file_put_contents('./.htpasswd', trim($_POST['login']).':'. $pass);  

    $access = '<Files .htpasswd>  
   deny from all  
</Files>  

AuthType Basic  
AuthName "Restricted Area"  
AuthUserFile ' .getcwd(). '/.htpasswd  
Require valid-user';  

    file_put_contents('./.htaccess', $access);  

    echo '<b>done.</b> <br /><br />';  

}  

?><form method='post'>  
login: <input type='text' name='login' /><br />  
pass: <input type='text' name='pass' /><br />  
<input type='submit' value='create pass' /></form>
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 11.7.2010, 9:33
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Ну все правильно, что не валидный!
Почему base64? В .htpasswd вроде как хранятся пароли в MD5! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
deex
  опции профиля:
сообщение 11.7.2010, 9:48
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 45
Регистрация: 12.3.2009
Пользователь №: 608

Спасибо сказали: 0 раз(а)




Репутация:   0  


md5() тоже не дает правильного результата
авторизация не проходит

а если сделать пароль через онлайн-генераторы, типа http://www.htaccesstools.com/htpasswd-generator/
то всё работает
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
deex
  опции профиля:
сообщение 11.7.2010, 15:24
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 45
Регистрация: 12.3.2009
Пользователь №: 608

Спасибо сказали: 0 раз(а)




Репутация:   0  


Варианты кодирования от гугла:

1

$salt=substr($pass,0,2);
$test_pw=crypt($pass,$salt);

2

$password = crypt($pass, base64_encode($pass));

3

$pass = crypt($pass, base64_encode(CRYPT_STD_DES))


Ни один способ не работает, кроме варианта с некодированным паролем. Но он в свою очередь работает только на винде.

Проверено на винде xp, apache 2.2, php 5.2.13

Нюанс: если сгенерить htpasswd онлайн-генератором типа этого
http://www.htaccesstools.com/htpasswd-generator/
всё авторизуется нормально и на винде и на юникс-сервере.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 11.7.2010, 15:37
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а это не проблема кодировок? вообще говоря, некоторые юзеры пытаются создавать пароли и с кириллицей, и с пробелами. а вот в POST они попадут уже в сериализованном виде и в таком виде и предстанут перед кодировщиком. посмотри для порядка, что тебе в POST приходит. может, там уже не то, что юзер задал в форме.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
deex
  опции профиля:
сообщение 11.7.2010, 16:09
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 45
Регистрация: 12.3.2009
Пользователь №: 608

Спасибо сказали: 0 раз(а)




Репутация:   0  


ну задаю я сам, т.к. это тестовый скрипт
и задавал всегда или admin:pass или 1:1

так что кодировка ничего не решает

нашёл инфу о том, что хеш из htpasswd (имеющий вид - $apr1$km3.....$DFX3dj2OP9wylDPCfoM9x1)
является хешем MD5 (ARP)

осталось понять как создать его средствами пхп
гугл ничего не может подсказать


решение:

function crypt_apr1_md5($plainpasswd) {  
    $salt = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz0123456789"), 0, 8);  
    $len = strlen($plainpasswd);  
    $text = $plainpasswd.'$apr1$'.$salt;  
    $bin = pack("H32", md5($plainpasswd.$salt.$plainpasswd));  
    for($i = $len; $i > 0; $i -= 16) { $text .= substr($bin, 0, min(16, $i)); }  
    for($i = $len; $i > 0; $i >>= 1) { $text .= ($i & 1) ? chr(0) : $plainpasswd{0}; }  
    $bin = pack("H32", md5($text));  
    for($i = 0; $i < 1000; $i++) {  
        $new = ($i & 1) ? $plainpasswd : $bin;  
        if ($i % 3) $new .= $salt;  
        if ($i % 7) $new .= $plainpasswd;  
        $new .= ($i & 1) ? $bin : $plainpasswd;  
        $bin = pack("H32", md5($new));  
    }  
$tmp = '';
    for ($i = 0; $i < 5; $i++) {  
        $k = $i + 6;  
        $j = $i + 12;  
        if ($j == 16) $j = 5;  
        $tmp = $bin[$i].$bin[$k].$bin[$j].$tmp;  
    }  
    $tmp = chr(0).chr(0).$bin[11].$tmp;  
    $tmp = strtr(strrev(substr(base64_encode($tmp), 2)),  
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx  yz0123456789+/",  
    "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn  opqrstuvwxyz");  
    return "$"."apr1"."$".$salt."$".$tmp;  
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Ответить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 2:40