[PHP] Simulace POST formuláře

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod netrunner 18. 8. 2006 13:30

DD,
mám takový prblém. Potřebuju v PHP nasimulovat funkčnost POST formuláře. Ten vypadá takto:
Kód: Vybrat vše
<form action="http://mms.ufonek.net/mms/file_save.asp" method="post" enctype="multipart/form-data">
<input type="file" name="FILE" /><br />
<input type="submit" name="Sub" value="Vložit objekt" />
</form>
[
Nic složitého. Nemám problém s tím odespat POST data (přes CURL), aspoň tedy myslím :)
Problém je v tom, že cílový skript (file_save.asp) se vykoná a zřejmě okamžitě přes hlavičku přesměruje jinam (mms.asp). Při tom ale stihne uložit cookies. A v tom je ta trable, bez cookies to nefunguje a na výsledné stránce se soubor poslaný přes POST nezobrazí. Do těchto skriptů nemám přístup, takže je nemůžu nijak nastudovat, natož ovlivnit. Můj PHP skript je tento:
Kód: Vybrat vše
$postData = array();

$url = "http://mms.ufonek.net/mms/file_save.asp";

$postData[ 'FILE' ] = "@obrazky/logo.jpg";

$postData[ 'Sub' ] = "Přidat objekt";


$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url );     
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_UPLOAD, 1);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

curl_setopt($ch, CURLOPT_POST, 1 );

curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );

$response = curl_exec( $ch );

Header("Location: http://mms.ufonek.net/mms/mms.asp");
[


Po zavolání se skript bez problémů vykoná a pošle data. Bohužel už nijak neumím odchytit cookie co mi protistrana pošle a uložit ji k uživateli a nechat přesměrování na původním skriptu (file_save.asp) :(

Mohl byste mě někdo nakopnout správným směrem?
Díky ;)


// mbing : Téma přesunuto ● z Programování do Tvorba webových stránek a aplikací.
netrunner
Junior
Uživatelský avatar

Odeslat příspěvekod Katulus 18. 8. 2006 22:12

Zkus nacist obsah $_COOKIE a potom to cookie rucne vytvorit.
Odi et amo.
Katulus
Junior

Odeslat příspěvekod netrunner 18. 8. 2006 23:38

Tam samozřejmě nic není, protože ten cizí skript volám přes CURL...
netrunner
Junior
Uživatelský avatar

Odeslat příspěvekod AraxoN 19. 8. 2006 00:06

Musíš curl nastaviť tak aby vrátil aj header
Kód: Vybrat vše
curl_setopt($this->curl,CURLOPT_HEADER,true);

a aby sám od seba nenasledoval redirect. Potom spravíš ten POST, odchytíš direktívy Set-cookie a Location v odpovedi. Cookie nastavíš potom cez ďalší curl_setopt
Kód: Vybrat vše
curl_setopt($this->curl,CURLOPT_COOKIE,"ssid=whatever012345");

a vykonáš ten redirectovaný request.
Podporujte baktérie - pre veľa ľudí je to jediná kultúra, ktorú majú.
AraxoN
Junior
Uživatelský avatar

Odeslat příspěvekod netrunner 19. 8. 2006 00:12

Můžeš mi prosím to odchycení cookie nějak přiblížit? To je právě to co mi není jasné. Zkoušel jsem nastavit CURLOPT_COOKIEJAR i COOKIEFILE, ale soubor mi po dokončení curl session zůstane prázdný :(
netrunner
Junior
Uživatelský avatar

Odeslat příspěvekod yaroukh 19. 8. 2006 00:26

vylistuj si vysledek z getallheaders(), jedna z hlavicek by mela obsahovat cookies
jinak ty cookies, ktere uzivateli posles, se samozrejme ulozi s tvoji domenou - to asi chapes, zejo?
my favourite music: sounds4u.net/?fuID=3
yaroukh
Junior
Uživatelský avatar

Odeslat příspěvekod netrunner 19. 8. 2006 12:09

To by neměl být problém,i ten cizí skript běží na mé doméně, takže to půjde.
Jinak getallheaders() vrací hlavičky současného zpojení, ne toho přes curl....
netrunner
Junior
Uživatelský avatar

Odeslat příspěvekod yaroukh 19. 8. 2006 16:15

no to spojeni si udelas sam; na poslani POST-requestu nepotrebujes zadnej CURL (ani poradne nevim co to je) ... POST-request sestavis snadno
my favourite music: sounds4u.net/?fuID=3
yaroukh
Junior
Uživatelský avatar

Odeslat příspěvekod netrunner 19. 8. 2006 16:29

tak to mi řekni jak, o jiném způsobu nevím :(
netrunner
Junior
Uživatelský avatar

Odeslat příspěvekod yaroukh 19. 8. 2006 16:50

s tim getallheaders mas pravdu - sorry, uz v PHP nejakou dobu nedelam

ale ja jsem to svyho casu delal pres fsockopen - posles svuj request a z odpovedi prectes hlavicky (ty jdou hned na zacatku a od ostatnich dat jsou oddeleny prazdnym radkem)

jak ma vypadat POST-request zjistis A) ze specifikace nebo B) rucnim odeslanim formulare na tvoje vlastni URL, kde prichozi data (nezpracovany PHP) skouknes nejak takhle:
file_get_contents("php://input") viz http://cz2.php.net/wrappers.php)
tam zaroven uvidis i jak prichazej ty hlavicky
my favourite music: sounds4u.net/?fuID=3
yaroukh
Junior
Uživatelský avatar

Odeslat příspěvekod AraxoN 19. 8. 2006 19:51

netrunner píše:Můžeš mi prosím to odchycení cookie nějak přiblížit? To je právě to co mi není jasné. Zkoušel jsem nastavit CURLOPT_COOKIEJAR i COOKIEFILE, ale soubor mi po dokončení curl session zůstane prázdný :(S/quote]

Práve cez CURLOPT_HEADER=true. V $response máš potom výsledok celého requestu, ktorý vyzerá nejak takto:
Kód: Vybrat vše
HTTP/1.1 200 OK
Date: Sat, 19 Aug 2006 17:44:41 GMT
Server: Apache
X-Powered-By: PHP/5.1.4-pl6-gentoo
Set-Cookie: PHPSESSID=604480eeb68d344f2e81b0870152a52e; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 1
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html

<html>
...
...
...
</html>

T.j. najprv sú HTTP hlavičky, potom jeden prázdny riadok a až potom samotné HTML-ko, ktoré sa zobrazí v prehliadači. A z tej HTTP hlavičky musíš vydolovať ten Cookie, podľa toho ako sa bude volať v tvojom prípade (tu to bolo PHPSESSID). Zistíš jeho hodnotu, a pred ďalším requestom potom cez ten CURLOPT_COOKIE nastavíš ten cookie (v mojom prípade by to bolo PHPSESSID=604480eeb68d344f2e81b0870152a52e)
Podporujte baktérie - pre veľa ľudí je to jediná kultúra, ktorú majú.
AraxoN
Junior
Uživatelský avatar

Odeslat příspěvekod netrunner 19. 8. 2006 21:30

tak to mě nenapadlo, díky, kouknu na to ;)
netrunner
Junior
Uživatelský avatar

