Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Curl, Basedir, i ominięcie, ale jak i po co
ahold
post
Post #1





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 27.05.2009

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/winksmiley.jpg) Wiadomo że do celu, ale nie po trupach..



Go to the top of the page
+Quote Post
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
ahold
post
Post #3





Grupa: Zarejestrowani
Postów: 80
Pomógł: 0
Dołączył: 27.05.2009

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
zegarek84
post
Post #4





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
gg1985
post
Post #5





Grupa: Zarejestrowani
Postów: 174
Pomógł: 3
Dołączył: 23.02.2008

Ostrzeżenie: (0%)
-----


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. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Wicepsik
post
Post #6





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


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...

Ten post edytował Wicepsik 12.11.2009, 15:58:01
Go to the top of the page
+Quote Post
gg1985
post
Post #7





Grupa: Zarejestrowani
Postów: 174
Pomógł: 3
Dołączył: 23.02.2008

Ostrzeżenie: (0%)
-----


hehe, zamiast \n\n trzeba \n\r albo \r\n już nie pamiętam (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 19:54