2009-07-29 8 views
9

Ich hoffe, dies ist eine relativ einfache Sache zu tun, und dass meine Google-Fähigkeiten haben mich bei dieser Gelegenheit einfach fehlgeschlagen. Ich habe eine BASIC-Authentifikation geschützte Ressource, für die PHP eine POST-HTTP-Anfrage ausführen soll.Problem FORM POST Anfrage von PHP mit HTTP-Basis-Authentifizierung

Ich habe versucht, die Injektion Authentifizierung: Basic (verschlüsselt u/p-Daten) in die Header, die nicht zur Arbeit erschien - so frage ich mich, können die Kräfte der Greyskull i Stackoverflow jede Führung bieten bedeuten.

$req .= "&cmd=_initiate_query"; 
$header = "POST /someendpoint HTTP/1.1\r\n". 
     "Host:example.com\n". 
     "Content-Type: application/x-www-form-urlencoded\r\n". 
     "User-Agent: PHP-Code\r\n". 
     "Content-Length: " . strlen($req) . "\r\n". 
     "Connection: close\r\n\r\n"; 
$fp = fsockopen ('ssl://example.com', 443, $errno, $errstr, 30); 
if (!$fp) { 
    // HTTP ERROR 
} else { 
    fputs ($fp, $header . $req); 
    while (!feof($fp)) { 
     $result .= fgets ($fp, 128); 
    } 
    fclose ($fp); 
} 
+0

haben Sie versucht (oder haben Sie Zugriff), curl dafür zu verwenden? – bumperbox

+0

Guter Punkt, etwas, das ich hätte sagen sollen. Ich versuche, die Anforderung für Änderungen an php.ini zu minimieren (wenn nicht zu negieren). Ich musste bereits die OpenSSL-Erweiterung aktivieren, um SSL zu machen ... was ein Problem ist, und CURL könnte eine Option sein, aber ich würde lieber alle Möglichkeiten ohne CURL zuerst erkunden. –

Antwort

3

Mit weiterleiten mit:

$header = "POST /someendpoint HTTP/1.1\r\n". 
     "Host:example.com\n". 
     "Content-Type: application/x-www-form-urlencoded\r\n". 
     "User-Agent: PHP-Code\r\n". 
     "Content-Length: " . strlen($req) . "\r\n". 
     "Authorization: Basic ".base64_encode($username.':'.$password)."\r\n". 
     "Connection: close\r\n\r\n"; 

Sollte funktionieren - Sind Sie sicher, dass es sich um ein Standardauthentifizierungssystem handelt? Es kann sich lohnen, die rohen Header-Daten zu beobachten, indem Sie etwas wie CharlesProxy verwenden, um sicherzustellen, dass es sich um eine Authentifizierung handelt (und Sie werden dann auch in der Lage sein, den Autorisierungsstring zu kopieren!).

+0

Danke, Richy, das ist, was ich hatte - ich frage mich, ob ich es in britischem Englisch geschrieben habe (d. H. Autorisierung), was offensichtlich nicht funktionieren würde. Wird diesen Ansatz weiter untersuchen. –

+1

Daumen drücken: Als Brite habe ich die Autorisierung/Autorisierung einige Male selbst gemacht. Ich habe auch einige Authentifizierungsstellen bekannt, überprüfen Sie die HTTP_REFERER (sic) Header für "zusätzliche Authentifizierung" zusammen mit Cookies (yep, verdammt komplex, um die Logins zu automatisieren!). CharlesProxy (oder Microsoft's Fiddler) lässt Sie sehen, was Ihr Browser sendet und Ihnen erlauben, das im Code zu replizieren. –

-2

Hier ist eine Funktion, die ich verwende, um POST-Anfragen durchzuführen. Hoffentlich kann er das tun, was Sie wollen:

function http_post($server, $port, $url, $vars) { 

// get urlencoded vesion of $vars array 
$urlencoded = ""; 

foreach ($vars as $Index => $Value) 
    $urlencoded .= urlencode($Index) . "=" . urlencode($Value) . "&"; 

$urlencoded = substr($urlencoded,0,-1); 

$headers = "POST $url HTTP/1.0\r\n" 
. "Content-Type: application/x-www-form-urlencoded\r\n" 
. "Content-Length: ". strlen($urlencoded) . "\r\n\r\n"; 

$fp = fsockopen($server, $port, $errno, $errstr, 10); 
if (!$fp) return "ERROR: fsockopen failed.\r\nError no: $errno - $errstr"; 

fputs($fp, $headers); 
fputs($fp, $urlencoded); 

$ret = ""; 
while (!feof($fp)) $ret .= fgets($fp, 1024); 

fclose($fp); 
return $ret; } 

Und hier ist ein Beispiel für mich auf die POST-Variablen an eine API

$response = http_post("www.nochex.com", 80, "/nochex.dll/apc/apc", $_POST); 
+0

Danke, aber das scheint ziemlich genau das zu sein, was ich habe und nicht mit dem Thema der Frage - HTTP-Basic-Authentifizierung. –