Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Магазин по продаже контента (php) (http://forum.oszone.net/showthread.php?t=187202)

dmitryst 03-10-2010 01:24 1510009

Магазин по продаже контента (php)
 
Коллеги! Нужна помощь в реализации защищенной клиентской зоны сайта и выдачи контента клиенту после оплаты. С оплатой, вроде, сам разберусь :). Т.е. на сайте есть папка (может, и не папка) с некими файлами, надо ее оградить от простых клиентов и дать доступ тем, кто прошел транзакцию оплаты. Как это сделать? Можно ссылку на алгоритм или, еще лучше, скрипт. На perl тоже сойдет.

ЗЫ. гугла допрашивал. Что-то в последнее время ничего толкового не выдает, одни стандартные инет-магазины :(

Sham 04-10-2010 17:43 1511240

имхо с PHP только редирект, или самим скриптом отдавать, если размер небольшой (после проверки оплаты). УРЛ на файл нужно делать динамическим (не постоянным), использованием mod_rewrite или более продвинутого модуля. Типовой реализации быть не может, ибо чревато легким взломом.

dmitryst 04-10-2010 20:28 1511370

Цитата:

Цитата Sham
более продвинутого модуля »

например? Я, например, хотел использовать как часть URL уникальный идентификатор сессии, но это, по-моему, довольно ректально )))

Цитата:

Цитата Sham
чревато легким взломом. »

да всё чревато.... Хоть куда копать-то?

Sham 04-10-2010 21:52 1511442

копать куда угодно, хоть через HTTP-аутентификацию на папку с файлами (после оплаты давать пароли). Можно скриптом проверять код оплаты, и редиректить непосредственно на файл. Прямую ссылку на файл можно сделать хитрой и непонятной (mod_rewrite).
если файл небольшой, можно отдать непосредственно скриптом (file_get_contents + заголовки Content-Type и т.д.).
если б с помощью модуля типа mod_rewrite можно было проверить хеш, то другое дело... для апача не видел такого модуля, мб для других серверов есть...

dmitryst 04-10-2010 22:22 1511472

Спасибо, покопал.
Цитата:

Цитата Sham
Можно скриптом проверять код оплаты, и редиректить непосредственно на файл. »

да, наверное, сделаю так.

Цитата:

Цитата Sham
если б с помощью модуля типа mod_rewrite можно было проверить хеш, то другое дело... »

а зачем?

Sham 04-10-2010 22:29 1511476

чтобы прямой ссылкой нельзя было поделиться... (редирект отловить можно)

Sham 04-10-2010 23:26 1511510

можно перед редиректом на файл ставить какой-нибудь хитрый кук, а потом mod_rewrite проверять его наличие в запросе на файл.

dmitryst 05-10-2010 16:08 1511988

Цитата:

Цитата Sham
можно перед редиректом на файл ставить какой-нибудь хитрый кук »

да уж... На каждого клиента по одному кукису, с занесением в БД :)

Sham 07-10-2010 10:26 1513373

mod_rewrite (или аналогичный модуль) позволяет проверить заголовок (в т.ч. наличие кукиса). Т.е. в случае отсутствия волшебного :) кукиса не отдавать файл... имхо так надежнее будет.

dmitryst 07-10-2010 13:27 1513493

да, но тут выяснился еще один момент. Контент придется отдавать не мелкими файлами, а выделить целую зону (html файлы с flash-роликами). Так что rewrite, думаю, не справится, надо писать супер-эксклюзивную функцию. Попутно она должна проверять, не закончилось ли выделенное время (месяц, два или три) и соответственно, перенаправлять на страницу продления подписки.

ЗЫ. А нет ли где примерчика? По типу adult сайтов, с исходниками? Я что-то ничего не нашел, в основном, магазины по продаже реального товара.

dmitryst 24-10-2010 20:26 1526441

Нда, активность зашкаливает... Может, у кого есть пример обработки файла .htpasswd из php? Нужно туда добавлять или удалять юзеров с паролями, как это сделать из скрипта- не понятно (в гугле искал уже)

Sham 25-10-2010 04:28 1526659

HTTP-аутентификация делается заголовками. htpasswd - это средствами сервера. Если скриптом, то и базу можно использовать.

dmitryst 25-10-2010 13:37 1526875

Цитата:

Цитата Sham
HTTP-аутентификация делается заголовками. »

