Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kodowanie MD5 w skrypcie
Forum PHP.pl > Forum > Przedszkole
o2w5n778
Witam!
Czy mógł by ktoś ustawić kodowanie MD5 w skrypcie uploadu zdjęć?
  1. <?
  2. $site ="http://adres.pl/"; // adres strony na końcu pamiętaj o /
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <title>Dokument bez tytułu</title>
  9. </head>
  10.  
  11. <body>
  12.  
  13. <?php
  14. if ($_POST['dodaj']) {
  15.  
  16. $plik_nazwa = trim($_POST['plik_nazwa']);
  17. $plik_tmp = $_FILES['foto']['tmp_name'];
  18. $plik_nazwa = $_FILES['foto']['name'];
  19.  
  20. if(is_uploaded_file($plik_tmp)) {
  21. move_uploaded_file($plik_tmp, "../uploads/galeria/$plik_nazwa");
  22. echo "Plik: <strong>$plik_nazwa</strong> został przesłany na serwer!<br>";
  23. print 'link dla forum: <input type="text" value="'.$site.''.$plik_nazwa.'" size="40" /><br>';
  24. print 'link dla przeglądarki: <input type="text" value="'.$site.''.$plik_nazwa.'" size="40" /><br>';
  25. print 'kod dla html: <input type="text" value="<img src=&quot;'.$site.''.$plik_nazwa.'&quot; alt=&quot;Ładuje&quot; />" size="40" /><br>';
  26. /* Komenda Sprawdzająca Działanie Uploadu Zdjęcia */
  27. }
  28.  
  29. }
  30. ?>
  31.  
  32. <div id="okno">
  33. <form enctype="multipart/form-data" action="index.php" method="POST" name="newad">
  34. <div class="oknoDane">
  35. <p class="oknoDanePotrzebne">Podaj Potrzebne Dane:</p>
  36. <table><tr>
  37. <td><table><tr>
  38. <td>fotografia:</td><td><input type="file" name="foto" class="nazwy" /></td></tr></table></td>
  39. </tr></table>
  40. </div>
  41. <div class="pagesPrzyciski">
  42. <input type="submit" name="dodaj" class="pages" value="Dodaj" />
  43. <input type="reset" class="pages" value="Resetuj" />
  44. <input type="button" class="pages" onclick="java script:history.back();" name="wstecz" value="Wstecz" />
  45. </div>
  46. </form>
  47. </div>
  48. </body>
  49. </html>
Fifi209
Cytat(o2w5n778 @ 2.08.2010, 17:46:25 ) *
Witam!
Czy mógł by ktoś ustawić kodowanie MD5 w skrypcie uploadu zdjęć?
  1. <?
  2. $site ="http://adres.pl/"; // adres strony na końcu pamiętaj o /
  3. ?>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <title>Dokument bez tytułu</title>
  9. </head>
  10.  
  11. <body>
  12.  
  13. <?php
  14. if ($_POST['dodaj']) {
  15.  
  16. $plik_nazwa = trim($_POST['plik_nazwa']);
  17. $plik_tmp = $_FILES['foto']['tmp_name'];
  18. $plik_nazwa = $_FILES['foto']['name'];
  19. $kodowanie = md5($_POST['plik_nazwa']);
  20.  
  21. if(is_uploaded_file($plik_tmp)) {
  22. move_uploaded_file($plik_tmp, "../uploads/galeria/$plik_nazwa");
  23. echo "Plik: <strong>$plik_nazwa</strong> został przesłany na serwer!<br>";
  24. print 'link dla forum: <input type="text" value="'.$site.''.$plik_nazwa.'" size="40" /><br>';
  25. print 'link dla przeglądarki: <input type="text" value="'.$site.''.$plik_nazwa.'" size="40" /><br>';
  26. print 'kod dla html: <input type="text" value="<img src=&quot;'.$site.''.$plik_nazwa.'&quot; alt=&quot;Ładuje&quot; />" size="40" /><br>';
  27. /* Komenda Sprawdzająca Działanie Uploadu Zdjęcia */
  28. }
  29.  
  30. }
  31. ?>
  32.  
  33. <div id="okno">
  34. <form enctype="multipart/form-data" action="index.php" method="POST" name="newad">
  35. <div class="oknoDane">
  36. <p class="oknoDanePotrzebne">Podaj Potrzebne Dane:</p>
  37. <table><tr>
  38. <td><table><tr>
  39. <td>fotografia:</td><td><input type="file" name="foto" class="nazwy" /></td></tr></table></td>
  40. </tr></table>
  41. </div>
  42. <div class="pagesPrzyciski">
  43. <input type="submit" name="dodaj" class="pages" value="Dodaj" />
  44. <input type="reset" class="pages" value="Resetuj" />
  45. <input type="button" class="pages" onclick="java script:history.back();" name="wstecz" value="Wstecz" />
  46. </div>
  47. </form>
  48. </div>
  49. </body>
  50. </html>

Wstawione! winksmiley.jpg

A tak serio to dział pomoc, po pierwsze Jak poprawnie zadać pytanie
o2w5n778
Jest kodowanie MD5 to czemu nadal po wrzuceniu obrazka na serwer z polskimi znakami zmienia się jego nazwa?
Może to coś innego zrobić trzeba? :/
Crozin
@fifi209: Takie bezsensownie długie cytowanie, szczególnie całych wiadomości, gdy Twoja odpowiedź jest jedyną w wątku jest niezwykle irytujące... - z łaski swej popraw to, bym mógł usunąć tego posta

Aha... i MD5 to nie jest algorytm kodowania. Dostałeś linka z instrukcją jak zadawać pytania - jest tam na pewno punkt mówiący o tym, że adresat pytania musi w ogóle zrozumieć co masz na myśli.
krispak
Zamien to
  1. move_uploaded_file($plik_tmp, "../uploads/galeria/$plik_nazwa");

na
  1. move_uploaded_file($plik_tmp, "../uploads/galeria/$kodowanie");
o2w5n778
No teraz znacznie lepiej tylko jak przez upload wgram plik o nazwie "śżźćłó.jpg" zmienia się na "d41d8cd98f00b204e9800998ecf8427e"

I mogę powiedzieć że jest prawie dobrze, tylko wygenerowana nazwa nie ma rozszerzenia więc przeglądarka nie może tego otwożyć
krispak
Dodaj jeszcze przed $kodowanie
  1. $ext = substr($plik_nazwa, strpos($plik_nazwa,'.'), strlen($plik_nazwa)-1);

a po $kodowaniu
  1. $lacz = $kodowanie.$ext;

i zastap to
  1. move_uploaded_file($plik_tmp, "../uploads/galeria/$kodowanie");

tym
  1. move_uploaded_file($plik_tmp, "../uploads/galeria/$lacz");


Hehe
Pozdrawiam
Crozin
Cytat
  1. $ext = substr($plik_nazwa, strpos($plik_nazwa,'.'), strlen($plik_nazwa)-1);
Jej
  1. $ext = pathinfo($plik_nazwa, PATHINFO_EXTENSION);
o2w5n778
Już wszystko z rozszerzeniami OK tylko po uploadowaniu pliku wyświetla się zła nazwa, a powinna się wyświetlać ta nowa wygenerowana

Juz ok
Fifi209
Cytat(Crozin @ 2.08.2010, 18:48:24 ) *
@fifi209: Takie bezsensownie długie cytowanie, szczególnie całych wiadomości, gdy Twoja odpowiedź jest jedyną w wątku jest niezwykle irytujące... - z łaski swej popraw to, bym mógł usunąć tego posta

To jak mu niby miałem wstawić do kodu?? ;]
Crozin
Cytat
o jak mu niby miałem wstawić do kodu?? ;]
Kurde... wziąć i tą jedną linijkę podmienić?
Fifi209
Cytat(Crozin @ 2.08.2010, 21:11:10 ) *
Kurde... wziąć i tą jedną linijkę podmienić?

To też mu dodałem, chciał gotowca. biggrin.gif
Skoro nie widzisz, żartu w moim poście to nie mamy o czym rozmawiać ;]
IceManSpy
A ktoś pomyślał, co będzie jak wrzucimy 2 zdjęcia o tej samej nazwie? Przecież MD5 zwróci ten sam wynik i nadpisze stary albo jakiś błąd wyrzuci (ale raczej nadpisze). Więc albo robić MD5 z nazwy pliku + jakieś rand, albo w ogóle napisać sobie funkcję, która generuje ileś tam znaków (liczb), sprawdzić czy takie coś istnieje, jak tak, to jeszcze raz losujemy, jak nie, to ten twór zapisujemy jako nazwę pliku + rozszerzenie.
krispak
  1. $kodowanie = md5($_POST['plik_nazwa'].microtime());

i nic sie nie powtorzy

Pozdrawiam
!*!
A ja mam jedno nieśmiałe pytanie... Po kiego wała stosować md5 do nazwy obrazka? Że niby nazwa "losowa"?
Crozin
Bardzo szybki sposób pozbycia się z nazwy plików śmieci w postaci jakiś znaków specjalnych.
everth
Są rzeczy na niebie i ziemi o których nie śniło się naszym filozofom. Można się tu nauczyć np. paru ciekawych rozwiązań - liczenia sumy po nazwie i mt_rand lub nazwie i microtime. Dziwne że nikt jeszcze nie wpadł na tak egzotyczne rozwiązanie jak liczenie sumy po zawartości...

@EDIT: @Crozin a w czym to lepsze od preg_replace("/[^a-zA-Z0-9]*/",'',$string) ?
Crozin
Cytat
Dziwne że nikt jeszcze nie wpadł na tak egzotyczne rozwiązanie jak liczenie sumy po zawartości...
Pewnie dlatego, że przy większych plikach byłoby to zbyt kosztowe?
Cytat
@EDIT: @Crozin a w czym to lepsze od preg_replace("/[^a-zA-Z0-9]*/",'',$string) ?
  1. $filename = md5(uniqid() . $filename);
  2. $filename = uniqid() . preg_replace("/[^a-zA-Z0-9]*/",'',$filename);
Pewnie tym, że jest prostsze, bardziej czytelne oraz daje mniejsze prawdopodobieństwo wystąpienia konfliktu nazw.
Fifi209
Cytat(Crozin @ 2.08.2010, 23:36:06 ) *
Pewnie tym, że jest prostsze, bardziej czytelne oraz daje mniejsze prawdopodobieństwo wystąpienia konfliktu nazw.

A mi się wydawało, że prawdopodobieństwo konfliktu jest zawsze takie samo...
Jeżeli chciałbyś je zmniejszyć to np.

  1. $string = md5(uniqid() . $filename) . uniqid();


Wtedy szansa na dwa pliki o identycznej nazwie jest znacznie mniejsza.
everth
@Crozin: ja nie mówiłem o sumie z (uniqid()+$filename) ale niech ci będzie winksmiley.jpg. Bardziej ciekawi mnie granica rozmiaru powyżej której sumy nie opłaca się liczyć, z mojego doświadczenia to jakieś ~30-40MB, poniżej czas liczenia mieści się w 1-2s, biorąc przy tym pod uwagę że o ile ktoś nie wrzuca filmów (bo mu dostawca w php.ini i tak nakłada limit) to liczenie po zawartości ma też jedną zaletę - unikamy dubli na dysku (co ma znaczenie jeśli ma ograniczony przydział dysku);

PS: A właściwie to po co liczyć sumę po uniqid() i nazwie, skoro uniqid jest losowy.
Crozin
Cytat
A mi się wydawało, że prawdopodobieństwo konfliktu jest zawsze takie samo...
No to Ci się źle wydawało.
@everth: 1-2 sekundy na liczenie samej sumy? 40 mb pamięci na to marnować? By wygenerować względnie unikalny identyfikator? Przecież kilkunastu-kilkudziesięciu użytkowników przy czymś takim jest wstanie zablokować serwer

Cytat
PS: A właściwie to po co liczyć sumę po uniqid() i nazwie, skoro uniqid jest losowy.
uniqid nie jest losowy. Opiera się na czasie.

Z tymi dublami na dysku to raczej bym się wstrzymał. Pamiętaj, że mimo iż jest to naprawdę mało prawdopodobne dwa różne pliki mogą dać ten sam hash. Poza tym - ilość takich zdublowanych plików jest raczej niewielka.
everth
@Crozin - to jest właśnie dylemat. Myślałem że znasz jakiś lepszy sposób na detekcję dubli. Przy dużym ruchu nie opłaca się liczyć sum, ale wzrasta ryzyko sytuacji (mówię o portalu społecznościowym) że ktoś puści słitaśną fotkę i każdy będzie chciał ją mieć. Część z tych osób dostanie ją np emailem i będą robić uploady (często pod innymi nazwami). Bez sum nie widzę żadnego rozwiązania.

Poza tym dalej nie widzę w czym takie md5(uniqid.$filename) jest lepsze od $name = uniqid().$file['tmp_name']. W drugim przypadku oba elementy są losowe. W pierwszym rozumiem że md5 zabezpiecza cię tylko przed znakami specjalnymi (bo chyba nie przed kolizją?). Choć coś mi mówi że można to samo osiągnąć za pomocą prostszych funkcji (szybszych?).
Crozin
Co do dubli: IMO nie warto się nimi zajmować, szczególnie przy obecnych cenach dysków.
Takie przelecenie nazwy pliku jakąkolwiek funkcją hashującą daje Ci kilka rzeczy:
1) Kod jest bardzo prosty - bez zbędnego kombinowania (wygenerowania hasha dla kilkudziesięcioznakowego to "zerowy" czas)
2) Szybkie zunifikowanie nazw - porządek
3) Stała długość ciągu - przydatne jeżeli nazwy plików chcemy gdzieś magazynować (np. w bazie danych)

Co do kolizji nazw. Sam hash daje już niezwykle małe prawdopodobieństwo wystąpienia takiej kolizji, ale... przezorny zawsze ubezpieczony:
  1. do {
  2. $filename = md5(uniqid() . $name)
  3. } while(file_exists($filename));
everth
Hmm, co do ostatniego się nie zgodzę. Pokaż mi różnicę:
  1. $filename = md5(uniqid() . $name);
  2. $myFilename = uniqid().$name;

i załóżmy hipotetyczną sytuację że uniqid() dał tą samą wartość (sam mówisz że to oparte o czasie, może się zdarzyć) a $name też to samo. md5 nic ci nie daje (liczone po tym samym ciągu) - daje ci jedynie pierwsze 3 zalety.

Jest mówisz o przechowywaniu w bazie to równie dobrze można jednak nadawać porządkowe ID jako prefiks nazwy i klucz md5 liczony po zawartości (dodatkowo z atrybutem unique) - wtedy plik powodujący kolizję po prostu nie będzie mógł być dodany. Co do szybkości tworzenia kluczy - przecież i tak nie musimy liczyć dla całości tylko dla pierwszych n-bajtów, obniża to bezpieczeństwo naszej sumy ale zabezpiecza przed dużymi plikami. Trochę się offtop zrobił.
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.