Jak sprawdzić czy w zmiennej instnieje dany ciąg znaków?

0

Witam,
napisałem takie coś:

if($plik_nazwa != ".php") { unlink("upload/$plik_nazwa"); } else

oczywiste że nie działa. :) Ale do rzeczy.
Zrobiłem upload i chciałbym się zabezpieczyć przed plikami php. Chciałbym aby po wrzuceniu usuwał się taki plik. Bez problemu dam sobie radę, jak mi powiecie, jak sprawdzić czy w zmiennej istnieje ciąg znaków (czyli .php)
Pozdrawiam :)

0

Może jedna z funkcji:

0

Przede wszystkim to przy uploadzie rób białą listę dozwolonych rozszerzeń, nie natomiast czarną listę zabronionych rozszerzeń. Dlaczego? Ano dlatego, że na różnych serwerach mogą funkcjonować różnego rodzaju handlery pewnych typów plików, o których pojęcia nie masz. Zablokujesz *.php, natomiast możliwe, że skrypt da się uruchomić z plików *.php4, *.php5. Może być to też zupełnie inny język.
Zapewne lista typu: jpeg, jpg, png, gif (obrazki) ew. dodając rar, zip, 7z, tar (archiwa) doc, docx, xls, xlsx, ppt, pptx (MS Office) odt, ods, odp (Open Office) w zupełności Ci wystarczy.

Jak takie coś wykonać = w sieci jest około 34329589235 przykładów. Czyli lenistwo. Czyli BARDZO niedobrze.
Próba użycia IDIOTYCZNEGO if($plik_nazwa != ".php") - zupełny brak zrozumienia i myślenia. Programowanie to NIE JEST wklepywanie na zasadzie "a może zadziała". Z takim podejściem zabierz się za coś innego.
Poza tym nie "wyrzucaj" pliku po wgraniu, jeżeli Ci nie podpasuje do reguły - po prostu w ogóle go umieszczaj.

Podałbym Ci rozwiązanie, ale niestety patrząc na Twój styl "bycia", sugeruję Ci teraz samodzielnie poszukać w Google i przedstawić nam wynik Twoich prac (do oceny, czy czegoś nie przeoczyłeś). Musisz też ZROZUMIEĆ kod, który znajdziesz w Internecie i zapewne przekleisz. Jeżeli zrobisz TYLKO ctrl+c, ctrl+v - także to wszystko nie będzie miało sensu.

Mogę brzmieć trochę niemiło, ale przyda Ci się taki "zimny prysznic".

0

Przede wszystkim to przy uploadzie rób białą listę dozwolonych rozszerzeń, nie natomiast czarną listę zabronionych rozszerzeń.

Tez nad tym myslalem. Postanowie iz tak zrobie.
Dziekuje za jak zwykle odsylanie do Google i pomoc typu "sam se radz". Pewnie to kwestia kilku linijek, a moze nawet i jednej.
Chciałem po prostu tylko dowiedzieć się, jak sprawdzić czy plik ma takie rozszerzenie. Jeśli takie ma, to go usunąć. Nie jest to zaawansowany upload typu Rapidshare, a zwyczajny, prosty upload, który zdołałem sam napisać, bez znajomości tegoż języka.
Może ktoś mi jeszcze coś podpowie...

0

Czyli jednak nie umiesz samodzielnie myśleć, no to szkoda, programisty z Ciebie nie będzie.

Edit: Szkoda, też, że nie zauważyłeś, że moja odpowiedź to nie było bezcelowe "spadaj na drzewo, szukaj w Google". Napisałem Ci 3 solidne akapity tekstu, zwracając uwagę na rzeczy, które mogą być pominięte w gotowcach. Najlogiczniejszym sprawdzeniem rozszerzenia będzie użycie preg_match, ale tu będę Ci całą lekcję musiał napisać na 10 stron, poniewaz, to co w Google jest o wyrażeniach regularnych to przecież śmierdzi, i Google jest dla frajerów. Druga opcja, lepsza dla początkujących, to tablica rozszerzeń, explode, end, oraz in_array. strstr oraz strpos to zły wybór.

0

najlogiczniej angażować wyrażenia regularne do tak prostej operacji? substr($plik_nazwa, -4) != ".php"

1

Ja jak miałem kiedyś stronę używałem tego:

Uploader:

<?php 
$plik_tmp = $_FILES['plik']['tmp_name']; 
$plik_nazwa = $_FILES['plik']['name']; 
$plik_rozmiar = $_FILES['plik']['size']; 

$sp = explode(".",$plik_nazwa); 

// sprawdzamy rozszerzenie 
if($sp[1] == "jpg" or $sp[1] == "png" or $sp[1] == "zip" or $sp[1] == "rar" or $sp[1] == "txt" or $sp[1] == "asm" or $sp[1] == "doc" or $sp[1] == "rtf" or $sp[1] == "pdf" or $sp[1] == "pas" or $sp[1] == "cpp")
{ 
	if(is_uploaded_file($plik_tmp)) { 
		move_uploaded_file($plik_tmp, "files/$plik_nazwa"); 
		echo "Plik <strong>$plik_nazwa</strong> został przesłany!<br /><br />"; 
		echo "Link do pliku:<br><input value='http://xxx.xxx/$plik_nazwa' type='text' name='link'>";
	} 
} 
else { 
	echo "Dozwolone typy plików to: png, jpg, zip, rar, txt, doc, rtf, pdf, asm, cpp, pas.<br />";
	echo "Maksymalny rozmiar pliku to 5 MB";
}


?>

Formularz:

<form enctype="multipart/form-data" action="index.php" method="POST"> 
<input type="hidden" name="MAX_FILE_SIZE" value="5242880" /> 
<input name="plik" type="file" /> 
<input type="submit" value="Wyślij plik" /> 
</form> 

Co o tym sądzicie, czy powyższy sposób jest bezpieczny?

1

Straszny syf, panie Farbaniec, prędzej tak:

$dozwolone = array('png', 'jpg', 'zip', 'rar', 'txt', 'doc', 'rtf', 'pdf', 'asm', 'cpp', 'pas');

$plik_tmp = $_FILES['plik']['tmp_name']; 
$plik_nazwa = $_FILES['plik']['name']; 
$plik_rozmiar = $_FILES['plik']['size']; 

$rozszerzenie = pathinfo($_FILES['plik']['name'], PATHINFO_EXTENSION);
 
if(in_array(strtolower($rozszerzenie), $dozwolone))
{ 
        if(is_uploaded_file($plik_tmp)) { 
                move_uploaded_file($plik_tmp, "files/$plik_nazwa"); 
                echo "Plik <strong>$plik_nazwa</strong> został przesłany!<br /><br />"; 
                echo "Link do pliku:<br><input value='http://xxx.xxx/$plik_nazwa' type='text' name='link'>";
        } 
} 
else { 
        echo 'Dozwolone typy plików to: ' . implode(', ', $dozwolone) . '<br />';
        echo 'Maksymalny rozmiar pliku to 5 MB';
}

Co nie zmienia faktu, że kod nadal ssie. Nie tłumacz się nieznajomością PHP, te błędy są niezależne od używanego języka.

0

Poza tym do obsłużenia jest jeszcze sporo przypadków, czy na pewno plik nie jest za duży, próby kombinowania z nazwami plików (path traversal, alternatywne strumienie danych na NTFS) itd.

0
$sp = explode(".",$plik_nazwa); 

To jest właśnie to, czego szukałem! Teraz na pewno sam sobie poradzę :)

0

@Alvinek34, cholera, nie explode tylko pathinfo!

0

najlogiczniej to będzie po prostu uploadować do folderu w którym wyłączy się obsługę php
wtedy można nawet uploadować pliki *.php i ściągną się plaintekstem

ewentualnie jeśli boisz się że "nagle obsługa php magicznie się sama włączy" albo chcesz się uchronić przed tym że zaincludujesz jakimś cudem taki plik to najlepiej plikom przypisywać losowe nazwy, nawet mogą być bez rozszerzenia i zrobić mapowanie prawdziwych nazw na te losowe na przykład w bazie danych, a przy ściąganiu przez nagłówki http można przywrócić oryginalną nazwę

wtedy user będzie mógł sobie uploadował co mu się żywnie podoba a tobie to nie powinno przeszkadzać

0

Ty [CIACH!] zjebie nie pisz w tym php. PS: Jan Paweł II Jebał małe dzieci AAAAAAAa!!!!!

0
Krzywy Terrorysta napisał(a):

Ty [CIACH!] zjebie nie pisz w tym php. PS: Jan Paweł II Jebał małe dzieci AAAAAAAa!!!!!

Z tej strony Szalony Terrorysta,
Bardzo nie podoba mi sie Panskie zachowanie.
Mam nadzieje ze ulegnie ono poprawie.
Pozdrawiam Abdul Abdullkadir

1 użytkowników online, w tym zalogowanych: 0, gości: 1