да это я читал.. В .htpassdw писать что? "deny from all"? Или без разницы? Совсем не хочется, чтобы кто-то по прямым ссылкам заходил (в mod_rewrite я уже совсем запутался :lamer: )

Еще вопрос... Пароль выдается на какой-то срок, скажем, 30 дней. Надо оповещать клиента перед окончанием действия его пароля. Я сделал так - пишу в два поля timestamp и timestamp+30 дней. Затем через cron буду запускать скрипт, сравнивающий текущий timestamp и записаный в БД, ну и, соответственно, отправляющий мейл когда надо. Неэлегантно, но сравнительно просто. Есть у кого какие предложения? :)

Sham 25-10-2010 14:49 1526923

Цитата:

Цитата dmitryst
В .htpassdw писать что? »

ничего туда не надо, там шифрованые пароли и логины, это фича apache (не PHP). Тут все есть про 401 и куча примеров внизу...

Цитата:

Цитата dmitryst
пишу в два поля timestamp и timestamp+30 дней »

второе не нужно (сложение +30 дней не сильно грузит). Все элегантно и эстетично.

dmitryst 25-10-2010 15:14 1526943

Цитата:

Цитата Sham
второе не нужно (сложение +30 дней не сильно грузит). »

вот не понял, честно. Почему второе не нужно? У меня, скажем, три поля - "user", "kogda_vidan_pass", "kogda_zakonchitsya_pass" :). В первом - юзер, во втором я ставлю timestamp когда юзер получил пароль, затем к этому timestamp добавляю 30 дней (в секундах), пишу в третье поле. Ну, и потом раз в день сравниваю значения из второго и третьего полей. Пишутся эти поля один раз :).

Цитата:

Цитата Sham
Тут все есть про 401 и куча примеров внизу... »

почитал/сделал. Есть папка, скажем, /uploads, ее надо защитить. Во-первых, из примеров не совсем понятно, что делать с полученным правильным паролем/пассом. Пока просто " header ("Location: $url");", но в саму папку можно зайти и без пароля. Нужен именно защищенный вход в папку, с выдачей скрипта всё понятно. Да, насчет .htpasswd я очепятался - .htaccess нужен. Но если я туда пишу "deny from all" - не зайти никак. Что делать?

Sham 25-10-2010 17:46 1527076

зачем лишнее поле, если можно каждый раз считать +30 для проверки. другое дело, если сортировка или связка нужна...

если 401 только для папки с файлами нужно, то лучше htpasswd. Придется скриптом рулить htpasswd. тынц тынц. Логины фиксирум в базе и в htpasswd...

dmitryst 25-10-2010 21:26 1527262

Цитата:

Цитата Sham
зачем лишнее поле, если можно каждый раз считать +30 для проверки. »

и как оно будет выглядеть, по-вашему? Если я каждый раз буду добавлять +30 дней к текущей дате, так я буду ждать до второй эпохи Unix или пока разряды счетчика не переполнятся :laugh: . Так что Вы, коллега, неправы... Проще сравнить число из базы с текущим, если разница положительная, то ничего и не делаем. Повторяю, скрипт планируется запускать раз в сутки, этого достаточно, чтобы заранее оповестить клиента.

за
Цитата:

тынц тынц.
спасибо :) (хотя я первую статью читал уже..)

dmitryst 25-10-2010 23:08 1527339

Нашел тут скрипт для кодирования паролей и добавления в .htpasswd. Работает, проверил...

читать дальше »
PHP код:

<?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$i2), '%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($salt0,8);
}

$length strlen($string);
$context $string '$apr1$' $salt;
$binary _bin(md5($string $salt $string));

