Задать вопрос
@maryaTurova

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

При покупке программы "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);
?>

Как бы при тесте вроде все работает. Но смущает много строк....да и со sql опыта мало, не говоря уже о PDO.
Знаю что это не 100% защита.
Может у кого есть опыт работы по типу выдачи лицензий под конкретную машину?
Ну или может можно как-то всё проще сделать?
  • Вопрос задан
  • 266 просмотров
Подписаться 3 Средний 20 комментариев
Решения вопроса 1
Griboks
@Griboks
Полная привязка к серверу на каждую кнопку. Выполнение всех критически важных операций на сервере. Тонкий клиент. Так вы сможете защититься от всевозможных домашних хакеров и усложнить жизнь пользователей в 10 раз.

p.s.
+ Постоянные обновления, которые меняют механизм взаимодействия с сервером.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Ни один программный способ еще никому не давал 100% защиты. Люди аппаратные ключи отламывают.
Ненужную программу ломать не будут. Непопулярную программу ломать не будут. Не тратьте на защиту слишком много времени - если программа merde - ее в любом случае не купят :)
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Составьте нормальную лицензию. Этого достаточно.
Все программные способы туфта
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы