0

シンプルなAPIを使いたいのですが、安全な方法で使いたいです。現在、ソケットとポート80を使用しています。私が知る限り、ポート80は開いていて、それほど安全な接続ではないようです。

送信するデータにはユーザーとパスワードが含まれているため、HTTPではなくHTTPSを使用して安全を確保したいと思います。

この行を変更するだけの簡単なことではないかと思いました。

$headers = "POST /api/api.php HTTP/1.0\r\n";

この他の行のために

$headers = "POST /api/api.php HTTPS/1.0\r\n";

そして、ポートをに変更します443

接続機能は次のとおりです。

// api connect function
function api_connect($Username, $Password, $ParameterArray)
{
   // Create the URL to send the message.
   // The variables are set using the input from an HTML form

   $err = array();
   $url = "api.text-connect.co.uk";
   $headers = "POST /api/api.php HTTP/1.0\r\n";
   $headers .= "Host: ".$url."\r\n";

   // Create post string
   // Username and Password
   $poststring = "Username=".$Username."&";
   $poststring .= "Password=".$Password;

   // Turn the parameter array into the variables

   while (list($Key, $Value)=@each($ParameterArray))
   {
      $poststring .= "&".$Key."=".urlencode($Value);
   }

   // Finish off the headers
   $headers .= "Content-Length: ".strlen($poststring)."\r\n";
   $headers .= "Content-Type: application/x-www-form-urlencoded\r\n";


   // Open a socket
   $http = fsockopen ($url, 80, $err[0], $err[1]);
   if (!$http)
   {
      echo "Connection to ".$url.":80 failed: ".$err[0]." (".$err[1].")";
      exit();
   }

   // Socket was open successfully, post the data.
   fwrite ($http, $headers."\r\n".$poststring."\r\n");

   // Read the results from the post
   $result = "";
   while (!feof($http))
   {
      $result .= fread($http, 8192);
   }

   // Close the connection
   fclose ($http);

   // Strip the headers from the result
   list($resultheaders, $resultcode)=split("\r\n\r\n", $result, 2);

   return $resultcode;
}
?>
4

3 に答える 3

2

HTTPまたはHTTPSのどちらを使用しているかに関係なく、コードには非常に多くの問題があります。HTTPクライアント(またはサーバー)の実装は、単にソケット全体にヘッダーをスローして応答をシンクするよりもはるかに複雑です。

このアプローチの特に悪い点は、それがいつかは機能することです。そうすると失敗し、その理由がわかりません。

curlを使用して再開します。

このようにすると、URLを変更するだけで済みます(Cookie jar、ヘッダーインジェクションのサポート、リダイレクトの自動フォロー、プロキシ経由のルーティング、SSL証明書の検証または非検証なども実装されます)。

于 2012-11-28T14:40:00.143 に答える
1

こんなにシンプルなのかしら

いいえ、そうではありません。本当に、そうではありません。

HTTPSは、SSLを介してトンネル化されたHTTPです。したがって、HTTPリクエストの内容はまったく変更しません。

ただし、HTTPを実行する前に、すべてのSSLハンドシェイクを実行する必要があります。

SSLは暗号化されているため、困難です。このホイールを作り直そうとしないでください。cURLなどのライブラリを使用します。

于 2012-11-28T13:55:31.277 に答える
1

カール してセットCURLOPT_SSL_VERIFYPEER = false

于 2012-11-28T14:12:02.243 に答える