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 !");
}
我最终想发送两位信息进行验证,但我想先让上面的工作正常。
如有任何帮助,我们将不胜感激。
服务器主机名在哪里?如果您不指定密码应该发送到哪里,这怎么可能工作?
WinHttpReq.Open('POST', 'https://www.example.com/website.php', false);
您按原样发送密码。当您将 Content-Type
指定为 application/x-www-form-urlencoded
时。此内容类型具有特定格式,必须至少包含一个参数名称。 PHP 还怎么知道该字段名为 password
?
WinHttpReq.Send('password=' + Password);
但要使其正常工作,您还必须对密码进行 URL 编码。
更简单的方法可能是按原样写入密码(正如您已经在做的那样)并在服务器端读取原始请求数据:
$password = file_get_contents("php://input");
您确实需要保护您的服务器端代码免受 SQL injection.
为了安全起见,您应该发送密码校验和。例如。使用 GetSHA1OfString
。
副作用是有了校验和,您不必关心 URL 编码,因为校验和不会包含任何特殊字符。
有人可以帮助我在 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 !");
}
我最终想发送两位信息进行验证,但我想先让上面的工作正常。
如有任何帮助,我们将不胜感激。
服务器主机名在哪里?如果您不指定密码应该发送到哪里,这怎么可能工作?
WinHttpReq.Open('POST', 'https://www.example.com/website.php', false);
您按原样发送密码。当您将
Content-Type
指定为application/x-www-form-urlencoded
时。此内容类型具有特定格式,必须至少包含一个参数名称。 PHP 还怎么知道该字段名为password
?WinHttpReq.Send('password=' + Password);
但要使其正常工作,您还必须对密码进行 URL 编码。
更简单的方法可能是按原样写入密码(正如您已经在做的那样)并在服务器端读取原始请求数据:
$password = file_get_contents("php://input");
您确实需要保护您的服务器端代码免受 SQL injection.
为了安全起见,您应该发送密码校验和。例如。使用
GetSHA1OfString
。副作用是有了校验和,您不必关心 URL 编码,因为校验和不会包含任何特殊字符。