witam. Wiecie może jak można skutecznie zabezpieczyć upload plików *.php na serwer ?
Najprosciej zmieniac im rozszerzenie, sprawdzac czy nie php (jak tak to usuwac) itp.
mam taki kod:
$plik_tmp = $_FILES['plik']['tmp_name'];
$plik_nazwa = $_FILES['plik']['name'];
$plik_rozmiar = $_FILES['plik']['size'];
$mime = $_FILES['plik']['type'];
if(strpos($mime, 'image') !== false) {
//właściwy kod uploadu
i nawet to nie zabezpiecza strony przed atakiem
Mime mozna oszukac. Sprawdzaj rozszerzenie. Przeciez nawet jak ktos wrzuci php, a serwer zamieni to na jpg, to wpisujac skrypt.jpg go nie uruchomisz :)
johny_bravo...a jak sprawdzic rozszerzenie ?
if(strpos($nazwa_pliku, '*.php') !== false) {
echo 'atak';
}
??
eregi_replace("\.(php|php4|php3|php5)$", "", $nazwa_pliku);
Spie juz, wiec moga byc drobne problemy z dzialaniem powyzszego :P Ale idea taka - pamietaj, ze to Ty zapisujesz ten plik, wiec to Ty decydujesz jaka bedzie mial nazwe (i rozszerzenie)
raczej bez gwiazdki. Poza tym co będzie, jak upne plik .php3, albo - co gorsza .phtml? (czy jaki tam może być wlaczony w php)...
pierwsze - zapisuj tak jak johny mówi (edit: mowił :P, do pliku, którego serwer nie sparsuje - np. zip)
drugie - jak chcesz mieć pewność, że to obrazek, to najlepiej go po wczytaniu przeskaluj do wielkości jaką tam chcesz
http://4programmers.net/Forum/361283#id361283 - swoją drogą
Już to zadawałem na forum. Link coldpeera. Mam kod do upladu taki:
<?php
$aext = 'jpeg|jpg|gif|png';
if ( !preg_match("/\.(?:$aext)$/i", $_FILES['userfile']['name']))
die("Nieprawidłowy typ pliku");
if( is_uploaded_file( $_FILES['userfile']['tmp_name'] ) )
{
$strUploadDir = /upload/ . $_FILES['userfile']['name'];
if( move_uploaded_file( $_FILES['userfile']['tmp_name'], $strUploadDir ) )
{
echo 'Plik został pomy¶lnie uploadowany! Je¶li był to inny plik niż tapeta, to zostanie automatycznie usunięty. <br />';
}
else
{
echo 'Upload pliku nie powiódł się!';
}
echo 'Dodatkowe informacje o uploadowanym pliku: <pre>' . print_r( $_FILES, true ) . '</pre>';
}
else
{
echo 'Wyst±pił bł±d podczas wysyłania pliku na serwer!';
}
?>
Jeszcze na wszelki wypadek do tego kodu daje
<?php
foreach(glob('tapetki/{*.htm,*.php,*.zip,*.html,*.xml,*.rar,*.php3,*.txt,*.doc,*.wri}', GLOB_BRACE) as $file)
if($file != '.' && $file != '..')
unlink($file);
?>
,choć nie wiem po co, jeśli na pewno tam nie bedzie takich plików.