我正在尝试使用套接字创建安全登录程序。这是我写的代码:
<?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连接。
我会非常感谢能告诉我错在哪里的人。 谢谢!
答案 0 :(得分: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。
这消除了任何歧义,并明确指示服务器如何继续