我有一个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#应用程序也很混乱。
我该如何解决?
任何帮助将不胜感激。
谢谢!
答案 0 :(得分:0)
正如M.Hassan在评论中所说,我可以在PHP脚本中加密“当前时间”值,并以JSON或XML返回它们,然后解密JSON / XML输出(基于我在C#应用程序中的PHP脚本),然后检查if the decrypted JSON/XML time = the current time
验证是否正确。