Я собираюсь продавать приложение на allsoft и возникает необходимость сделать выдачу полной версии программы по лицензионному ключу. В PHP разбираюсь не очень хорошо, сделал простой скрипт, который это реализует. Пожалуйста, посмотрите на него - есть ли какие-нибудь подводные камни у Apache\PHP которые позволят обходным путём получить этот файл или вторгнуться в БД? В папке private находятся exe-шники программ. Также там находится .htaccess, который блокирует доступ в эту папку по обычным запросам: Код (Text): Deny from all Далее - пользователь может составить get-запрос к файлу get.php, который проверяет ключ на наличие в таблице и выдаёт файл если всё впорядкe PHP: <?php $servername = "localhost"; $username = "username"; $password = "password"; $db = "db"; $dbh = new PDO("mysql:host=$servername;dbname=$db", $username, $password); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $key = $_GET["key"]; $version = (int) $_GET["version"]; $stmt = $dbh->prepare("SELECT count(*) FROM `serial_keys` WHERE `key_str`= :kk"); $stmt->bindParam(":kk", $key); $stmt->execute(); $number_of_rows = $stmt->fetchColumn(); if($number_of_rows == 1){ $file = "private/$version.exe"; header('Content-Type: application/octet-stream'); header("Content-Transfer-Encoding: Binary"); header("Content-disposition: attachment; filename=\"App.exe\""); header('Content-Length: ' . filesize($file)); readfile("$file"); }else{ echo "Неверный ключ!"; } Запрос вида site.com/get.php?key=DDD-XXX-BBB&version=1
Ещё можно пометить ключ в базе как использованный. Но лучше сделать защиту в самой программе и раздавать её без ключа, ключ требовать при запуске.
@kciray8 в принципе это должно работать. только продумай случаи когда кто-то засветил ссылку с ключем. она не должна работать бесконечно и для всех. надо её экспарить. Денис правильно подсказывает: лучше если программа будет сама контролировать ключ. Продавай ключ активации. Пусть прога выдаёт некий machine id, который пользователь будет сообщать на сайте регистрации, в ответ получая код активации. у тебя будет функция выдачи лицензии f(machine_id, prog_version_id) => activation_code а внутри проги функция f(machine_id, prog_version_id, activation_code) => true|false для проверки правильности лицензии про то как идентифицировать комп можно нагуглить. например побыстрому нашлось: http://www.nextofwindows.com/the-best-way-to-uniquely-identify-a-windows-machine http://stackoverflow.com/questions/2004666/get-unique-machine-id
@artoodetoo не думаю что нужно идентифицировать комп, просто сделать разовую ссылку для скачивания файла через обработчик где нужно ткнуть кнопку скачать файл, при этом когда тыкают на эту кнопку первым делом должен отправится, аякс запрос на обработчик который и удалит данную ссылку для доступа к скачиванию файла, а после запусится скачивание файла. Думаю лучше такой алгоритм написать чисто скачать можно будет только один раз по данной ссылке. А ещё классно что если ссылок вообще не будет существовать, их тупо выдают по факту, заплатил на сгенерированную ссылку, после скачивания удалить ссылку и всё.
я вот подумал, как это сделать без проверок всяких. Ещё не пробовал. Но мне кажется, что прокатит. Надо просто создавать ярлычок на файл. Сервер отдаст файл, а раз в час проходить и убивать ярлчки, которые слишком старые.
не. если чексумить это уже некие скрипты и логика. Я же предлагаю способ, при котором всё происходит "само собой".
@igordata не надо там не чего считать, какой хеш какой крон. смотрите. Алгоритм. Выдаём чуваку ссылку, он на неё заходит создаётся файл, не знаю и записывается имя файла в бд, к примеру, и в сессию записываем уникальный идентификатор текущего зашедшего на эту ссылку, после чувак там качает файл делает что хочет, а после, когда он уходит с этой странички, ну то есть закрывает сессию, файл удаляется нахрен. Ну правда погрешность, если он случайно закроет то всё тютю :'D ну да мой способ не очень :'D
@askanim ты в своем способе не на этом внимание акцентировал. Стало быть ты не в курсе что на дисках место может кончиться если постоянно копировать файлы для всех желающих их скачать. И более того - для каждой сессии каждого желающего скачать. Очаровательное решение.
это если мы под каждого индивидуальные файлы создаём. Тут можно отдать сразу из пхп даже. А я описал решение для ситуации, когда файлы уже есть, их надо кому-то давать, а кому-то не давать. И вот можно волшебным образом создавать уникальные ссылки.
@igordata как запретить скачивание файла ? Вообще в принципе, если вводишь прямую ссылку на файл, он тупо браузером начинает тянуться, это на уровне сервера настраивается? --- Добавлено --- @Ganzal А чистить после закачки не вариант?
@askanim, конечно есть настройка сервера. Для apache это делается в .htaccess: http://htaccess.net.ru/doc/htaccess/order.php. Для ngnix тоже можно аналог найти наверняка
можно расположить сами файлы вне документрута, а в документруте будут проявляться только симлинки. Симлинк со специфическим именем, естественно, чтоб веб-сервер по этому имени сначала проверил авторизацию загрузки, а потом... прочитал симлинк как обычный файл в поток. Не нужно дергать никакой скриптовый язык для вычитки файла побайтно - веб-сервер сам с этим справится без дополнительной нагрузки. Чистить что? КОПИЮ ФАЙЛА удалить или симлинк? КОПИЯ ФАЙЛА будет весить столько же, сколько ОРИГИНАЛЬНЫЙ ФАЙЛ. Симлинк же будет плюс-минус кол-во символов с полному пути к ОРИГИНАЛУ в файловой системе.
Генерируй ключ программой, заноси его в базу и активируй по запросу. Получается, первым делом продаешь ключ а уже потом при запросе к файлу проверишь есть ли этот ключ в базе и активен ли он. Копируешь файл давая ему оригинальное имя и генерируешь к нему линк. Вообще лучше лицензию делать в самой программе, иначе скачав 1 раз ее можно будет размножить
А что получилось у тебя? Целая база, сохранения, проверки на существования ключа, потом файла, потом ты генерируешь ссылку и только потом отдаешь ее и затираешь - это еще куча проверок и шлака. Решение довольно проще, файлы уже загружены. Без проверок можно сделать ярлык на файл с хешем по дате последней модификации и солью с уником пользователя которому отдаем файлик, после скачивания затирать ярлык и дату модификации и так постоянно кто скачивает файл, оно само работает, даже крон не нужен.
ты ответь на вопрос, пожалуйста. Я ж не умею читать мысли, и не знаю, как ты файлы создаёшь. Я не рассматривал ситуацию, когда файлы надо создавать. В моём решении файлы уже существуют. Моё решение создаёт одноразовые уникальные ссылки с помощью системных утилит. Без скриптов, условий, сравнений и прочего. Так что я не знаю ни как ты удаляешь файлы, ни как ты их создаёшь.
@rodent90 привет родент я из 2016 года, уже существует замечательная функция PHP: password_hash(); Какая соль какой уник... Очнись дружище. https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php bcrypt Жми твоя самая первая в этом топе, да найдёшь ты там спасение.