Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [HTML][MySQL][PHP]Zabezpieczenie strony w PHP z bazą MySQL bez formularzy itp.
GrumpyDogue
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 25.02.2015

Ostrzeżenie: (0%)
-----


Witam. Od pewnego czasu nurtuje mnie pewna kwestia. Jak mogę zabezpieczyć swoją stronę? Szukałem wszędzie informacji na ten temat, niestety wszędzie gdzie napisane jest coś o bezpieczeństwie, przykłady dotyczą strony z panelami administracyjnymi, formularzami kontaktowymi itd. Otóż moja strona jest dosyć specyficzna - to zwykła strona informacyjna, która nie zawiera żadnych formularzy itp. Użytkownik praktycznie nigdzie nie podaje wartości żadnej zmiennej. Czytałem sporo poradników na temat bezpieczeństwa i wydaje mi się, że wszystko jest dobrze, jednak bardzo przyda mi się także opinia ekspertów w tej sprawie, gdyż zawsze mogło mi coś umknąć. Byłbym wdzięczny za sprawdzenie czy wszystko jest w porządku w tych linijkach kodu:

  1. <?php
  2. foreach($_GET as $k=>$v)
  3. $_GET[$k] = (preg_match("/[0-9a-z_]+/",$v) ? stripslashes(htmlspecialchars(strip_tags($v))): '');
  4.  
  5. $dzial = $_GET['dzial'];
  6. $strona = $_GET['strona'];
  7.  
  8. $connection = mysql_connect('localhost', 'root', '')
  9. or die('Brak polaczenia z serwerem MySQL.');
  10. $db = mysql_select_db('baza', $connection)
  11. or die('Brak polaczenia z baza danych.');
  12.  
  13. mysql_query("SET NAMES utf8");
  14. ?>


Pliki includuję w ten sposób:
  1. <?php include ("folder/plik.php"); ?>


W ten sposób wczytuję treść do "głównego" diva (na początku kiedy nie ma żadnych zmiennych w pasku adresu, wczytują się newsy):
  1. <?php
  2. if(!empty($dzial))
  3. {
  4. if(is_file($dzial."/".$strona.".html"))
  5. {
  6. include ("include/naglowki.php");
  7. include($dzial."/".$strona.".html");
  8. }
  9. else echo "<p>Nie odnaleziono wybranej strony.</p>";
  10. }
  11. else include ("newsy/news.html");
  12. ?>


W pliku naglowki.php są zmienne, które wyglądają w ten sposób:
  1. <?php
  2. $naglowek1 = "<div style=\"width: 100%; background-image: url(tlo-ramki.jpg);\"><img src=\"tytul.jpg\" alt=\"img\" style=\"width: X%; height: Xpx;\">";
  3. ?>


Nagłówek jest wyświetlany w PLIKU HTML (czy to jest błąd, że plik jest w html i posiada kod php? I tak jest includowany do index.php, więc ma to jakieś znaczenie?) na samym początku w ten sposób:
  1. <?php echo $naglowek1; ?>


Tak wygląda odnośnik w menu*:
  1. <a href="index.php?dzial=gry/gra1&amp;strona=info">Gra 1</a>


Tak wygląda moje zapytanie do bazy MySQL wyciągające newsy:
  1. <?php
  2. $result = mysql_query("SELECT * FROM newsy LIMIT 3");
  3.  
  4. if(mysql_num_rows($result) > 0)
  5. {
  6. while($r = mysql_fetch_assoc($result))
  7. {
  8. echo "<div class='news'>";
  9. echo "<div class='tytul'>";
  10. echo "".$r['data'].": <i style=\"color: gold;\">".$r['tytul']."</i>";
  11. echo "<div class='autor'>Dodał: ".$r['autor']."</div>";
  12. echo "</div>";
  13. echo $r['zawartosc'];
  14. echo "</div>";
  15. }
  16. }
  17. ?>


