Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Curl, Basedir, i ominięcie, ale jak i po co
Forum PHP.pl > Forum > PHP
ahold
Witam,

W naszym Curlowaniu, posunąłem się do etapu pobierania strony.

Niestety okazało się iż używa ona Header Location, jako przekierowania między poszczególnymi stronami.

Myślę że super, ja też tak robię... i zacząłem dobierać się do opcji follow redirect.

Niestety okazało się że wymaga ona basedir otwartego.



Zacząłem zagłębiać się w dokumentację, i wyszło że jeżeli w header location ktoś wpisze file://xxx/xxx/xxx/tt.php to curl pobierze i wklei źródło tego skryptu...



Bo wcześniej myślałem, spokojnie, basedir... co to dla mnie, zaraz postawie Dedyka z debianem, i po sprawie.
Ale teraz widzę że curl staje się faktycznie niebezpieczny...

Czy nie da się jakoś obejść tego ?
Proponowali jakiś kod, na php.net ale niestety nie działa... niby nie wykłada się składnią, ale strony nie pobiera...


Nie ma ktoś gotowca który pobiera strony z header location ?
(dać po znajomości w ramach redystrybucji kodu).

Zakładamy że mogę mieć open basedir, ale i tak szkoda mi dedyka...

Wszystkie rozwiązania jakie tu omawiamy, tyczą się dedyków, dedyków, dedyków nie mówimy o dzielonych hostingach i problem nie leży w tym że basedir to problem w zmianie.

nano /etc/apache2/php5/php.ini
ctrl + w
basedir
enter
#
ctrl + o
/etc/init.d/apache2 restart

To nie jest dla mnie problem... to ma działać, ale bezpiecznie winksmiley.jpg Wiadomo że do celu, ale nie po trupach..



erix
Cytat
Czy nie da się jakoś obejść tego ?
Proponowali jakiś kod, na php.net ale niestety nie działa... niby nie wykłada się składnią, ale strony nie pobiera...


Nie ma ktoś gotowca który pobiera strony z header location ?
(dać po znajomości w ramach redystrybucji kodu).

Musisz użyć czegoś, co jest klientem protokołu HTTP przez fsockopen. Była kiedyś taka klasa, co się nazywała Snoopy.
ahold
Przepraszam erix, nie chciał bym żeby wyszło że zlałem na twoją odpowiedz, ale od rana dalej walczę z tym "ichnim redirektem opisanym na php.net".

Zacytuje, kod:

  1. function curl_redir_exec($ch)
  2. {
  3. global $kukis;
  4. global $przegladarka;
  5.  
  6. static $curl_loops = 0;
  7. static $curl_max_loops = 20;
  8. if ($curl_loops++>= $curl_max_loops)
  9. {
  10. $curl_loops = 0;
  11. return FALSE;
  12. }
  13. curl_setopt($ch, CURLOPT_COOKIEFILE, "$kukis");
  14. curl_setopt($ch, CURLOPT_COOKIEJAR, "$kukis");
  15. curl_setopt($ch, CURLOPT_USERAGENT, "$przegladarka");
  16. curl_setopt($ch, CURLOPT_REFERER, 'http://onet.pl/');
  17.  
  18. curl_setopt($ch, CURLOPT_HEADER, true);
  19. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  20. $data = curl_exec($ch);
  21.  
  22. list($header, $data) = explode("\n\n", $data, 2);
  23.  
  24. $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  25. if ($http_code == 301 || $http_code == 302)
  26. {
  27. $matches = array();
  28. preg_match('/Location:(.*?)\n/', $header, $matches);
  29. $url = @parse_url(trim(array_pop($matches)));
  30. if (!$url)
  31. {
  32. //couldn't process the url to redirect to
  33. $curl_loops = 0;
  34. return $data;
  35. }
  36. $last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
  37. if (!$url['scheme'])
  38. $url['scheme'] = $last_url['scheme'];
  39. if (!$url['host'])
  40. $url['host'] = $last_url['host'];
  41. if (!$url['path'])
  42. $url['path'] = $last_url['path'];
  43. $new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
  44. curl_setopt($ch, CURLOPT_URL, $new_url);
  45. return curl_redir_exec($ch);
  46. } else {
  47. $curl_loops=0;
  48. return $data;
  49. }
  50. }



Powyższy kod, zwraca poszatkowaną stronę... tzn 50 % strony, albo i mniej...

Metodą prób i błędów, z return $data doszedłem gdzie gubi poprawność.

  1. list($header, $data) = explode("\n\n", $data, 2);


Przed tym, kod jest poprawny.
Po tym, kod jest posiekany.

To jest na pewno związane z nagłówkami i podwójnym \n\n.
Może zmieniła się standaryzacja przez te lata, i już niema \n\n a np \n\n\n czyli trzy entery... czy ktoś coś pomoże ?
zegarek84
odpowiedź jest taka, że wystarczy, iż w kodzie będziesz miał 2 entery i już "kiszka" ;p - znajdź pozycję tych 2 pierwszych enterów po czym wytnij ten nagłówek - jeśli nie będzie przekierowania zwróć treść będącą za tymi enterami do końca...
gg1985
Wygląda na to, że mam dokładnie ten sam problem, jednak nie rozumiem tego rozwiązania powyżej, może ktoś napisać jaśniej?

EDYCJA:

Już sobie poradziłem. smile.gif
Wicepsik
Mógłbyś napisać w jaki sposób poradziłeś sobie z tym problemem? Też trochę siedzę nad tym i nie mogę wymyślić nic...
gg1985
hehe, zamiast \n\n trzeba \n\r albo \r\n już nie pamiętam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.