Как правильно осуществить продажу программы для каждой машины с тестовым периодом?
При покупке программы "exe" (Python+Cython) идет запись в bd на удаленный сервер с датой окончания, данными юзера, пустым uuid ,и пустым именем OC.
Если пользователь просто скачал , то тест на 1 день с записью в бд.
php на сервере
<?php header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, Authorization, Access-Control-Allow-Methods, Access-Control-Request-Headers'); if(is_array(($obj = json_decode(urldecode(file_get_contents('php://input')), true))) && json_last_error() == JSON_ERROR_NONE) $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = @$_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)){ $ip = $client; } else if(filter_var($forward, FILTER_VALIDATE_IP)){ $ip = $forward; } else{ $ip = $remote; } $real_time = time(); $answer = array('status' => false, 'msg' => 'Not valid data'); if (isset($obj['mail'])){ $mail = $obj['mail']; if (isset($obj['key'])){ $key = htmlspecialchars($obj['key']); if (preg_match("/^[a-zA-Z0-9]{30}$/", $key)){ if (isset($obj['uuid'])){ $uuid = $obj['uuid']; if (isset($obj['name_os'])){ $name_os = $obj['name_os']; if (isset($obj['bot_name'])){ $bot_name = $obj['bot_name']; include ('../bd.php'); $users = mysqli_fetch_array( mysqli_query( $db," SELECT * FROM `Paid_Bots` WHERE `bot_name`='$bot_name' and `uuid`='$uuid' and `name_os`='$name_os' ") ); // если есть совпадение if($users['uuid']){ // если логин и пароль совпадает if($users['mail'] == $mail and $users['access_key'] == $key){ // если срок лицензии не истек if(strtotime($users['license_date']) > $real_time){ mysqli_query ( $db," UPDATE `Paid_Bots` SET `date_last_request`=NOW() WHERE `uuid`='$uuid' and `name_os`='$name_os' and `bot_name`='$bot_name' "); $answer['status'] = true; } else{ // истек срок лицензии $answer['msg'] = 'The license has expired.n You can extend it on your dashboard.'; } } else{ // для этой машины другие учетные данные $answer['msg'] = 'The PC is not linked to these credentials.'; } } else{ $users = mysqli_fetch_array( mysqli_query( $db," SELECT * FROM `Paid_Bots` WHERE `mail`='$mail' and `access_key`='$key' and `bot_name`='$bot_name' ") ); // если есть данные юзера if($users['mail']){ // если покупка совершенна, но программа еще не запускалась if($users['uuid'] == '' and $users['name_os'] == ''){ mysqli_query ( $db," UPDATE `Paid_Bots` SET `uuid`='$uuid', `name_os`='$name_os', WHERE `uuid`='' and `name_os`='' and `bot_name`='$bot_name' and `mail`='$mail' and `access_key`='$key' "); $answer['status'] = true; } else{ // тест на 1 день для новой машины mysqli_query( $db," INSERT INTO `Paid_Bots`(`license_date`,`bot_name`,`mail`,`access_key`,`uuid`,`name_os`,`ip`) VALUES (TIMESTAMPADD(DAY,1,CURRENT_TIMESTAMP()),'$bot_name','$mail','$key','$uuid','$name_os','$ip') "); } } else{ // тест на 1 день mysqli_query( $db," INSERT INTO `Paid_Bots`(`license_date`,`bot_name`,`mail`,`access_key`,`uuid`,`name_os`,`ip`) VALUES (TIMESTAMPADD(DAY,1,CURRENT_TIMESTAMP()),'$bot_name','$mail','$key','$uuid','$name_os','$ip') "); } } } } } } } } echo json_encode($answer); ?> |
<?php header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type, Authorization, Access-Control-Allow-Methods, Access-Control-Request-Headers'); if(is_array(($obj = json_decode(urldecode(file_get_contents('php://input')), true))) && json_last_error() == JSON_ERROR_NONE) $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = @$_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)){ $ip = $client; } else if(filter_var($forward, FILTER_VALIDATE_IP)){ $ip = $forward; } else{ $ip = $remote; } $real_time = time(); $answer = array('status' => false, 'msg' => 'Not valid data'); if (isset($obj['mail'])){ $mail = $obj['mail']; if (isset($obj['key'])){ $key = htmlspecialchars($obj['key']); if (preg_match("/^[a-zA-Z0-9]{30}$/", $key)){ if (isset($obj['uuid'])){ $uuid = $obj['uuid']; if (isset($obj['name_os'])){ $name_os = $obj['name_os']; if (isset($obj['bot_name'])){ $bot_name = $obj['bot_name']; include ('../bd.php'); $users = mysqli_fetch_array( mysqli_query( $db," SELECT * FROM `Paid_Bots` WHERE `bot_name`='$bot_name' and `uuid`='$uuid' and `name_os`='$name_os' ") ); // если есть совпадение if($users['uuid']){ // если логин и пароль совпадает if($users['mail'] == $mail and $users['access_key'] == $key){ // если срок лицензии не истек if(strtotime($users['license_date']) > $real_time){ mysqli_query ( $db," UPDATE `Paid_Bots` SET `date_last_request`=NOW() WHERE `uuid`='$uuid' and `name_os`='$name_os' and `bot_name`='$bot_name' "); $answer['status'] = true; } else{ // истек срок лицензии $answer['msg'] = 'The license has expired.n You can extend it on your dashboard.'; } } else{ // для этой машины другие учетные данные $answer['msg'] = 'The PC is not linked to these credentials.'; } } else{ $users = mysqli_fetch_array( mysqli_query( $db," SELECT * FROM `Paid_Bots` WHERE `mail`='$mail' and `access_key`='$key' and `bot_name`='$bot_name' ") ); // если есть данные юзера if($users['mail']){ // если покупка совершенна, но программа еще не запускалась if($users['uuid'] == '' and $users['name_os'] == ''){ mysqli_query ( $db," UPDATE `Paid_Bots` SET `uuid`='$uuid', `name_os`='$name_os', WHERE `uuid`='' and `name_os`='' and `bot_name`='$bot_name' and `mail`='$mail' and `access_key`='$key' "); $answer['status'] = true; } else{ // тест на 1 день для новой машины mysqli_query( $db," INSERT INTO `Paid_Bots`(`license_date`,`bot_name`,`mail`,`access_key`,`uuid`,`name_os`,`ip`) VALUES (TIMESTAMPADD(DAY,1,CURRENT_TIMESTAMP()),'$bot_name','$mail','$key','$uuid','$name_os','$ip') "); } } else{ // тест на 1 день mysqli_query( $db," INSERT INTO `Paid_Bots`(`license_date`,`bot_name`,`mail`,`access_key`,`uuid`,`name_os`,`ip`) VALUES (TIMESTAMPADD(DAY,1,CURRENT_TIMESTAMP()),'$bot_name','$mail','$key','$uuid','$name_os','$ip') "); } } } } } } } } echo json_encode($answer); ?>
Как бы при тесте вроде все работает. Но смущает много строк....да и со sql опыта мало, не говоря уже о PDO.
Знаю что это не 100% защита.
Может у кого есть опыт работы по типу выдачи лицензий под конкретную машину?
Ну или может можно как-то всё проще сделать?
Дополнительно:
Можно найти программиста на С который соберет для вас бинарник где и будут те все нужные проверки в виде функции. А чтоб никто бинарник не выкинул из проекта - надо туда еще парочку бизнес-функций вставить. Таких значимых чтоб без них ничего не работало.
Сама программа и так закомпилирована, но при старте делает запрос на сервер
вот в этой фразе для меня вообще ноль информации. Я не знаю что добавить. Может вы имеете в виду что кроме PHP есть еще что то?
Какой смысл покупать откровенный говнокод?
Какой смысл защищать решето?
тогда надо тегировать топик С++ и ходить в форум к си-плюс-плюсникам и спрашивать у них
передовые методы защиты. Это будет самое правильное. Ваша отправка чего-то там на сервер
при каждом запуске - это фигня полная.
выглядит мягко говоря не очень
Знаю. Я же написал что навыка практически нет.
Ваша отправка чего-то там на сервер
при каждом запуске - это фигня полная.
Естественно я могу ее привязать к железу сразу. Но клиенты такого рода программ запускают и на временных VPS у которых срок службы не более 1 мес.
На сервер решил - чтобы клиент мог из личного кабинете без проблем перепривязать к другой машине.
стоит посмотреть что такое sql injection и что такое prepared statement как минимум.
В общем запросы переписал на PDO->prepare.
обернул в функцию
function prepared_query($mysqli, $sql, $params, $types = ""){ $types = $types ?: str_repeat("s", count($params)); $stmt = $mysqli->prepare($sql); $stmt->bind_param($types, ...$params); $stmt->execute(); return $stmt; } |
function prepared_query($mysqli, $sql, $params, $types = ""){ $types = $types ?: str_repeat("s", count($params)); $stmt = $mysqli->prepare($sql); $stmt->bind_param($types, ...$params); $stmt->execute(); return $stmt; }
По поводу sql injection - поставил ток проверки всякие , для почты - FILTER_VALIDATE_EMAIL, для всего остального preg_match. Не знаю достаточно ли этого.
Но все равно спасибо за наводку и что камнями не кидались.
Я еще криптографию прикрутил в обе стороны. Так что членовредитель не увидит какие данные уходят и приходят.
Полная привязка к серверу на каждую кнопку. Выполнение всех критически важных операций на сервере. Тонкий клиент. Так вы сможете защититься от всевозможных домашних хакеров и усложнить жизнь пользователей в 10 раз.
p.s.
+ Постоянные обновления, которые меняют механизм взаимодействия с сервером.
- Отвал тырнета - и фсе, программа превратилась в тыкву. Добро, если ее функционал на тырнет завязан - нет тырнета - нет работы, а если нет? Маты в саппорт, отказ от программы, отзывы всюду где только можно с описанием какое программа merde.
StarForce помните? Помните, конечно же. Там тоже вроде как благие были намерения и оно даже поначалу работало (пока не вскрыли его архитектурный недостаток). Я сам помню, как постоянно матерился - игра стартует... и не может проверить диск. Игра, честная, лицензионная.
А когда был переход с XP на win7 - пришлось втупую ломать защиту, потому что не было его под win7...Серьезные ребята берут не аппаратной защитой, а качеством продукта, обновлениями и саппортом.
Ответы:
Ни один программный способ еще никому не давал 100% защиты. Люди аппаратные ключи отламывают.
Ненужную программу ломать не будут. Непопулярную программу ломать не будут. Не тратьте на защиту слишком много времени - если программа merde - ее в любом случае не купят :)
Составьте нормальную лицензию. Этого достаточно.
Все программные способы туфта
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для осуществления продажи программы для каждой машины с тестовым периодом, вам потребуется реализовать следующие шаги:
1. Создайте базу данных, где будет храниться информация о пользователях, машинах и программе.
2. Разработайте алгоритм регистрации пользователей и их машин в системе.
3. Реализуйте механизм предоставления тестового периода для каждой машины после регистрации.
4. Создайте интерфейс для пользователей, где они смогут выбрать программу для своей машины.
5. Разработайте систему оплаты, которая позволит пользователям приобретать программу после окончания тестового периода.
Пример кода на PHP для реализации функции начала тестового периода для машины:
Это лишь общая концепция решения задачи. Вам также потребуется продумать множество других аспектов, таких как безопасность данных, монетизация программы и т.д. Надеюсь, данная информация поможет вам правильно осуществить продажу программы для каждой машины с тестовым периодом.