Zapytanie wyciągające z bazy np. linki do najnowszych filmów z kanału YT:
  1. <?php
  2. $result = mysql_query("SELECT * FROM filmy ORDER BY ID DESC LIMIT 5")
  3. or die('Błąd zapytania');
  4.  
  5. if(mysql_num_rows($result) > 0)
  6. {
  7. while($r = mysql_fetch_assoc($result))
  8. {
  9. echo "<li><a style=\"margin-top: 5px;\" class=\"menu\" target=\"_blank\" href=\"".$r['link']."\">".$r['tytul']."</a></li>";
  10. }
  11. }
  12. ?>


Tak wygląda zawartość kolumny 'zawartosc' w tabeli z newsami w bazie MySQL (czy kod HTML nie jest zagrożeniem kiedy jest pobierany z bazy?):
  1. <img alt="img" src="sciezka/do/obrazka" style="width: x%; height: Xpx;">
  2. <p>Tresc newsa</p>


To jest na końcu pliku index.php
  1. <?php
  2. mysql_close($connection);
  3. ?>


* - odnośnik w menu - zastanawia mnie właśnie czy bezpiecznie jest kiedy w zmiennej znajdują się ukośniki: / (zmienna dział przyjmuje wartość z ukośnikiem: dzial=gry/gra1).

Czy zauważyliście w tym kodzie jakieś luki, które mogłyby umożliwić komuś atak? Będę wdzięczny za przeanalizowanie tych fragmentów kodu. Mam obsesję na tym punkcie, tj. chcę mieć pewność, że strona jest bezpieczna. Pozdrawiam!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
GrumpyDogue
post
Post #2





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 25.02.2015

Ostrzeżenie: (0%)
-----


Spoko, w wolnym czasie rzucę okiem na tę bibliotekę PDO. Jak czegoś nie zrozumiem to będę pytał. (IMG:style_emoticons/default/wink.gif)

Przygotowałem skrypt z tym switchem. Jak strona teraz powinna się zachowywać gdy zmienię wartość zmiennej 'strona' w pasku adresu na jakąś inną niż jest w switchu? To dobrze jeśli w środkowym divie nie wyświetla się nic? Jest tylko błąd że ta ścieżka nigdzie nie prowadzi. Zauważyłem że jeśli jestem w dziale który w switchu jest ustawiony przy default, zawartość tego diva do którego includuję pliki nie zmienia się. Tj. na default ustawiłem dział z newsami i jeśli zmiennej 'strona' przypiszę jakąś inną wartość niż podałem w tym switchu, strona nie zmienia się. Natomiast jeśli w dziale z którąś grą przypiszę inną wartość zmiennej 'strona' niż jest w switchu, pojawia się błąd o tym, że nie znaleziono takiego pliku. To dobrze, czy coś zrobiłem źle?

EDIT:
Chyba już rozgryzłem. Ustaliłem takie nazwy plików, żeby w każdym dziale była strona o takiej samej nazwie (info) i jest ona ustawiona w default. Teraz kiedy zmieniam wartość zmiennej 'strona' w pasku adresu, zawsze przekierowuje na stronę info. Kiedy zaś zmienię wartość zmiennej 'dzial' przekierowuje na dział z newsami, który jest ustawiony w default. Tak to powinno działać?