Odeslat příspěvekod netrunner 20. 8. 2006 11:38

Tak kdyby to náhodou někoho zajímalo, tak zde je výsledný skript, funguje to 100%.
Jen s těmi cookies jsou problémy, takže to nebude muset fungovat všude. Mozzila mi nesežere cookie pro jinou doménu, než na které se pohybuji. Jsem li tedy třeba na http://www.domena.tld, tak mi neuloží cookie, kterou se snažím uložit pro mms.domena.tld. Dá se to ale obejít přes uložení cookie pro .domena.tld (poté to s path / funguje pro celou doménu domena.tld). Jak se chová IE jsem netestoval, ale .domena.tld mu vyhovuje též. Kdyby byly projekty na jiných doménách, asi by to nešlo.
Kód: Vybrat vše
$postData = array();
   
   $url = "http://mms.ufonek.net/mms/file_save.asp";
   
   //simulace polí formuláře, pro jistotu všechny, co se odesílají. Před souborem musí být @
   
   $postData[ 'FILE' ] = "@".$_GET["file"];
   
   $postData[ 'Sub' ] = "Přidat objekt";
   
   $ch = curl_init();
   
//Nastavení spojení a vyžádání všech hlaviček
   curl_setopt($ch, CURLOPT_URL, $url );     
   curl_setopt($ch, CURLOPT_HEADER, 1);
   
   curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
   
   curl_setopt($ch, CURLOPT_POST, 1 );
   
//Nastavení POST dat
   curl_setopt($ch, CURLOPT_POSTFIELDS, $postData );
   
//Odeslání požadavku
   $response = curl_exec( $ch );
   
   curl_close($ch);
   
//Vrácenou stránku rozebereme na řádky
   $radky = explode("\n", $response);
   
//Uložíme řádek, kde se ukládají cookies
   foreach($radky as $radek) if(strpos($radek, "Set-Cookie:") === 0) $hledany = $radek;
//Vyjmutí vlastní hodnoty cookies (hodnoty okoukané ze spojení, pevná délka, dalo by se nahradit unoverzálním výrazem)
   $str = substr($hledany, 12, 45);
//Rozebrání cookie
   $cookie = explode("=", $str);
   
//odeslání cookie klientovi
   setcookie($cookie[0], $cookie[1], time() + 86400, "/", ".ufonek.net");
   
//odkázání na požadovaný skript
   Header("Location: http://mms.ufonek.net/mms/mms.asp");
[/code]


Děkuji všem za spolupráci a za plodné rady!
netrunner
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků