Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prośba o zabezpieczenie skryptu
Forum PHP.pl > Forum > PHP
miszcz
Mógłbym prosić kogoś o rzucenie okiem na poniższy skrypt i dodanie kilku linijek do zabezpieczenia głównie przed możliwością wgrania plików o takiej nazwie "plik.jpg.php" oraz przed SQL Injection?
Przeglądałem ten wpis, ale nie bardzo wiem jak dodać te funkcje (i czy warto, bo wpis raczej już wiekowy, nawet sam autor to napisał). http://mijagi.eu/2011/09/zabezpieczenie-skryptu-uploadu/

  1. <?php
  2. include('mysql.php');
  3. include('functions.php');
  4.  
  5. if(isset($_POST['submit_obrazek']) and $_GET['co']=='obrazek')
  6. {
  7. if(!$_POST['tytul'] || !$_FILES['obrazek']['name']) {
  8. echo '<b>Nie wypełniono pola z tytułem lub obrazkiem!</b><br/><a href="add.php">&laquo; Powrót</a>';
  9. }
  10. else {
  11. //UPLOAD OBRAZKA
  12. $sp1 = explode(".",($_FILES['obrazek']['name']));
  13. if($sp1[1] == "gif" or $sp1[1] == "jpg" or $sp1[1] == "JPG" or $sp1[1] == "GIF" or $sp1[1] == "jpeg" or $sp1[1] == "JPEG" or $sp1[1] == "png" or $sp1[1] == "PNG")
  14. {
  15. $data_img=date('dmYHis');
  16. $uploaddir = './img/'.$data_img.'-';
  17. $_FILES['obrazek']['name'] = przyjazny_string($_FILES['obrazek']['name']);
  18. if(move_uploaded_file($_FILES['obrazek']['tmp_name'], $uploaddir.$_FILES['obrazek']['name']))
  19. {
  20. //Zmiana rodzielczości obrazka
  21. if($sp1[1] != "gif" AND $sp1[1]!= "GIF") {
  22. $image = new SimpleImage();
  23. $image->load($uploaddir.$_FILES['obrazek']['name']);
  24. if($image->getWidth() > 670) {
  25. $image->resizeToWidth(670);
  26. $image->save($uploaddir.$_FILES['obrazek']['name']);
  27. }
  28. else { //Zmiana wielkości do tego samego rozmiaru ale z kompresją
  29. $image->resizeToWidth($image->getWidth());
  30. $image->save($uploaddir.$_FILES['obrazek']['name']);
  31. }
  32. }
  33. //////////////////////////////
  34. $obrazek='./img/'.$data_img.'-'.$_FILES['obrazek']['name'];
  35. $tytul=htmlspecialchars($_POST['tytul']);
  36. // $zrodlo=htmlspecialchars($_POST['zrodlo']);
  37. $data=date('Y-m-d H:i:s');
  38.  
  39. $zapytanie = "INSERT INTO `images` (`image_id`, `title`, `image`, `date`, `type`) VALUES ('', '$tytul', '$obrazek', '$data', 'obrazek')";
  40. $wykonaj = mysql_query($zapytanie);
  41. echo '<b>Obrazek został pomyślnie dodany!</b><br/>
  42. <a href="./index.php">&laquo; Strona Główna</a>';
  43. }
  44. else {
  45. echo '<b>Wystąpił błąd podczas dodawania obrazka.</b><br>';
  46. echo '<a href="add.php">&laquo; Powrót</a>';
  47. }
  48. }
  49. else {
  50. echo '<b>Nie wybrano żadnego obrazka bądź jego format jest niedozwolony!</b><br/><a href="add.php">&laquo; Powrót</a>';
  51. }
  52. //KONIEC UPLOAD OBRAZKA
  53. }
  54. }
  55. else {
  56. ?>
  57.  
  58. <?php
  59. if($_GET['co']=='obrazek' || !$_GET['co'])
  60. {
  61. ?>
  62.  
  63. <form action="./add.php?co=obrazek" method="post" enctype="multipart/form-data">
  64.  
  65. Title:
  66. <input class="pole" type="text" name="tytul"> <br>
  67. Add image:
  68. <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $ustawienia['max_file_size']*1024; ?>" /> <!--maksymalna wielkość pliku w bajtach-->
  69. <input name="obrazek" type="file" /> <span style="color:#595959">(max. <?php echo $ustawienia['max_file_size']; ?>KB)</span> <br>
  70. <input type="submit" name="submit_obrazek" class="button" value="Send" />
  71. </form>
  72.  
  73. <?php
  74. }
  75. }
  76. ?>
!*!
Cytat(miszcz @ 12.04.2012, 09:22:31 ) *
Mógłbym prosić kogoś o rzucenie okiem na poniższy skrypt i dodanie kilku linijek do zabezpieczenia głównie przed możliwością wgrania plików o takiej nazwie "plik.jpg.php" oraz przed SQL Injection?


  1. function ext($ext)
  2. {
  3. return strtolower(array_pop(explode('.', $ext)));
  4. }


Zwróci ostatni ciąg po ostatniej kropce.

mysql_real_escape_string(), albo w ogóle użyj PDO i bindowania, wtedy pozbędziesz się problemu z SQL I.
tolomei
Witaj.

1. W linii 7. sprawdzasz czy wartość elementu tablicy $_GET['obrazek'] bez sprawdzenia, czy ten index istnieje. To może powodować wiadomość notice.
2. W linii 14. rozdzielasz nazwę na części według kropki. Rozważ sytuację, gdy podam Ci plik o nazwie "moj.wspanialy.plik.jpg". Otrzymam pouczenie, że format jest niedozwolony.
3. W linii 15. warunek można bardziej zoptymalizować. Błędu nie ma, ale można by dopracować to.
4. W linii 19. użyłeś funkcji przyjazny_string(). Możesz pokazać co zawiera?
5. W linii 37. zmieniłbym funkcję na addslashes(). Nie mówię, że to jest błąd, ale wolałbym mieć prawdziwy znak apostrofu w bazie zamiast & #039;.
Ma to znaczenie np. przy przeszukiwaniu bazy.

Rozwiązania:

1. Powinieneś najpierw sprawdzać czy zmienna istnieje, a potem sprawdzać jej wartość. Warto także pracować na zmiennych lokalnych zamiast na superglobalnych. Przykład kodu:
  1. $submit_obrazek = isset($_POST['submit_obrazek']) ? funkcja_filtrujaca1($_POST['submit_obrazek']) : null;
  2. $co = isset($_GET['co']) ? funkcja_filtrujaca2($_GET['co']) : null;
  3. if(!empty($submit_obrazek) && $co == 'obrazek') {
  4. // dalszy kod
  5. }


2. Pobieranie rozszerzenia pliku wykonujemy w ten sposób:
  1. $rozszerzenie = pathinfo($nazwapliku, PATHINFO_EXTENSION);

Poczytaj w manualu o funcji pathinfo.

3. Mówiłem, że błędu nie ma, ale można zrobić przyjemniejsze dla oka:
  1. if(in_array(strtolower($rozszerzenie), array("gif", "jpg", "jpeg", "png", "gif")) {
  2. // dalszy kod
  3. }


5. Przy przygotowywaniu danych do użycia w zapytaniu SQL lepiej użyj funkcji mysql_real_escape_string() ewentualnie jakieś dodatkowe filtrowania. Dopiero przy wyświetlaniu tytułu na stronie użyj funkcji htmlspecialchars(). Zainteresuj się PDO. Funkcje zaczynające się od mysql będą w przyszłości wychodzić z PHP.

Pozdrawiam.
miszcz
Nie wiem czemu, ale po wpisaniu kodu w skrypt wyrzuca błędy, albo w ogóle nie działa, albo z błędami ale przepuszcza dalej (w przypadku plików z rozszerzeniem plik.jpg.php). Potrafiło też wyrzucić, błąd o braku tytułu, obrazku lub nieprawidłowym formacie.

W linii 19. "przyjazny_string" w podłączonym pliku "functions.php" znajduje się to:

  1. $host = $_SERVER['HTTP_HOST'];
  2. $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  3.  
  4. function przyjazny_string($string){
  5. $string = strtr($string, 'ĘęÓ󥹌śŁłŹźŻżĆćŃńŻż', 'EeOoAaSsLlZzZzCcNnZz');
  6. $string = strtr($string, questionmark.gifquestionmark.gifĽ','ASZasz');
  7. $string = preg_replace("'[[:space:]]'",'-',$string);
  8. $string = strtolower($string);
  9. $znaki = '-';
  10. $powtorzen = 1;
  11. $string = preg_replace_callback('#(['.$znaki.'])\1{'.$powtorzen.',}#', create_function('$a', 'return substr($a[0], 0,'.$powtorzen.');'), $string);
  12. return $string;
  13. }


edit (13.04.2012):
mógłbym prosić by jednak ktoś "wtopił" to w kod? wink.gif
tolomei
Witaj.

Rozwiązanie problemu, który opisałeś na początku ostatniego postu wyjaśniłem w punkcie drugim mojego ostatniego postu.
Funkcję można zapisać inaczej, prościej, jednak nie zawiera ona błędów.

Cytat
mógłbym prosić by jednak ktoś "wtopił" to w kod?


Może jeszcze herbatkę i ciasteczko? wink.gif

Pozdrawiam.
miszcz
tylko jak podstawiam pod' rozszerzenie zmienną $sp1 i pod 'nazwapliku' $_FILES['obrazek']['name'] to dalej nie działa...
tolomei
Rozumiem, że naniosłeś poprawki.
Pokaż aktualny kod. Zaznacz miejsce, gdzie nie działa.
miszcz
po prostu wstawiłem ten kod:
  1. $sp1 = pathinfo($_FILES['obrazek']['name'], PATHINFO_EXTENSION);

zamiast kodu z linii 14.
Po tym zabiegu, podczas dodawania obrazka wyświetla, błąd: "Nie wybrano żadnego obrazka bądź jego format jest niedozwolony!" niezależnie czy to będzie normalny obrazek 'plik.jpg' czy plik.jpg.php'
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.