Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Upload pliku z url'a
Kshyhoo
post
Post #1





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Ostatnio spłodziłem skrypt uploadu plików na serwer i chciałem do niego dodać nową funkcjonalność, mianowicie, możliwość uploadowania plików z linku (odnośnika). Nie wiem, jak się do tego zabrać, mam kilka pytań:
1. Są jakieś gotowe funkcje?
2. Jak się zabezpieczyć przed wstrzyknięciem jakiegoś cuda?
3. Na ile mogę wykorzystać swój skrypt uploadu z dysku (jakie różnice)?

Nie chcę gotowca, na forum i w Googlach znalazłem co nieco, ale za mało, żeby zakumać temat.


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





Grupa: Zarejestrowani
Postów: 278
Pomógł: 44
Dołączył: 17.02.2004
Skąd: Wieliczka

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


skorzystaj np z http://php.net/manual/en/function.file-get-contents.php

zabezpieczenie? -np. sprawdzaj rozszerzenie i typ mime


--------------------
neverever
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #3





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Nie chcę pobrać pliku do obróbki, chcę tylko uploadować. Zrobiłem tak (nie bić za mocno):
  1. $upload_dir = "img/".$lvl1."/".$lvl2."/";
  2. $zdalny = $_POST['url'];
  3. $uploaded = $upload_dir . basename($url);
  4.  
  5. if (!is_dir("$upload_dir")) {
  6. die ("<font class='pl'>Błąd! Katalog docelowy $upload_dir nie istnieje!</font><br />");
  7. }
  8. $uploaded = preg_replace('/[!?@#$%^&*()+=\';><,!:"\/\[\]\{\}]+/', '', $uploaded); // znaki na spacje
  9. $we1 = array('ą','ć','ę','ł','ń','ó','ś','ź','ż','Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż',' ');
  10. $wy1 = array('a','c','e','l','n','o','s','z','z','A','C','E','L','N','O','S','Z','Z','_');
  11. $uploaded = str_replace($we1, $wy1, $uploaded);
  12. $uploaded = strtolower($uploaded); // zmień na małe litery
  13. $uploaded = preg_replace('/[\-]+/', '-', $uploaded);// zredukuj liczbę - do jednego obok siebie
  14. $uploaded = preg_replace('/[\_]+/', '_', $uploaded);// zredukuj liczbę _ do jednego obok siebie
  15. $uploaded = trim($uploaded, '-');// usuń możliwe - na początku i końcu
  16. $uploaded = trim($uploaded, '_');// usuń możliwe _ na początku i końcu
  17. $uploaded = wordwrap($uploaded, 50, " ", 1); // pocięcie długich wpisów
  18. $uploaded = preg_replace("/(img)([0-9]{2})([0-9]{2})(.*?)(gif|jpg|jpeg|png|rar|zip|pdf|psd)/","$1/$2/$3/$4$5",$uploaded); // dokłada /
  19. $sp = explode(".",$uploaded);
  20. $c_sp = count($sp) - 1;
  21. if ( $sp[$c_sp] == "gif"
  22. or $sp[$c_sp] == "jpg"
  23. or $sp[$c_sp] == "jpeg"
  24. or $sp[$c_sp] == "png"
  25. or $sp[$c_sp] == "rar"
  26. or $sp[$c_sp] == "zip"
  27. or $sp[$c_sp] == "pdf"
  28. or $sp[$c_sp] == "psd" ) { // jakie rozszeżenia
  29.  
  30. if (file_exists($uploaded)) { // czy plik już istnieje
  31. echo "<font class='pl'>Błąd! Plik już istnieje!</font><br />";
  32. } else {
  33. if ($uploaded > 2*1024*1024) { // ograniczenie wielkości
  34. echo "<font class='pl'>Błąd! Plik numer jest za duży!</font><br />";
  35. } else {
  36. $zdalny_wielkosc = strlen(file_get_contents($zdalny));
  37. $lokalny_wielkosc = (file_exists($uploaded))?filesize($uploaded):-1;
  38. if ($zdalny_wielkosc<>$lokalny_wielkosc) {
  39. copy($zdalny, $uploaded);
  40. echo "<font class='key'>Operacja wysyłania pliku przebiegła pomyślnie.</font><br />";
  41. } // kontrola pobrania całości
  42. } // jeżeli powodzenie
  43. } // jeżeli plik już istnieje
  44. } else {
  45. echo "<font class='pl'>Błąd! Niepoprawny format pliku!</font><br />";
  46. } // rozszerzenia


--------------------
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Zamiast tak sypać rozszerzeniami zrób tablicę dozwolonych i potem tylko
if( in_array( $rozszerzenie, $tablica_dozwolonych ) )
Zamiast tak jechać ze str_replace i pregami prościej posłużyć się filter_var i sanitize'ować nazwę. Zamiast count($sp)-1 czemu nie używasz iteratorów tablicowych?Ogólnie jak sam widzisz, można z kodu jeszcze wyciskać wiele winksmiley.jpg
Poza tym masz tylko sprawdzenie rozszerzenia? A co z MIME? Bo dam Ci plik do którego na końcu dokleję za prawidłowym rozszerzeniem .psd i uzna mi to za plik photoshopa, choć to może być exe winksmiley.jpg

By być w miarę pewnym co tojest, musiałbyś jednak otwierać plik i po typie rozszerzenia sprawdzać poprawność nagłówka pliku danego typu winksmiley.jpg Wiadomo, że oszust musiałby nagłówek pliku wtedy zmienić by to zabezpieczenie obejść, a wtedy niemal na bank jego kod będzie miał problem z działaniem i będzie odczytywany jako uszkodzony.
Powód edycji: [thek]: Mały dopisek o nagłówkach


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #5





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Naczytałem się (na tym forum), że i MIME nie daje żadnej pewności...


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





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




Nie daje, jeśli sprawdzasz je w tablicy $_FILES.

Za to daje NAJWIĘKSZĄ pewność, jeśli sprawdzisz je po stronie serwera - albo przez rozszerzenie w PHP (choć nie zawsze jest dostępne), albo - co polecam - poprzez odpalenie komendy file -bi /home/sadfsdf/sdfsdf/sdfsdf/plik.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Kshyhoo
post
Post #7





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Nic z tego nie wiem, tak daleko moja wiedza jeszcze nie sięga...


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 08:15