通过HTTP Post验证Inno设置密码

时间:2015-09-22 12:29:25

标签: php inno-setup pascalscript

有人可以帮助Inno Setup中的密码验证,我目前有以下的Inno安装代码(在本网站上找到),我想做的是检查密码与服务器上的密码。

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

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

我已经包含了Inno安装代码和下面的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 个答案:

答案 0 :(得分:4)

  1. 服务器主机名在哪里?如果你没有指定密码应该发送到哪里,这怎么可能有效呢?

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

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

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

    更简单的可能是按原样编写密码(就像你已经做的那样)并在服务器端读取原始请求数据:

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

  4. 您应该仅为了安全性而发送密码校验和。例如。使用GetSHA1OfString

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