for (
$i $length$i 0$i -= 16) {
$context .= substr($binary0, ($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($binary0,16);
if (
$i 3) {
$new .= $salt;
}
if (
$i 7) {
$new .= $string;
}
$new .= ($i 1) ? substr($binary0,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);}
?>


Sham 26-10-2010 05:46 1527490

Цитата:

Цитата dmitryst
и как оно будет выглядеть, по-вашему? Если я каждый раз буду добавлять +30 дней к текущей дате, так я буду ждать до второй эпохи Unix или пока разряды счетчика не переполнятся »

короче, взаимные непонятки...

dmitryst 26-10-2010 15:20 1527838

Цитата:

Цитата Sham
короче, взаимные непонятки... »

объясняю. Вот вы зашли 1 января, зарегистрировались, вам дали пароль на 10 дней (например). Пишу в базу - "Sham", timestamp (от 1 янв), timestamp+10дней. Раз в сутки я проверяю разницу между вторым число и первым. Это не зависит ни от каких других факторов, всё уже прописано в базе, я считаю только разницу между третьим полем и вторым. Когда разница станет меньше чем 2 дня, к слову, вам придет письмецо с извещением, что действие пароля закончится через 2 дня. По-моему, проще некуда, да и подделать / хакнуть тут ничего не получится.


В остальном, так сказать, "жизнь налаживается" - сделал уже админку с добавлением/просмотром юзеров в .htpasswd. Работает без проблем, апач пароль принимает, хотя и ругается типа "не мой пароль, но сойдет" :).
UPD: Нашел другой скрипт, переделал, теперь у апача претензий нет. Если кому нужно - выложу.

dmitryst 17-12-2010 23:45 1568509

Нарисовалась проблема такого характера. Результат оплаты - это xml файл, который выдается банковским сервером. Если зайти вручную, браузером, то всё нормально, нормальный файл с данными. Мне нужно получить эти данные программно, я использовал вариант с прямым обращением к сокетам:

PHP код:

<?php

$fp 
fsockopen ("e-commerce.*bank.ge",443$errno$errstr30);
if (!
$fp) {
echo 
"$errstr ($errno)<br>\n";
} else {
///fputs ($fp, "GET /servlet/ICBSXPProxyServlet/trn_xml.jsp?xICBSXPProxy.Version=01.02&xICBSXPProxy.UserName=FAshdget352&xICBSXPProxy.UserPassword=fashdg6sa&MerchantID=08000395&PurchaseDesc=1292184160-5 HTTP/1.1\r\nHost: e-commerce.*bank.ge\r\n\r\n");
fputs ($fp"GET /index.html HTTP/1.0\r\nHost: e-commerce.*bank.ge\r\n\r\n");
while (!
feof($fp)) {
echo 
fgets ($fp,1024);
}
fclose ($fp);

?>

Выдается фигня (пара юникод-символов). libcurl не стоит и ставить не будут, уже спрашивал. Можно ли как-то еще попробовать получить этот злополучный файл???

Sham 18-12-2010 00:13 1568527

file_get_contents

Sham 18-12-2010 02:40 1568575

хм, 443 - не SSL ли? Тогда нужно сертификатом как-то рулить...
ssl:// в fsockopen (https:// в file_get_contents - если обработчик есть). Нужен хотя бы openSSL... иначе погуглить готовые скрипты, где реализовано ssl-шифрование.

dmitryst 18-12-2010 22:15 1569155

Цитата:

Цитата Sham
file_get_contents »

ага, ну да.. :)

Цитата:

Цитата Sham
хм, 443 - не SSL ли? »

он :(
Цитата:

Цитата Sham
Тогда нужно сертификатом как-то рулить... »

рулим...
Цитата:

(строка 3) $data = file_get_contents('https://e-commerce.*bank.ge', false, stream_context_create (array ('https'=>array ('verify_peer'=>false))) );////Получим файл
однако ж, нифига..
Цитата:

Warning: file_get_contents(https://e-commerce.*bank.ge) [function.file-get-contents]: failed to open stream: No such file or directory in /home/*/public_html/get_test.php on line 3
UPD: пока через wget получаю файл, записываю, потом этот файл читаю через file_get_contents(имя_файла), но это ж изврат %)

Sham 18-12-2010 23:07 1569189

Цитата:

Цитата dmitryst
https://e-commerce.*bank.ge »

* - звездочка в урле зачем?
Цитата:

If OpenSSL support is installed, you may prefix the hostname with either ssl:// or tls:// to use an SSL or TLS client connection over TCP/IP to connect to the remote host.
fsockopen

dmitryst 18-12-2010 23:24 1569200

Цитата:

Цитата Sham
* - звездочка в урле зачем? »

не будем палить банк :lol: (в реале, конечно, без звездочки)
Цитата:

Цитата Sham
If OpenSSL support is installed »

а он не installed, как выяснилось. Однако, wget прекрасно забирает данные по ssl ! :durak:


Время: 22:49.

Время: 22:49.
© OSzone.net 2001-