Как правильно осуществить продажу программы для каждой машины с тестовым периодом?

Ссылка скопирована
4 февраля 2026 1 ответ

При покупке программы "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% защита.
Может у кого есть опыт работы по типу выдачи лицензий под конкретную машину?
Ну или может можно как-то всё проще сделать?

Дополнительно:

Можно найти программиста на С который соберет для вас бинарник где и будут те все нужные проверки в виде функции. А чтоб никто бинарник не выкинул из проекта - надо туда еще парочку бизнес-функций вставить. Таких значимых чтоб без них ничего не работало.

  • mayton2019, А если клиент решил переехать на другую машину или просто поставил другую ОС?
  • mayton2019, Сама программа и так закомпилирована, но при старте делает запрос на сервер
  • maryaTurova, вы когда ему проадете лицензию - указываете на что она. И какие изменения в железе будут допустимы для сохранения лицензии. Вот Microsoft раньше позволял заменить 3 железки с сохранением. Щас как - не знаю.
  • maryaTurova,

    Сама программа и так закомпилирована, но при старте делает запрос на сервер

    вот в этой фразе для меня вообще ноль информации. Я не знаю что добавить. Может вы имеете в виду что кроме PHP есть еще что то?

  • Ну очень смешно. Вся прога просто утыкана SQL инъекциями, но мы еще что-то лепечем про продажу и защиту.
    Какой смысл покупать откровенный говнокод?
    Какой смысл защищать решето?
  • mayton2019, Естественно, человек знает что он берет.
  • Ипатьев, Это мне не совсем понятно.Прога утыкана SQL инъекциями? так говорите будто знаете исходники. Вы бы лучше подсказали что не так.
  • mayton2019, Прога в exe (не php)....создает профили браузера и автоматизирует в нем действия с помощью Selenium . Но перед запуском делает запрос на удаленный сервер (код php) в виде json с данными по железу и клиента.
  • maryaTurova, наверное речь идет про тот код что вы привели. а вот он действительно выглядит мягко говоря не очень
  • maryaTurova, не стало яснее. Скажите на чем написана "прога"? Вот если она написана на С++
    тогда надо тегировать топик С++ и ходить в форум к си-плюс-плюсникам и спрашивать у них
    передовые методы защиты. Это будет самое правильное. Ваша отправка чего-то там на сервер
    при каждом запуске - это фигня полная.
  • Дмитрий,

    выглядит мягко говоря не очень

    Знаю. Я же написал что навыка практически нет.

  • mayton2019,

    Ваша отправка чего-то там на сервер
    при каждом запуске - это фигня полная.

    Естественно я могу ее привязать к железу сразу. Но клиенты такого рода программ запускают и на временных VPS у которых срок службы не более 1 мес.
    На сервер решил - чтобы клиент мог из личного кабинете без проблем перепривязать к другой машине.

  • maryaTurova, ну вот стоит посмотреть что такое sql injection и что такое prepared statement как минимум.
  • maryaTurova, я думаю что для игр с виртуалками у механизмов регистрации тоже есть свое коробочное решение.
  • Перенесите часть бизнес-логики на сервер
  • Григорий Боев, так я что и пытаюсь сделать.
  • Дмитрий,

    стоит посмотреть что такое 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. Не знаю достаточно ли этого.
    Но все равно спасибо за наводку и что камнями не кидались.

  • maryaTurova, если вы используете prepared statement то этого достаточно от sql injection. Ибо сама схема работы подготовленных выражений заключается в том что запрос и данные для него идут отдельно друг от друга. и пошутить на тему моего сына зовут "Tommy'; DROP TABLE students;" уже не получится
  • Дмитрий, Ок. Спасибо.
    Я еще криптографию прикрутил в обе стороны. Так что членовредитель не увидит какие данные уходят и приходят.
  • Полная привязка к серверу на каждую кнопку. Выполнение всех критически важных операций на сервере. Тонкий клиент. Так вы сможете защититься от всевозможных домашних хакеров и усложнить жизнь пользователей в 10 раз.

    p.s.
    + Постоянные обновления, которые меняют механизм взаимодействия с сервером.

    • Отвал тырнета - и фсе, программа превратилась в тыкву. Добро, если ее функционал на тырнет завязан - нет тырнета - нет работы, а если нет? Маты в саппорт, отказ от программы, отзывы всюду где только можно с описанием какое программа merde.
      StarForce помните? Помните, конечно же. Там тоже вроде как благие были намерения и оно даже поначалу работало (пока не вскрыли его архитектурный недостаток). Я сам помню, как постоянно матерился - игра стартует... и не может проверить диск. Игра, честная, лицензионная.
      А когда был переход с XP на win7 - пришлось втупую ломать защиту, потому что не было его под win7...

      Серьезные ребята берут не аппаратной защитой, а качеством продукта, обновлениями и саппортом.

    Ответы:

    Ни один программный способ еще никому не давал 100% защиты. Люди аппаратные ключи отламывают.
    Ненужную программу ломать не будут. Непопулярную программу ломать не будут. Не тратьте на защиту слишком много времени - если программа merde - ее в любом случае не купят :)

    Составьте нормальную лицензию. Этого достаточно.
    Все программные способы туфта

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Андрей PHP Ответ

    Для осуществления продажи программы для каждой машины с тестовым периодом, вам потребуется реализовать следующие шаги:

    1. Создайте базу данных, где будет храниться информация о пользователях, машинах и программе.
    2. Разработайте алгоритм регистрации пользователей и их машин в системе.
    3. Реализуйте механизм предоставления тестового периода для каждой машины после регистрации.
    4. Создайте интерфейс для пользователей, где они смогут выбрать программу для своей машины.
    5. Разработайте систему оплаты, которая позволит пользователям приобретать программу после окончания тестового периода.

    Пример кода на PHP для реализации функции начала тестового периода для машины:

     

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно