Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как делаются уникальные ссылки?
 
 автор: coloboc66   (30.07.2007 в 16:42)   письмо автору
 
 

Вот вижу на сайтах для мобилок: после того, как пользователь отослал платную СМС, для него формируется уникальная ссылка на скачивание. Как это делается?

   
 
 автор: Киналь   (30.07.2007 в 17:12)   письмо автору
 
   для: coloboc66   (30.07.2007 в 16:42)
 

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

   
 
 автор: Unreal   (30.07.2007 в 20:34)   письмо автору
 
   для: coloboc66   (30.07.2007 в 16:42)
 

а что именно интересует? как ссылка формируется или что-то другое?

ссылку можно генерить например из следующей строки
номер_телефона_дата_время_id_картинки_id_заказа
таким образом из строки типа
79091234567_30-07-2007-20:23:51-34234-342340
используя встроенные функции php или mysql для получения контрольной суммы формируем уникальный ключ, который можно использовать в дальнейшей работе


<?php
$str 
"79091234567_30-07-2007-20:23:51-34234-342340";

print (
"\nSHA1: " md5($str) . "\n");
print (
"MD5: " sha1($str) . "\n");
?>


для MySQL:
SELECT (MD5('79091234567_30-07-2007-20:23:51-34234-342340'))
SELECT (SHA1('79091234567_30-07-2007-20:23:51-34234-342340'));

   
 
 автор: coloboc66   (30.07.2007 в 22:04)   письмо автору
 
   для: Unreal   (30.07.2007 в 20:34)
 

Ну хорошо: такой ключ, как вы показали, можно сформировать. А как его привязать к файлу, предназначенному для скачивания? Ведь если пользователь поймёт, в какой директории этот файл лежит, он может попытаться качать напрямую из этой директории бесплатно?

   
 
 автор: Trianon   (30.07.2007 в 22:18)   письмо автору
 
   для: coloboc66   (30.07.2007 в 22:04)
 

а имя-то он как узнает?

   
 
 автор: Unkind   (30.07.2007 в 22:22)   письмо автору
 
   для: coloboc66   (30.07.2007 в 22:04)
 

А как его привязать к файлу, предназначенному для скачивания?
Создаете таблицу минимум с двумя полями - ключ и имя файла. Запрашиваете страницу с ключем. В базе проверяется есть ли такой ключ. Если нет, то надо сообщить, что нету такого. Если есть, то узнать, что это за тип файла (тогда таблицу желательно расширить) и послать заголовок Content-type. После, допустим, функцией readfile() посылаете файл пользователю и можно удалять запись с текущим ключем. Хотя это несколько жестоко. Лучше будет дать, например, сутки на скачивание, а после ссылка с ключем будет недействительна.

   
 
 автор: disable   (30.07.2007 в 21:52)   письмо автору
 
   для: coloboc66   (30.07.2007 в 16:42)
 

Вы можете обрабатывать SMS-запросы собственным сервисом.
Вашему сервису по http-протоколу будут передаваться данные запроса, абонент получит ответ, выданный Вашим сервисом.
В POST-запросе передаются:
num - сервисный номер
operator - название оператора
phone - номер телефона без 3 цифр
abonent - уникальный идентификатор абонента или полный номер телефона
text - текст SMS.
Ответ от Вашего сервиса должен быть в кодировке UTF-8, может содержать символы латинского и русского алфавита, цифры, а также, символы: ;:,.?/!#$*()-_=+@
Другие символы будут заменены на пробелы.
Если в ответе нет символов кириллицы - максимальная длина ответа равна 160 символам, с кириллицей - 71.
Если ответ превышает максимальную длину, он обрезается.
Пример обработчика на PHP:
<?php
error_reporting(0);
$num=intval($_POST['num']);
$operator=rawurldecode($_POST['operator']);
$phone=rawurldecode($_POST['phone']);
$text=rawurldecode($_POST['text']);
$abonent=rawurldecode($_POST['abonent']);
/*
...обрабатываем данные (тут можно и ссылку сгенерить)
$result=...
*/
if (iconv_strlen($result,'utf-8')>160) $result=iconv_substr($result,0,160,'utf-8');
print $result;
?>

   
 
 автор: Unkind   (30.07.2007 в 22:23)   письмо автору
 
   для: disable   (30.07.2007 в 21:52)
 

