具有PHP后端的C#应用​​程序的许可系统

时间:2018-08-11 19:19:47

标签: c# php

我有一个C#应用程序,我想通过检查来自远程PHP脚本的响应来为其创建许可系统。

我的C#部分:

/* License check */
            try
            {
                string URI = "https://example.com/licensing.php";
                WebClient client = new WebClient();
                    System.Collections.Specialized.NameValueCollection postData =
                        new System.Collections.Specialized.NameValueCollection()
                   {
                          { "secret", "Secret123" },  
                          { "license", "license123" }
                   };
                    string pagesource = Encoding.UTF8.GetString(client.UploadValues(URI, postData));
                    LicenseCheck licensecheck = JsonConvert.DeserializeObject<LicenseCheck>(pagesource);

                    if (licensecheck.secret == "Secret123")
                    {
                        if (licensecheck.valid != true)
                        {
                            Console.WriteLine("[ERROR] Invalid license.");
                            Console.ReadKey();
                            Environment.Exit(0);
                        }
                    }
                    else
                    {
                        Console.WriteLine("[ERROR] Invalid license.");
                        Console.ReadKey();
                        Environment.Exit(0);
                    }
            }
            catch
            {
                Console.WriteLine("[ERROR] Invalid license.");
                Console.ReadKey();
                Environment.Exit(0);
            }

我的PHP部分:

<?php
error_reporting(0);

if( !isset($_POST['secret']) || empty($_POST['secret']) || $_POST['secret'] !== "Secret123" ) {
    die();
}

if( !isset($_POST['license']) || empty($_POST['license']) ) {
    die();
}

header('Content-Type: application/json');

$servername = "localhost";
$username = "user";
$password = "password";
$dbname = "dbname";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die();
} 

$result = $conn->query("SELECT * FROM licenses WHERE license='".$_POST['license']."'");

if($result->num_rows > 0) {
    echo json_encode(array(
        'valid' => true,
        'secret' => $_POST['secret']
    ));
    die();
} else {
    echo json_encode(array(
        'valid' => false,
        'secret' => $_POST['secret']
    ));
    die();
}
$conn->close();
?>

因此,这可以通过将C#应用程序的许可证输入与secret(例如Secret123)一起发送到远程PHP脚本来实现。

之后,PHP脚本将返回如下的JSON数据:

{"valid":true,"secret":"Secret123"}

现在,我的C#应用​​程序将验证JSON == {Secret123中输出的机密是否为真-如果是,则它将验证valid是否为真。

但是我的程序因更改hosts文件并欺骗我的PHP脚本服务器而被破解。

如何?因此,破解者使用了像Fiddler这样的HTTP调试器,尽管我正在使用secret来加密POST数据,但他知道POST字段https的值。

编辑:当然,我的C#应用​​程序也很混乱。

我该如何解决?

任何帮助将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:0)

正如M.Hassan在评论中所说,我可以在PHP脚本中加密“当前时间”值,并以JSON或XML返回它们,然后解密JSON / XML输出(基于我在C#应用程序中的PHP脚本),然后检查if the decrypted JSON/XML time = the current time验证是否正确。