Inno Setup 密码验证通过 HTTP Post

Inno Setup password verification via HTTP Post

有人可以帮助我在 Inno Setup 中验证密码吗,我目前有以下 Inno Setup 代码(在这个网站上找到),我想做的是根据服务器上保存的密码检查密码。

我有一个 PHP 页面包含 MySQL 代码来检查数据库,如果找到密码,它将发送“正确”的响应 如果找不到密码 returns ‘密码被拒绝。

我认为问题是设置没有在 WinHttpReq.Send(密码)部分发送密码。

我在下面包含了 Inno Setup 代码和 PHP 代码。

如果我在代码中输入真实密码 WHERE password='genuine licence' 我得到了正确的响应并且安装继续。

function CheckPassword(Password: String): Boolean;
var
  returnvalue: boolean;
  WinHttpReq: Variant;
begin
  result := false;
  MsgBox (password, mbInformation, MB_OK);  //show entered password before send
  WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
  WinHttpReq.Open('POST', 'website.php', false);
  WinHttpReq.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  WinHttpReq.Send (Password);

  if WinHttpReq.ResponseText = 'Correct !' then
    result := true;

  if WinHttpReq.ResponseText = 'Access Denied !' then
    result := false;
end;    

和PHP代码

$password = $_POST["password"];
$sql = "SELECT * FROM clients WHERE password='$password'";
if ($result=mysqli_query($conn,$sql))
{
    $rowcount=mysqli_num_rows($result);
    if($rowcount ==0)
    {
        die("Password Denied !");
    }
    if($rowcount==1)
    {
        die("Correct !");
    }

我最终想发送两位信息进行验证,但我想先让上面的工作正常。

如有任何帮助,我们将不胜感激。

  1. 服务器主机名在哪里?如果您不指定密码应该发送到哪里,这怎么可能工作?

    WinHttpReq.Open('POST', 'https://www.example.com/website.php', false);
    
  2. 您按原样发送密码。当您将 Content-Type 指定为 application/x-www-form-urlencoded 时。此内容类型具有特定格式,必须至少包含一个参数名称。 PHP 还怎么知道该字段名为 password

    WinHttpReq.Send('password=' + Password);
    

    但要使其正常工作,您还必须对密码进行 URL 编码。

    更简单的方法可能是按原样写入密码(正如您已经在做的那样)并在服务器端读取原始请求数据:

    $password = file_get_contents("php://input");
    
  3. 您确实需要保护您的服务器端代码免受 SQL injection.

  4. 为了安全起见,您应该发送密码校验和。例如。使用 GetSHA1OfString

    副作用是有了校验和,您不必关心 URL 编码,因为校验和不会包含任何特殊字符。