Heim > Backend-Entwicklung > PHP-Tutorial > PHP verwendet Socket, um die POST-Methode zu simulieren

PHP verwendet Socket, um die POST-Methode zu simulieren

墨辰丷
Freigeben: 2023-03-29 10:36:02
Original
1713 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich die Methode vor, mit der PHP Sockets zum Simulieren von POST verwendet, und analysiert die gängigen Techniken zum Simulieren von POST über Sockets anhand von Beispielen.

Fast das am häufigsten verwendete simulierte POST Ich habe PHP Curl verwendet, um es zu implementieren. Heute habe ich gesehen, dass ein Freund einen Artikel mit einem PHP-Socket geschrieben hat, der eine POST-Anfrage simuliert.

In der Vergangenheit habe ich die PHP-Curl-Erweiterung verwendet, um Post-Anfragen zu simulieren. Ich hätte nie gedacht, dass PHP-Socket auch implementiert werden könnte. Ich habe kürzlich die relevanten Informationen durchgesehen und festgestellt, dass sie nicht so tiefgreifend sind. Es ist nur so, dass ich das Prinzip und die Essenz von Post nie vollständig verstanden habe. Tatsächlich geht es darum, eine als Post markierte Protokollzeichenfolge an das Zielprogramm zu senden folgt:

POST / Zielprogramm-URL HTTP/1.1

Akzeptieren: Informationsformat empfangen

Referer: URL-Quelle

Accept-Language: Empfangssprache

Content-Type: application/ x-www-form-urlencoded

Cookie: Website-Cookie, Sie müssen nicht zu viel erklären, oder?

Benutzer- Agent: Benutzeragent, Betriebssystem und Version, CPU-Typ, Browser- und Versionsinformationen

Host: Die zu sendende Hostadresse

Content-Length : Die Länge der gesendeten Daten

Pragma: Ob es einen lokalen Cache gibt

Cache-Kontrolle: ob ein Webseiten-Cache benötigt wird

Verbindung: Verbindungsstatus

Benutzername=fengdingbo&password=jb51 .net //Per Post gesendete Daten

Ich denke, jeder sollte mit der Formular-Post-Methode zum Senden von Daten vertraut sein. Wenn wir beispielsweise den Benutzernamen und das Passwort an eine bestimmte Seite senden möchten, Füllen Sie das entsprechende Eingabefeld aus, klicken Sie auf die Schaltfläche „Senden“ und senden Sie schließlich das Formular. Die oben genannten Daten werden an das Aktionsprogramm gesendet. Wenn ich das weiß, denke ich, dass es nicht schwierig sein wird

Zu diesem Zeitpunkt müssen wir nur den PHP-Socket verwenden, um einen Port zu öffnen, z. B. Port 80, und diesen Port zum Senden der oben genannten Informationen verwenden zum Zielprogramm.

Wie richten wir einen Socket-Kanal an einem Port ein?

Es ist so einfach in PHP!

Offizieller Prototyp:

resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string & $errstr [, float $timeout = ini_get("default_socket_timeout") ]]]] )

Das Folgende ist menschliches Verständnis:

fsockopen(Hostname, Portnummer, Fehlernummer und Variablen , Fehleraufforderung und Variablen, Zeitüberschreitung)
Der Hostname ist das Ziel, an das Sie Daten senden müssen.
Die Portnummer ist der Port, auf dem das Programm auf Ihre Daten wartet.
Fehler Die &-Variable Bei der Anzahl handelt es sich um die Fehlernummer, die zurückgegeben wird, wenn die Socket-Einrichtung fehlschlägt. Die &-Variable der Fehleraufforderung ist die bei Auftreten eines Fehlers zurückgegebene Fehlernummer Die andere Partei nach der Veröffentlichung der Daten keine Antwort auf die Nachricht, die maximale Wartezeit.


Wenn nichts anderes passiert (Sie haben die Parameter der Funktion fsockopen() richtig eingestellt), wurde nun ein Socket-Kanal geöffnet. Der nächste Schritt besteht darin, über diesen geöffneten Kanal zu posten. Das Anforderungsprotokoll wird an das Zielprogramm gesendet. Zu diesem Zeitpunkt können Sie entweder die Funktion fwrite oder fputs verwenden, um das Post-Anforderungsformat an das von fsockopen() geöffnete Ressourcenhandle zu senden .


Der Code lautet wie folgt

<?php
/**
 * SOCKET扩展函数
 * @copyright (c) 2013
 * @author Qiufeng <fengdingbo@gmail.com>
 * @link http://www.jb51.net
 * @version 1.0
 */
 
/**
 * Post Request
 *
 * @param string $url 
 * @param array $data
 * @param string $referer
 * @return array
 */
if ( ! function_exists(&#39;socket_post&#39;))
{
 function socket_post($url, $data, $referer=&#39;&#39;)
 {
 if( ! is_array($data))
 {
 return;
 }
 
 $data = http_build_query($data);
 $url = parse_url($url);
 
 if ( ! isset($url[&#39;scheme&#39;]) || $url[&#39;scheme&#39;] != &#39;http&#39;)
 {
 die(&#39;Error: Only HTTP request are supported !&#39;);
 }
 
 $host = $url[&#39;host&#39;];
 $path = isset($url[&#39;path&#39;]) ? $url[&#39;path&#39;] : &#39;/&#39;;
 
 // open a socket connection on port 80 - timeout: 30 sec
 $fp = fsockopen($host, 80, $errno, $errstr, 30);
 
 if ($fp)
 {
 // send the request headers:
 $length = strlen($data);
 $POST = <<<HEADER
POST {$path} HTTP/1.1
Accept: text/plain, text/html
Referer: {$referer}
Accept-Language: zh-CN,zh;q=0.8
Content-Type: application/x-www-form-urlencodem 
Cookie: token=value; pub_cookietime=2592000; pub_sauth1=value; pub_sauth2=value
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17
Host: {$host}
Content-Length: {$length}
Pragma: no-cache
Cache-Control: no-cache
Connection: closern
{$data}
HEADER;
 fwrite($fp, $POST);
 $result = &#39;&#39;;
 while(!feof($fp))
 {
 // receive the results of the request
 $result .= fread($fp, 512);
 }
 }
 else
 {
 return array(
  &#39;status&#39; => &#39;error&#39;,
  &#39;error&#39; => "$errstr ($errno)"
  );
 }
 
 // close the socket connection:
 fclose($fp);
 
 // split the result header from the content
 $result = explode("rnrn", $result, 2);
 
 // return as structured array:
 return array(
 &#39;status&#39; => &#39;ok&#39;,
 &#39;header&#39; => isset($result[0]) ? $result[0] : &#39;&#39;,
 &#39;content&#39; => isset($result[1]) ? $result[1] : &#39;&#39;
 );
 }
}
 
print_r(socket_post(&#39;http://www.jb51.net/&#39;, array(&#39;name=&#39;=>&#39;qiufeng&#39;,&#39;password&#39;=>md5(&#39;www.jb51.net&#39;))));
/* e.g: socket_post(&#39;http://www.jb51.net&#39;, array(&#39;name=&#39;=>&#39;qiufeng&#39;,&#39;password&#39;=>md5(&#39;jb51.net&#39;))); */
/* End of file socket_helper.php */
Nach dem Login kopieren

Tatsächlich wird beim Öffnen des Socket-Kanals der COOKIE, das wir übergeben, ist Wenn es korrekt ist (der im Screenshot ausgeführte PHP-Code stammt von oben und mein Benutzername wird auf der nach dem Ausführen zurückgegebenen Webseite angezeigt, was darauf hinweist, dass die andere Website erkannt hat, dass ich mich angemeldet habe), können wir dies tun viele Dinge, wie zum Beispiel erfrischende Beiträge, Antworten usw. Du verstehst, oder?


Okay, das Obige ist nicht überzeugend genug. Schauen wir uns einen PHP-Socket an, um das Hochladen von Bildern zu implementieren.


In diesem Code sind zwei Punkte zu beachten:


Erstens handelt es sich um eine HTTP-Post-Anfrage;


Das zweite ist das Formular-Upload-Protokoll,

Der Anforderungsstring unter
ist für jede Sprache geeignet


Der Code lautet wie folgt

<?php 
 
  $remote_server = "jb51.net"; 
 
  $boundary = "---------------------".substr(md5(rand(0,32000)),0,10); 
   
  // Build the header 
  $header = "POST /api.php?action=twupload HTTP/1.0rn"; 
  $header .= "Host: {$remote_server}rn"; 
  $header .= "Content-type: multipart/form-data, boundary=$boundaryrn"; 
 
  /* 
  // attach post vars 
  foreach($_POST AS $index => $value){ 
   $data .="--$boundaryrn"; 
   $data .= "Content-Disposition: form-data; name="".$index.""rn"; 
   $data .= "rn".$value."rn"; 
   $data .="--$boundaryrn"; 
  } 
  */
  $file_name = "aaa.jpg"; 
  $content_type = "image/jpg"; 
 
  $data = &#39;&#39;; 
  // and attach the file 
  $data .= "--$boundaryrn"; 
 
  $content_file = file_get_contents(&#39;aaa.jpg&#39;); 
  $data .="Content-Disposition: form-data; name="userfile"; filename="$file_name"rn"; 
  $data .= "Content-Type: $content_typernrn"; 
  $data .= "".$content_file."rn"; 
  $data .="--$boundary--rn"; 
 
  $header .= "Content-length: " . strlen($data) . "rnrn"; 
     // Open the connection 
 
 
  $fp = fsockopen($remote_server, 80); 
  // then just 
  fputs($fp, $header.$data); 
  // reader 
 
 while (!feof($fp)) { 
  echo fgets($fp, 128); 
 } 
 
fclose($fp);
Nach dem Login kopieren

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, er wird für das Studium aller hilfreich sein.

Verwandte Empfehlungen:

phpSo erhalten Sie die aktuelle URL-Adresse

phpMethoden zur Realisierung der Hexadezimal- und Dezimalkonvertierungsfunktion

Detaillierte Erläuterung der PHP-Betriebsklasse und -Nutzung für das Bildbeschneiden ohne Verformung mit vollem Funktionsumfang


Das obige ist der detaillierte Inhalt vonPHP verwendet Socket, um die POST-Methode zu simulieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage