Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Filtrowanie zmiennej
Forum PHP.pl > Forum > Przedszkole
pitu
Witam!

Mam skrypt wywołujący konkretny plik z danego adresu, fragment:
Kod
...

$filename = $_GET['file'];
switch($filename)
       {

case 'costam':
$filename='adres do pliku';

...


Lecz skrypt posiada poważną lukę i nie wiem za bardzo jak to naprawić, otóż po wywołaniu zmiennej file można ściągnąć każdy plik z serwera.

np.:
skrypt.php?file=index.php

Byłbym wdzięczny za radę jak rozwiązać ten problem.
Makciek
gdzieś tu na forum był o tym wątek, poszukaj, to było coś, w sytylu, ktoś podaje nazwe pliku, a skrypt dodaje rozszerzenie

poczytaj:
Temat: Bezpieczestwo skryptw PHP

jest tam dość duo o tym napisane
pitu
OK dzięki, myślę, żeby zrobić to w taki sposób. Do zmiennej filename dodać zmienną, która będzie przechowywała domenę z której pobieram pliki i to wrzucić pod osobną zmienną czy coś w stylu nowazmienna = filename+zmienna z domena i nową zmienną dodać do switcha. Czy takie rozwiązanie było by bezpieczne?

Mógłby ktoś pomóc, próbuję robić w taki sposób jak napisałem lecz nic to nie daje. :/
wookieb
Chyba zmienna_z_domena+filename
1) musisz kontrolować rozszerzenia
2) pliki sa w jakims podfolderze? czy w tym samym w jakim jest skrypt?
Jeżeli w podfolderze to nie powinienes dopuszczac kombinacji znaków "./", "../" gdziekolwiek w tekscie i "/" na poczatku
W drugim przypadku nie mozesz zezwolic na wystapienie znaku /. Niestety ogolnie filtrowanie tego jest trochę nie za fajne ale może powiesz co chcesz osiągnąć?
pitu
Pliki, które są pobierane znajdują się całkowicie pod inną domeną, chciałbym aby tylko z tej domeny można includować pliki.

Użyłem tam switcha aby w get nie podawać nazwy/ścieżki pliku tylko jakąś frazę. Wywołując w taki sposób skrypt:
skrypt.php?file=index.php

Chciałbym aby skrypt domyślnie dodał domenę, z której pobieram moje pliki, czyli to nie było by już zagrożenie dla mojej strony. Domena to serwer FTP i żadne skrypty tam nie są odpalane. Próbowałem również do switcha dodać opcję default lecz i tak można bez problemu odpalić każdy plik na serwerze.
Pawel_W
wg najlepsze rozwiązanie w takim wypadku to wyrażenia regularne winksmiley.jpg
pitu
OK chodzi Ci o takie sprawdzanie?

Kod
if(preg_match('/^[a-zA-Z]$/D', $_GET['file']))


Jeżeli tak to w jaki sposób to wmontować do mojego skryptu smile.gif

Coś w stylu:
Kod
....

$filename = $_GET['file'];
if(preg_match('/^[a-zA-Z]$/D', $_GET['file'])) // w Get przyjmuje tylko duże i małe litery.
{
switch($filename)
       {

case 'costam':
$filename='adres do pliku';

...
} //od switcha
}
else
{
echo 'error';
}
Pawel_W
właśnie tak, chodzi głównie o to żeby nie dało się podać / winksmiley.jpg
pitu
Niestety zrobiłem tak jak napisałem wyżej i po próbie wywołania jakiego kol wiek pliku, spełniającego warunek lub nie otwiera się pusta strona. Próbowałem przypisanie Geta do zmiennej schować pod warunek ale wtedy obojętnie czego bym nie wywołał ściąga plik ze skryptem (pusty).
Fifi209
Jeżeli chcesz aby to było bezpieczne to trzymaj te pliki po prostu u siebie... ?

Co do nazwy pliku możesz z basename popróbować.
pitu
Cytat(fifi209 @ 27.08.2009, 00:31:40 ) *
Jeżeli chcesz aby to było bezpieczne to trzymaj te pliki po prostu u siebie... ?

Co do nazwy pliku możesz z basename popróbować.


Pliki nie mogę być na tej samej domenie, są zbyt duże i obciążały by za bardzo serwer www.

Mógłby ktoś pomóc z tym wyrażeniem regularnym lub basename, do pierwszego podałem wyżej, a do drugiego potrzebuję pomocy. smile.gif

Podam pełny skrypt, będzie pewnie prościej:

Kod
<?php

$filename = $_GET['file'];
switch($filename)
       {

case 'costam':
$filename='link do pliku';              
                       break;

}

if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');

$file_extension = strtolower(substr(strrchr($filename,"."),1));


switch( $file_extension )
{
  case "pdf": $ctype="application/pdf"; break;
  case "exe": $ctype="application/octet-stream"; break;
  case "zip": $ctype="application/zip"; break;
  case "doc": $ctype="application/msword"; break;
  case "xls": $ctype="application/vnd.ms-excel"; break;
  case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  case "gif": $ctype="image/gif"; break;
  case "png": $ctype="image/png"; break;
  case "jpeg":
  case "jpg": $ctype="image/jpg"; break;
  default: $ctype="application/force-download";
}
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false)
header("Content-Type: $ctype");
// change, added quotes to allow spaces in filenames, by Rajkumar Singh
header("Content-Disposition: attachment; filename=\"".basename($filename)."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("$filename");
exit();

?>
cojack
Przechowuj sobie nazwy plików które masz gdzieś na serwie w bazie, później sprawdzaj czy istnieje taki plik który chce ściągnąć user, jak nie ma to nie i już. Nikt Ci wtedy nie będzie pobierał index'a czy czegoś innego z innego serwera, btw jak wyrzuca pliki tzn że jest zła konfiguracja apache.
pitu
Cytat(cojack @ 27.08.2009, 09:40:10 ) *
Przechowuj sobie nazwy plików które masz gdzieś na serwie w bazie, później sprawdzaj czy istnieje taki plik który chce ściągnąć user, jak nie ma to nie i już. Nikt Ci wtedy nie będzie pobierał index'a czy czegoś innego z innego serwera, btw jak wyrzuca pliki tzn że jest zła konfiguracja apache.


Nie znam praktycznie PHP, MySQL tym bardziej więc na bazie tego nie 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.