Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Upload pliku z url'a
Forum PHP.pl > Forum > Przedszkole
Kshyhoo
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.
neverever
skorzystaj np z http://php.net/manual/en/function.file-get-contents.php

zabezpieczenie? -np. sprawdzaj rozszerzenie i typ mime
Kshyhoo
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
thek
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.
Kshyhoo
Naczytałem się (na tym forum), że i MIME nie daje żadnej pewności...
erix
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.
Kshyhoo
Nic z tego nie wiem, tak daleko moja wiedza jeszcze nie sięga...
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.