EDIT 2:
Już całkowicie chyba to zrozumiałem. Mój tok rozumowania jest taki: w case podaję WSZYSTKIE wartości jakie może przyjąć zmienna 'dzial' lub 'strona'. W default podaję wartości zmiennych jakie mają zostać przypisane jeśli wartość zmiennej nie pokryje się z żadnym z caseów. Z czego zauważyłem ma to jednak w moim przypadku jedną wadę - zmienna 'strona' może przyjąć taką samą wartość w kilku działach, jednak podstrony o takiej nazwie może nie być w innym dziale. Już wyjaśniam to na przykładzie:

  1. switch($_GET['dzial'])
  2. {
  3. case
  4. $_GET['dzial']="gry/gra1";
  5. $dzial = $_GET['dzial'];
  6. break;
  7. case
  8. $_GET['dzial']="gry/gra2";
  9. $dzial = $_GET['dzial'];
  10. break;
  11. case
  12. $_GET['dzial']="gry/gra3";
  13. $dzial = $_GET['dzial'];
  14. break;
  15. default:
  16. $dzial = "newsy";
  17. break;
  18. }
  19.  
  20. switch($_GET['strona'])
  21. {
  22. case
  23. $_GET['strona']="postacie/postac1";
  24. $strona = $_GET['strona'];
  25. break;
  26. case
  27. $_GET['strona']="postacie/postac2";
  28. $strona = $_GET['strona'];
  29. break;
  30. case
  31. $_GET['strona']="postacie/postac3";
  32. $strona = $_GET['strona'];
  33. break;
  34. default:
  35. $strona = "news";
  36. break;
  37. }


I teraz tak. 'postac1' istnieje w dziale 'gry/gra1' i 'gry/gra2', za to nie istnieje już w dziale 'gry/gra3'. Teraz wystarczy że podmienię wartość zmiennej 'dzial' na 'gry/gra3', ZOSTAWIAJĄC PRZY TYM wartość zmiennej 'strona' tak jak była, czyli: 'postacie/postac1' i strona się wysypie. Czy mój tok rozumowania jest dobry, czy po prostu coś źle ogarnąłem? (IMG:style_emoticons/default/biggrin.gif) Jeśli wszystko jest dobrze to myślę, że lepiej niż SWITCH sprawdziłyby się IFy:

  1. if ($_GET['dzial'] == 'gry/gra1')
  2. {
  3. if ($_GET['strona'] == 'postacie/postac1')
  4. {
  5. $dzial = $_GET['dzial'];
  6. $strona = $_GET['strona'];
  7. }
  8.  
  9. else if ($_GET['strona'] == 'postacie/postac2')
  10. {
  11. $dzial = $_GET['dzial'];
  12. $strona = $_GET['strona'];
  13. }
  14.  
  15. else if ($_GET['strona'] == 'postacie/postac3')
  16. {
  17. $dzial = $_GET['dzial'];
  18. $strona = $_GET['strona'];
  19. }
  20.  
  21. else
  22. {
  23. $dzial = "gry/gra1";
  24. $strona = "info";
  25. }
  26. }
  27.  
  28. else if ($_GET['dzial'] == 'gry/gra2')
  29. {
  30. if ($_GET['strona'] == 'postacie/postac1')
  31. {
  32. $dzial = $_GET['dzial'];
  33. $strona = $_GET['strona'];
  34. }
  35.  
  36. else if ($_GET['strona'] == 'postacie/postac2')
  37. {
  38. $dzial = $_GET['dzial'];
  39. $strona = $_GET['strona'];
  40. }
  41.  
  42. else if ($_GET['strona'] == 'postacie/postac3')
  43. {
  44. $dzial = $_GET['dzial'];
  45. $strona = $_GET['strona'];
  46. }
  47.  
  48. else
  49. {
  50. $dzial = "gry/gra2";
  51. $strona = "info";
  52. }
  53. }
  54.  
  55. else if ($_GET['dzial'] == 'gry/gra3')
  56. {
  57. if ($_GET['strona'] == 'postacie/postac2')
  58. {
  59. $dzial = $_GET['dzial'];
  60. $strona = $_GET['strona'];
  61. }
  62.  
  63. else if ($_GET['strona'] == 'postacie/postac3')
  64. {
  65. $dzial = $_GET['dzial'];
  66. $strona = $_GET['strona'];
  67. }
  68.  
  69. else
  70. {
  71. $dzial = "gry/gra3";
  72. $strona = "info";
  73. }
  74. }
  75.  
  76. else
  77. {
  78. $dzial = "newsy";
  79. $strona = "news";
  80. }
  81.  


Jak Wam się wydaje? Czy takie rozwiązanie będzie dobre?

Ten post edytował GrumpyDogue 26.02.2015, 02:34:37
Go to the top of the page
+Quote Post

Posty w temacie
- GrumpyDogue   [HTML][MySQL][PHP]Zabezpieczenie strony w PHP z bazą MySQL bez formularzy itp.   25.02.2015, 10:43:26
- - sadistic_son   Cytat(GrumpyDogue @ 25.02.2015, 10:43...   25.02.2015, 10:50:57
|- - GrumpyDogue   Cytat(sadistic_son @ 25.02.2015, 10:50...   25.02.2015, 11:46:33
- - Aqu   [PHP] pobierz, plaintext $dzial."/".$str...   25.02.2015, 12:03:16
|- - GrumpyDogue   Cytat(Aqu @ 25.02.2015, 12:03:16 ) [P...   25.02.2015, 12:21:45
- - Aqu   Czyli masz w kodzie: [PHP] pobierz, plaintext $dzi...   25.02.2015, 12:26:32
|- - GrumpyDogue   Cytat(Aqu @ 25.02.2015, 12:26:32 ) Cz...   25.02.2015, 12:37:58
- - Damonsson   GETa przepuszcza przez preg_match i usuwa co niebe...   25.02.2015, 13:07:40
|- - GrumpyDogue   Cytat(Damonsson @ 25.02.2015, 13:07:4...   25.02.2015, 13:14:43
- - Damonsson   Czekaj czekaj, mała poprawka, nie zostawiasz tam p...   25.02.2015, 13:25:04
|- - redeemer   Cytat(Damonsson @ 25.02.2015, 13:25:0...   25.02.2015, 13:40:10
|- - sadistic_son   Cytat(Damonsson @ 25.02.2015, 13:25:0...   25.02.2015, 13:46:48
- - GrumpyDogue   Dzięki! A dałoby się to jakoś krócej rozwiązać...   25.02.2015, 14:07:13
- - Aqu   Możesz po prostu sprawdzać za pomocą preg_match, c...   25.02.2015, 14:22:41
- - GrumpyDogue   Mógłbyś mi pokazać w jaki to sposób będzie wygląda...   25.02.2015, 14:27:07
- - sadistic_son   Cytat(GrumpyDogue @ 25.02.2015, 14:07...   25.02.2015, 14:49:43
- - GrumpyDogue   Dzięki! Więc tak zrobię z tym Switchem. I to p...   25.02.2015, 15:10:23
- - sadistic_son   Cytat(GrumpyDogue @ 25.02.2015, 15:10...   25.02.2015, 15:16:00
- - Aqu   CytatTo i tak nie zabezpieczy. Wystarczy, że ktoś ...   25.02.2015, 15:27:57
|- - sadistic_son   Cytat(Aqu @ 25.02.2015, 15:27:57 ) Ja...   25.02.2015, 15:33:07
- - Aqu   No dobra, ktoś może dorzucać mu pliki na serwer, w...   25.02.2015, 15:35:53
- - DraGo110   Polecam Bibliotekę PDO. zawiera ona m.i.n bindowan...   25.02.2015, 15:38:27
- - GrumpyDogue   Spoko, w wolnym czasie rzucę okiem na tę bibliotek...   25.02.2015, 19:04:06
- - DraGo110   oba rozwiązania są dobre gdyby nie to że w Case ni...   26.02.2015, 12:02:42
- - GrumpyDogue   Hmm no właśnie ten case nie do końca się spisuje. ...   26.02.2015, 12:31:19
- - sadistic_son   Nie wiem czy dobrze zrozumiałem jaki masz problem ...   4.03.2015, 11:02:13
- - Pyton_000   Jak widze taką sraj taśmę to aż mi się .... Proszę...   4.03.2015, 11:20:06
- - sadistic_son   Nie do końca, bo jeśli postac3 jest w gra1 i gra2 ...   4.03.2015, 11:26:28


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 20:22