2009-07-29 12 views
9

J'espère que c'est une chose relativement simple à faire, et que mes compétences google m'ont tout simplement échoué à cette occasion. J'ai une ressource protégée d'authentification BASIC que je veux faire exécuter une requête POST HTTP par PHP.Problème Formulaire POST Demande de PHP utilisant l'authentification de base HTTP

J'ai essayé l'injection authentification: base (données cryptées u/p) dans les en-têtes qui ne semble pas fonctionner - donc je me demande, peuvent les pouvoirs de Greyskull je veux dire StackOverflow fournir des conseils.

$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

avez-vous essayé (ou avez-vous accès) d'utiliser curl pour cela? – bumperbox

+0

Bon point, quelque chose que j'aurais dû dire. J'essaie de minimiser (sinon de nier) l'exigence de modifications à php.ini. J'ai déjà dû activer l'extension OpenSSL pour faire SSL ... ce qui est pénible, et CURL peut être une option mais je préfère explorer toutes les possibilités sans CURL d'abord. –

Répondre

3

utilisant:

$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"; 

devrait fonctionner - Êtes-vous sûr qu'il s'agit d'un système d'authentification de base? Il peut être utile de regarder les données d'en-tête brutes en utilisant quelque chose comme CharlesProxy pour s'assurer qu'il s'agit d'une authentification (et vous serez alors en mesure de copier la chaîne d'autorisation!).

+0

Merci Richy, c'est ce que j'avais - je me demande si je l'ai écrit en anglais britannique (c'est-à-dire autorisation) qui ne fonctionnerait évidemment pas. Nous étudierons cette approche plus avant. –

+1

Croisés les doigts: en tant que Britannique, j'ai moi-même fait le bordereau Autorisation/Autorisation plusieurs fois. J'ai également connu des sites d'authentification qui vérifient l'en-tête HTTP_REFERER (sic) pour une "authentification supplémentaire" ainsi que l'utilisation de cookies (yep, damn complex pour automatiser les connexions!). CharlesProxy (ou Microsoft Fiddler) vous permettra de voir ce que votre navigateur envoie et vous permettra de le reproduire dans le code. –

-2

Voici une fonction que j'utilise pour effectuer des requêtes POST. Espérons que cela peut faire ce que vous voulez:

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; } 

Et voici un exemple de me utiliser pour transmettre les variables POST à ​​une API

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

Merci, mais cela semble être à peu près ce que j'ai et ne traite pas la question de la question - l'authentification de base HTTP. –