我试图了解许可证密钥将如何工作,以及如何绕过它来验证php



我试图理解下面的代码是如何准确地验证许可密钥的,它可以在php文件中绕过它自己来放置自己的许可密钥并得到验证

<?php
session_start();
if (!function_exists('curl_init')) {
die('cURL is not available on your server! Please enable cURL to continue the installation. You can read the documentation for more information.');
}
function currentUrl($server)
{
$http = 'http';
if (isset($server['HTTPS'])) {
$http = 'https';
}
$host = $server['HTTP_HOST'];
$requestUri = $server['REQUEST_URI'];
return $http . '://' . htmlentities($host) . '/' . htmlentities($requestUri);
}
$current_url = currentUrl($_SERVER);
if (isset($_POST["btn_purchase_code"])) {
$_SESSION["purchase_code"] = $_POST['purchase_code'];
$response = "";
$url = "http://jobsearchers.in/api/license?purchase_code=" . $_POST['purchase_code'] . "&domain=" . $current_url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
if (empty($response)) {
$url = "http://jobsearchers/api/license?purchase_code=" . $_POST['purchase_code'] . "&domain=" . $current_url;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
}
$data = json_decode($response);
if (!empty($data)) {
if ($data->status == "300" || $data->status == "400") {
$_SESSION["error"] = "Invalid purchase code!";
} else {
$_SESSION["status"] = $data->status;
$_SESSION["license_code"] = $data->license_code;
header("Location: folder-permissions.php");
exit();
}
} else {
$_SESSION["error"] = "Invalid purchase code!";
}
}
?>

我尝试删除curl并将我自己的密钥放在$data位置,如$data = 123456789,并试图验证它不工作。

在这段代码中,应用程序发送一个带有purchase_code的HTTP请求,并获得license_code。

这比在设备上硬编码许可代码更好,以避免用户共享许可代码。

让我们假设返回的license_code没有得到验证,在这种情况下,您可以更改脚本以执行以下操作:

<?php
session_start();
if (isset($_POST["btn_purchase_code"])) {
$_SESSION["purchase_code"] = $_POST['purchase_code'];
$_SESSION["status"] = 200;
$_SESSION["license_code"] = "fake_license_code";
header("Location: folder-permissions.php");
exit();
}
?>

然而,上面的代码所做的只是欺骗服务器的响应,通常存在某种"相关性"。在你的purchase_code和license_code之间,只有开发者知道,他们使用这些知识来验证你的许可代码是否与购买代码匹配。

如果你这样做是出于恶意,那就太遗憾了,但如果你这样做是为了使你的应用程序不被破解,那么你必须找到一种方法来本地验证"许可代码"。并确保它是服务器发送的有效代码,这可以通过使用服务器的私钥对代码进行签名来完成,这将使其无法复制。

我最喜欢的创建唯一可验证令牌或许可代码的方法是JWT。

您可以使用JWT创建一个包含时间戳、purchase_code和其他信息的令牌,然后使用私钥对其签名,使其无法复制。客户端可以通过公钥验证签发者。

TL;博士:如果没有额外的步骤来验证license_code,那么上面的代码片段将只能工作,这是不太可能的。验证license_code是否为服务器共享的一个好步骤是用私钥对其签名。

最新更新