$operator=rawurldecode($_POST['operator']);
$phone=rawurldecode($_POST['phone']);
$text=rawurldecode($_POST['text']);
$abonent=rawurldecode($_POST['abonent']);


rawurldecode() писать не надо.

   
 
 автор: Disable   (30.07.2007 в 22:26)   письмо автору
 
   для: Unkind   (30.07.2007 в 22:23)
 

это просто из jep'овского примера

   
 
 автор: Unkind   (30.07.2007 в 22:48)   письмо автору
 
   для: Disable   (30.07.2007 в 22:26)
 

Где видел?

   
 
 автор: Disable   (30.07.2007 в 23:15)   письмо автору
 
   для: Unkind   (30.07.2007 в 22:48)
 

тут
http://download.jep.ru/0/11/help/18/

   
 
 автор: Unkind   (30.07.2007 в 23:30)   письмо автору
 
   для: Disable   (30.07.2007 в 23:15)
 

Ну и неверно. Интерпретатор автоматически декодирует эти шестнадцатеричные представления некоторых символов.

   
 
 автор: Disable   (30.07.2007 в 23:38)   письмо автору
 
   для: Unkind   (30.07.2007 в 23:30)
 

вопрос не об этом :)

   
 
 автор: coloboc66   (29.08.2007 в 14:17)   письмо автору
 
   для: Disable   (30.07.2007 в 23:38)
 

"Если есть, то узнать, что это за тип файла (тогда таблицу желательно расширить) " - не пойму: для чего нужно расширять таблицу из-за типа файла? Ведь тип можно узнать скриптом из его названия, если он в базе записан сразу с расширением...

   
 
 автор: Unkind   (29.08.2007 в 15:29)   письмо автору
 
   для: coloboc66   (29.08.2007 в 14:17)
 

Если заранее известны типы файлов, которые будут загружаться, то это, конечно, лишнее.

   
 
 автор: coloboc66   (29.08.2007 в 16:57)   письмо автору
 
   для: Unkind   (29.08.2007 в 15:29)
 

Ну вот я сделал уникальный ключ и отдаю такую ссылку:
http://somehost.com/wap/download.php?key=089f12dbab854eb9d1ef2a42b60926bd
Это правильно? Ничего, что она такая длинная?

   
 
 автор: Unkind   (29.08.2007 в 17:16)   письмо автору
 
   для: coloboc66   (29.08.2007 в 16:57)
 

Судить о правильности надо по коду, а не по ссылке.

   
 
 автор: coloboc66   (29.08.2007 в 17:35)   письмо автору
 
   для: Unkind   (29.08.2007 в 17:16)
 

Ну вот такой я думаю, алгоритм:
Мой скрипт получает от оператора в ГЕТ-переменной текст SMS с id картинки. Этот текст я дополняю, шифрую в md5 и полученный ключ кладу в таблицу orders. В соседнюю ячейку кладу незашифрованный id картинки и в тексте ответной смс отправляю такую ссылку, где ГЕТ-параметром и является упомянутый ключ. Пользователь переходит по данной ссылке и РНР-скрипт опять берёт значение ГЕТ-параметра, сравнивает его с имеющимся в БД в таблице orders. Если есть такой, то достаёт из таблицы соответствующий ему id картинки. Потом по этому id определяет имя и путь к файлу. Ход мысли у меня правильный?!
Ну и остаётся сформировать заголовок и как-то отдать файл на скачивание - вот это я ещё не знаю как делать.
А про длину ссылки я спрашиваю потому, что не знаю, как пользователь сотового реально её набирает из полученного смс.

   
 
 автор: wawilon   (01.10.2007 в 18:02)   письмо автору
 
   для: coloboc66   (29.08.2007 в 17:35)
 

Что то я не совсем понял... Вы по мд5 достаете нужный файл? Так ведь мд5 не всегда уникальный. Рано или поздно он совпадет с другим. Или я не так понял?

   
 
 автор: Гончий пёс   (29.08.2007 в 17:20)   письмо автору
 
   для: coloboc66   (29.08.2007 в 16:57)
 

Ну, юзер же её не наизусть учить собрался=) у большинства мобилок ссылка выделяется целиком и юзеру остается только нажать на "зелененькую".

   
 
 автор: coloboc66   (01.10.2007 в 14:14)   письмо автору
 
   для: Гончий пёс   (29.08.2007 в 17:20)
 

Так у меня ссылка на файл *.php А вап-броузер будет обрабатывать файл с таким расширением?

   
 
 автор: Leab   (01.10.2007 в 14:33)   письмо автору
 
   для: coloboc66   (01.10.2007 в 14:14)
 

+) заголовки то ты отправляешь ваповские, или нет?

   
 
 автор: Unkind   (01.10.2007 в 14:48)   письмо автору
 
   для: coloboc66   (01.10.2007 в 14:14)
 

Браузеры вообще не смотрят на расширение.

   
 
 автор: coloboc66   (01.10.2007 в 15:27)   письмо автору
 
   для: Unkind   (01.10.2007 в 14:48)
 

Что-то я запутался: что во что нужно включать - код РНР в файл *.wml или код wml в файл *.php ?
Или всё вообще не так делается? Я хочу загрузить в вап-броузер страничку с названиями категорий клипов, а эти названия брать с помощью РНР из текстового файла, лежащего на сервере. Каков сам принцип совместной работы wml и php ?!

   
 
 автор: Unkind   (01.10.2007 в 17:45)   письмо автору
 
   для: coloboc66   (01.10.2007 в 15:27)
 

Да то же самое, что и с HTML.
Отправляются соответствующие заголовки, формируется WML-код и отправляется клиенту. Какой URI значения не имеет. В HTTP вообще нет никаких файлов.
Файл - определенное кол-во информации, имеющее имя и хранящееся в постоянной памяти. HTTP-документы - не файлы.

   
 
 автор: coloboc66   (02.10.2007 в 09:51)   письмо автору
 
   для: Unkind   (01.10.2007 в 17:45)
 

Ну как вап-броузеру всё-равно расширение? Просто я тестирую в Опере, а не в мобилке, но думаю, что эти броузеры работают аналогично, хотя могу ошибаться.
Вот файл index.php

<?
echo "<?xml version=1.0 encoding=UTF-8?><!DOCTYPE wml PUBLIC -//WAPFORUM//DTD WML 1.2//EN http://www.wapforum.org/DTD/wml12.dtd><wml><head><meta http-equiv=Cache-Control content=no-cache forua=true/></head><card id=index title=Главная страница>";
?>
<p align="center">
<a href=show_cat1.php>Категория1</a><br/>
<a href=show_cat1.php>Категория1</a><br/>
<a href=show_cat1.php>Категория1</a><br/>
</p>
</card></wml>

Он броузером читается правильно.
А вот файл index.wml

?xml version=1.0 encoding=UTF-8?>
<!DOCTYPE wml PUBLIC -//WAPFORUM//DTD WML 1.2//EN http://www.wapforum.org/DTD/wml12.dtd>
<wml>
<head>
<meta http-equiv=Cache-Control content=no-cache forua=true/></head>
<card id=index title=Главная страница>
<p align="center">
<?
echo "<a href=show_cat1.php>Категория1</a><br/><a href=show_cat1.php>Категория1</a><br/><a href=show_cat1.php>Категория1</a><br/>";
?>
</p>
</card></wml>

Броузер выдают ошибку XML-документа.

   
 
 автор: zavragnov   (02.10.2007 в 10:21)   письмо автору
 
   для: coloboc66   (02.10.2007 в 09:51)
 

надо было еще заголовок послать


<?php 
header
("Content-type: text/vnd.wap.wml");

echo 
'<?xml version="1.0"?>';
echo 
"\r\n";

echo 
'<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" "http://www.wapforum.org/DTD/wml13.dtd">';
echo 
"\r\n";

echo 
'<wml>';
?>

   
 
 автор: coloboc66   (02.10.2007 в 10:33)   письмо автору
 
   для: zavragnov   (02.10.2007 в 10:21)
 

to zavragnow:
Так в вашем примере этому файлу можно присвоить расширение *.wml ?

   
 
 автор: zavragnov   (02.10.2007 в 14:58)   письмо автору
 
   для: coloboc66   (02.10.2007 в 10:33)
 

с помощью modRewrite


RewriteEngine on 
Options +FollowSymlinks 
RewriteBase / 
RewriteRule index.wml /index.php

   
 
 автор: Unkind   (02.10.2007 в 15:11)   письмо автору
 
   для: coloboc66   (02.10.2007 в 09:51)
 

Ну как вап-броузеру всё-равно расширение?
Всё равно! Забудьте про расширение. В Вашем примере много ошибок, связанных с тем, что Вы не берете значения атрибутов в кавычки.
Писать "<a href=show_cat1.php>Категория1</a>" нельзя.
Нужно писать


<a href="show_cat1.php">Категория1</a>


Тоже самое с другими тегами.

   
 
 автор: coloboc66   (02.10.2007 в 15:49)   письмо автору
 
   для: Unkind   (02.10.2007 в 15:11)
 

Ну вот тут нет ошибок, кажется, всё-равно РНР-код не работает.:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd"> 
<wml>
<head> 
<meta http-equiv="Cache-Control" content="no-cache" forua="true"/></head> 
<card id="index" title="Главная страница"> 
<p align="center"> 
<?php
header
("Content-type: text/vnd.wap.wml"); //тут не знаю - надо-ли?
echo '<a href="show_cat1.php">Категория1</a><br/><a href="show_cat2.php">Категория2</a><br/><a href="show_cat3.php">Категория3</a><br/>'
?> 
</p> 
</card>
</wml>

   
 
 автор: Unkind   (02.10.2007 в 16:38)   письмо автору
 
   для: coloboc66   (02.10.2007 в 15:49)
 

Надо отправлять заголовки ДО вывода тела документа.

   
 
 автор: zavragnov   (03.10.2007 в 10:46)   письмо автору
 
   для: coloboc66   (02.10.2007 в 15:49)
 

Заголовки надо посылать первыми, а уже потом все остальное выводить в браузер, либо использовать буферизацию вывода, если нет возможности послать их первыми!


<?php 
header
("Content-type: text/vnd.wap.wml"); 
?>  
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.2//EN" "http://www.wapforum.org/DTD/wml12.dtd">  
<wml> 
<head>  
<meta http-equiv="Cache-Control" content="no-cache" forua="true"/></head>  
<card id="index" title="Главная страница">  
<p align="center">  
<?php 
echo '<a href="show_cat1.php">Категория1</a><br/><a href="show_cat2.php">Категория2</a><br/><a href="show_cat3.php">Категория3</a><br/>';  
?>  
</p>  
</card> 
</wml> 

   
 
 автор: coloboc66   (03.10.2007 в 11:41)   письмо автору
 
   для: zavragnov   (03.10.2007 в 10:46)
 

Я ничего не понимаю: ваш вышеприведенный код, zavragnov, не работает, если его сохранить как index.wml, но работает, если его сохранить как index.php. Вы писали, что нужно использовать RewriteRule Проверил - на самом деле так. В то же время Unkind упорно утверждает, что браузер расширение не интересует. Уважаемый Unkind, приведите пожалуйста пример файла *.wml со вставленным в него РНР-кодом. Я уже два дня мучаюсь, и никак не добьюсь правды с этим вопросом. А вопрос такой: как встроить код РНР в файл с расширением *.wml ?

   
 
 автор: Владимир55   (02.10.2007 в 00:28)   письмо автору
 
   для: coloboc66   (30.07.2007 в 16:42)
 

У меня на сайте стоит такая штука.
Вопрос уникальности ссылки я решил очень просто: пароль, входящий в состав ссылки, действует только один раз. То есть после входа по этому паролю он вычеркивается из списка действующих паролей.

   
 
 автор: coloboc66   (06.10.2007 в 22:28)   письмо автору
 
   для: Владимир55   (02.10.2007 в 00:28)
 

Да - извиняюсь перед всеми, всё получается так, как ВЫ и писали. Просто я, дурак, пользовался для написания скриптов в UTF-8 Блокнотом от Виндовс. Этого делать нельзя, оказывается.... Попутный вопрос - как лучше писать под UTF-8, что использовать? И смогут ли русскоязычные посетители сайта без проблем пользоваться моими скриптами в такой кодировке?

   
 
 автор: coloboc66   (24.10.2007 в 15:22)   письмо автору
 
   для: coloboc66   (06.10.2007 в 22:28)
 

Вот на такую ссылку Опера реагирует нормально:
<a href="http://somehost.com/wap/download.php?itemid=000001">Скачать</a>
А симулятор вап-броузера даёт ошибку 413 (слишком длинный запрос). Почему?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования