Показать полную графическую версию : Магазин по продаже контента (php)
dmitryst
03-10-2010, 01:24
Коллеги! Нужна помощь в реализации защищенной клиентской зоны сайта и выдачи контента клиенту после оплаты. С оплатой, вроде, сам разберусь :). Т.е. на сайте есть папка (может, и не папка) с некими файлами, надо ее оградить от простых клиентов и дать доступ тем, кто прошел транзакцию оплаты. Как это сделать? Можно ссылку на алгоритм или, еще лучше, скрипт. На perl тоже сойдет.
ЗЫ. гугла допрашивал. Что-то в последнее время ничего толкового не выдает, одни стандартные инет-магазины :(
имхо с PHP только редирект, или самим скриптом отдавать, если размер небольшой (после проверки оплаты). УРЛ на файл нужно делать динамическим (не постоянным), использованием mod_rewrite или более продвинутого модуля. Типовой реализации быть не может, ибо чревато легким взломом.
dmitryst
04-10-2010, 20:28
более продвинутого модуля »
например? Я, например, хотел использовать как часть URL уникальный идентификатор сессии, но это, по-моему, довольно ректально )))
чревато легким взломом. »
да всё чревато.... Хоть куда копать-то?
копать куда угодно, хоть через HTTP-аутентификацию (http://httpd.apache.org/docs/2.3/howto/auth.html) на папку с файлами (после оплаты давать пароли). Можно скриптом проверять код оплаты, и редиректить непосредственно на файл. Прямую ссылку на файл можно сделать хитрой и непонятной (mod_rewrite).
если файл небольшой, можно отдать непосредственно скриптом (file_get_contents + заголовки Content-Type и т.д.).
если б с помощью модуля типа mod_rewrite можно было проверить хеш, то другое дело... для апача не видел такого модуля, мб для других серверов есть...
dmitryst
04-10-2010, 22:22
Спасибо, покопал.
Можно скриптом проверять код оплаты, и редиректить непосредственно на файл. »
да, наверное, сделаю так.
если б с помощью модуля типа mod_rewrite можно было проверить хеш, то другое дело... »
а зачем?
чтобы прямой ссылкой нельзя было поделиться... (редирект отловить можно)
можно перед редиректом на файл ставить какой-нибудь хитрый кук, а потом mod_rewrite проверять его наличие в запросе на файл.
dmitryst
05-10-2010, 16:08
можно перед редиректом на файл ставить какой-нибудь хитрый кук »
да уж... На каждого клиента по одному кукису, с занесением в БД :)
mod_rewrite (или аналогичный модуль) позволяет проверить заголовок (в т.ч. наличие кукиса). Т.е. в случае отсутствия волшебного :) кукиса не отдавать файл... имхо так надежнее будет.
dmitryst
07-10-2010, 13:27
да, но тут выяснился еще один момент. Контент придется отдавать не мелкими файлами, а выделить целую зону (html файлы с flash-роликами). Так что rewrite, думаю, не справится, надо писать супер-эксклюзивную функцию. Попутно она должна проверять, не закончилось ли выделенное время (месяц, два или три) и соответственно, перенаправлять на страницу продления подписки.
ЗЫ. А нет ли где примерчика? По типу adult сайтов, с исходниками? Я что-то ничего не нашел, в основном, магазины по продаже реального товара.
dmitryst
24-10-2010, 20:26
Нда, активность зашкаливает... Может, у кого есть пример обработки файла .htpasswd из php? Нужно туда добавлять или удалять юзеров с паролями, как это сделать из скрипта- не понятно (в гугле искал уже)
HTTP-аутентификация (http://www.google.ru/search?q=HTTP-%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F+PHP&hl=ru&newwindow=1&prmd=iv&source=lnt&tbs=lr:lang_1ru&lr=lang_ru&sa=X&ei=t87ETJbgFISYOrST7ZcM&ved=0CAcQpwU) делается заголовками. htpasswd - это средствами сервера. Если скриптом, то и базу можно использовать.
dmitryst
25-10-2010, 13:37
HTTP-аутентификация делается заголовками. »
да это я читал.. В .htpassdw писать что? "deny from all"? Или без разницы? Совсем не хочется, чтобы кто-то по прямым ссылкам заходил (в mod_rewrite я уже совсем запутался :lamer: )
Еще вопрос... Пароль выдается на какой-то срок, скажем, 30 дней. Надо оповещать клиента перед окончанием действия его пароля. Я сделал так - пишу в два поля timestamp и timestamp+30 дней. Затем через cron буду запускать скрипт, сравнивающий текущий timestamp и записаный в БД, ну и, соответственно, отправляющий мейл когда надо. Неэлегантно, но сравнительно просто. Есть у кого какие предложения? :)
В .htpassdw писать что? »
ничего туда не надо, там шифрованые пароли и логины, это фича apache (не PHP). Тут (http://docs.php.net/manual/ru/features.http-auth.php) все есть про 401 и куча примеров внизу...
пишу в два поля timestamp и timestamp+30 дней »
второе не нужно (сложение +30 дней не сильно грузит). Все элегантно и эстетично.
dmitryst
25-10-2010, 15:14
второе не нужно (сложение +30 дней не сильно грузит). »
вот не понял, честно. Почему второе не нужно? У меня, скажем, три поля - "user", "kogda_vidan_pass", "kogda_zakonchitsya_pass" :). В первом - юзер, во втором я ставлю timestamp когда юзер получил пароль, затем к этому timestamp добавляю 30 дней (в секундах), пишу в третье поле. Ну, и потом раз в день сравниваю значения из второго и третьего полей. Пишутся эти поля один раз :).
Тут все есть про 401 и куча примеров внизу... »
почитал/сделал. Есть папка, скажем, /uploads, ее надо защитить. Во-первых, из примеров не совсем понятно, что делать с полученным правильным паролем/пассом. Пока просто " header ("Location: $url");", но в саму папку можно зайти и без пароля. Нужен именно защищенный вход в папку, с выдачей скрипта всё понятно. Да, насчет .htpasswd я очепятался - .htaccess нужен. Но если я туда пишу "deny from all" - не зайти никак. Что делать?
зачем лишнее поле, если можно каждый раз считать +30 для проверки. другое дело, если сортировка или связка нужна...
если 401 только для папки с файлами нужно, то лучше htpasswd. Придется скриптом рулить htpasswd. тынц (http://httpd.apache.org/docs/2.3/howto/auth.html#lettingmorethanonepersonin) тынц (http://www.google.ru/search?sclient=psy&hl=ru&newwindow=1&client=firefox&hs=VtN&rls=org.mozilla%3Aru%3Aofficial&source=hp&q=%2Bhtpasswd+%2BPHP&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA). Логины фиксирум в базе и в htpasswd...
dmitryst
25-10-2010, 21:26
зачем лишнее поле, если можно каждый раз считать +30 для проверки. »
и как оно будет выглядеть, по-вашему? Если я каждый раз буду добавлять +30 дней к текущей дате, так я буду ждать до второй эпохи Unix или пока разряды счетчика не переполнятся :laugh: . Так что Вы, коллега, неправы... Проще сравнить число из базы с текущим, если разница положительная, то ничего и не делаем. Повторяю, скрипт планируется запускать раз в сутки, этого достаточно, чтобы заранее оповестить клиента.
за
тынц тынц.
спасибо :) (хотя я первую статью читал уже..)
dmitryst
25-10-2010, 23:08
Нашел тут (http://www.imho.ws/archive/index.php?t-61855.html) скрипт для кодирования паролей и добавления в .htpasswd. Работает, проверил...
<?php
$GLOBALS['_CRYPT_APR_MD5_64'] = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
function _to64($value, $count){
$result = '';
$count = abs($count);
while(--$count) {
$result .= $GLOBALS['_CRYPT_APR_MD5_64'][$value & 0x3f];
$value >>= 6;
}
return $result;
}
function _bin($hex){
$rs = '';
$ln = strlen($hex);
for($i = 0; $i < $ln; $i += 2) {
$rs .= chr(array_shift(sscanf(substr($hex, $i, 2), '%x')));
}
return $rs;
}
function encrypt($string, $salt = null){
if (is_null($salt)) {
$salt = _genSalt();
} elseif (preg_match('/^\$apr1\$/', $salt)) {
$salt = preg_replace('/^\$apr1\$(.{8}).*/', '\\1', $salt);
} else {
$salt = substr($salt, 0,8);
}
$length = strlen($string);
$context = $string . '$apr1$' . $salt;
$binary = _bin(md5($string . $salt . $string));
for ($i = $length; $i > 0; $i -= 16) {
$context .= substr($binary, 0, ($i > 16 ? 16 : $i));
}
for ( $i = $length; $i > 0; $i >>= 1) {
$context .= ($i & 1) ? chr(0) : $string[0];
}
$binary = _bin(md5($context));
for($i = 0; $i < 1000; $i++) {
$new = ($i & 1) ? $string : substr($binary, 0,16);
if ($i % 3) {
$new .= $salt;
}
if ($i % 7) {
$new .= $string;
}
$new .= ($i & 1) ? substr($binary, 0,16) : $string;
$binary = _bin(md5($new));
}
$p = array();
for ($i = 0; $i < 5; $i++) {
$k = $i + 6;
$j = $i + 12;
if ($j == 16) {
$j = 5;
}
$p[] = _to64(
(ord($binary[$i]) << 16) |
(ord($binary[$k]) << 8) |
(ord($binary[$j])),
5
);
}
return
'$apr1$' . $salt . '$' . implode($p) .
_to64(ord($binary[11]), 3);
}
function _genSalt(){
$rs = '';
for($i = 0; $i < 8; $i++) {
$rs .=$GLOBALS['_CRYPT_APR_MD5_64'][rand(0,63)];
}
return $rs;
}
if (isset($login) and $login != "" and isset($pass) and $pass != "")
{
$file = fopen(".htpasswd","a");
$p = encrypt($pass)."\n\r";
$res=$login.":".$p;
fputs($file,$res);}
?>
и как оно будет выглядеть, по-вашему? Если я каждый раз буду добавлять +30 дней к текущей дате, так я буду ждать до второй эпохи Unix или пока разряды счетчика не переполнятся »
короче, взаимные непонятки...
dmitryst
26-10-2010, 15:20
короче, взаимные непонятки... »
объясняю. Вот вы зашли 1 января, зарегистрировались, вам дали пароль на 10 дней (например). Пишу в базу - "Sham", timestamp (от 1 янв), timestamp+10дней. Раз в сутки я проверяю разницу между вторым число и первым. Это не зависит ни от каких других факторов, всё уже прописано в базе, я считаю только разницу между третьим полем и вторым. Когда разница станет меньше чем 2 дня, к слову, вам придет письмецо с извещением, что действие пароля закончится через 2 дня. По-моему, проще некуда, да и подделать / хакнуть тут ничего не получится.
В остальном, так сказать, "жизнь налаживается" - сделал уже админку с добавлением/просмотром юзеров в .htpasswd. Работает без проблем, апач пароль принимает, хотя и ругается типа "не мой пароль, но сойдет" :).
UPD: Нашел другой скрипт, переделал, теперь у апача претензий нет. Если кому нужно - выложу.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.