5

我正在尝试使用套接字创建一个安全的登录程序。这是我写的代码:

<?php

$myusername=$_POST["username"];
$mypassword=$_POST["password"];
$host="localhost";
$port=80;
$timeout=60;
$target="/admin_area.php";
if($myusername=="admin" && $mypassword=="passwd")

{
  if (!$sock=fsockopen("ssl://".$host,$port,$errnum,$errstr,$timeout))

  {
    die ("Could not open socket: [$errnum] $errstr");
  }

  else
  {
    $posted_vars=array("username"=>$myusername,
                       "password"=>$mypassword);
    $body="";
    foreach ($posted_vars as $parameter=>$value)

    {
      $body.="&".$parameter."=".$value;
    }
    $headers="POST ".$target." HTTP/1.0 \r\n";
    $headers.="Content-Type: application/x-www-form-urlencoded \r\n";
    $headers.="Content-Length: ".strlen($body)." \r\n";
    $headers.="Connection: Keep-Alive \r\n";
    $headers.="Authorization: Basic ".base64_encode($myusername.":".$mypassword)." \r\n\r\n";
    fputs ($sock,$headers.$body);
    $data="";
    while (!feof ($sock))

    {
      $data.=fgets($sock,3000);
    }
    list($res_head,$res_body)=explode("\r\n\r\n",$data);
    echo $res_body;
  }
}

else
  
{
  echo "Login not happened successfully";
}

?>

当我运行它时,会返回以下警告:

警告:fsockopen():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:140770FC:SSL 例程:SSL23_GET_SERVER_HELLO:第 12 行 C:\wamp\www\log_in.php 中的未知协议

警告:fsockopen():无法在第 12 行的 C:\wamp\www\log_in.php 中启用加密

警告:fsockopen():无法连接到第 12 行 C:\wamp\www\log_in.php 中的 ssl://localhost:80(未知错误)

无法打开套接字:[0]

问题是如果我在fsockopen()函数中删除使用 SSL 协议的指令,此代码可以正常工作,但我需要实现安全的 HTTP 连接。

我将非常感谢任何能告诉我我错在哪里的人。谢谢!

4

1 回答 1

2

我建议在此处进行一些更改以准确指定您需要的内容。

if (!$sock=fsockopen("ssl://".$host,$port,$errnum,$errstr,$timeout))

SSL 不使用默认端口 80,因此将 $port 指定为 443。

已知在某些未指定使用的 SSL 版本的系统上会导致问题,并依赖 php 来尝试检测它。我建议尝试

if (!$sock=fsockopen("sslv2://".$host,443,$errnum,$errstr,$timeout))

或者

if (!$sock=fsockopen("sslv3://".$host,443,$errnum,$errstr,$timeout))

取决于您的服务器使用的是 SSLv2 还是 SSLv3。

这消除了任何歧义并清楚地指示服务器如何继续

于 2013-05-15T10:59:48.683 回答