Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP]Zabezpieczenie strony w PHP z bazą MySQL bez formularzy itp.
Forum PHP.pl > Forum > Przedszkole
GrumpyDogue
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!
sadistic_son
Cytat(GrumpyDogue @ 25.02.2015, 10:43:26 ) *
Użytkownik praktycznie nigdzie nie podaje wartości żadnej zmiennej
Błąd! Ma możliwość podania wartości zmiennej poprzez tablicę $_GET['']. Ale z tego co widzę, przynajmniej w tym kodzie co podałeś, to nie wiele można tym GET'em zdziałać. Wg. mnie nie masz co się obawiać, jest bezpiecznie, przynajmniej od strony PHP/MySQL. Co innego sprawa bezpieczeństwa serwera, ale jeśli gdzieś wynajmujesz serwer to nie masz na to żadnego wpływu.

  1. $connection = mysql_connect('localhost', 'root', '')
Zakładam, że hasło ogólnie masz ustawione, tylko tutaj go nie podałeś. Bo jeśli dostęp do MySQL masz kolego bez hasła to prosisz się o pomstę do nieba.
GrumpyDogue
Cytat(sadistic_son @ 25.02.2015, 10:50:57 ) *
Błąd! Ma możliwość podania wartości zmiennej poprzez tablicę $_GET['']. Ale z tego co widzę, przynajmniej w tym kodzie co podałeś, to nie wiele można tym GET'em zdziałać. Wg. mnie nie masz co się obawiać, jest bezpiecznie, przynajmniej od strony PHP/MySQL. Co innego sprawa bezpieczeństwa serwera, ale jeśli gdzieś wynajmujesz serwer to nie masz na to żadnego wpływu.

  1. $connection = mysql_connect('localhost', 'root', '')
Zakładam, że hasło ogólnie masz ustawione, tylko tutaj go nie podałeś. Bo jeśli dostęp do MySQL masz kolego bez hasła to prosisz się o pomstę do nieba.


Fakt, mój błąd - użytkownik podaje wartość zmiennej. Hasło do bazy oczywiście mam, o to się nie martw. biggrin.gif Dziękuję bardzo za fachową opinię! Bardzo mnie uspokoiłeś tą wiadomością. biggrin.gif
Aqu
  1. $dzial."/".$strona.

Pokaż co im przypisujesz. Bo jeżeli po prostu:
$dział = $_POST['dzial'] to możliwe, że da się zrobić LFI, wpisując coś w stylu: ../../config.php%00
GrumpyDogue
Cytat(Aqu @ 25.02.2015, 12:03:16 ) *
  1. $dzial."/".$strona.

Pokaż co im przypisujesz. Bo jeżeli po prostu:
$dział = $_POST['dzial'] to możliwe, że da się zrobić LFI, wpisując coś w stylu: ../../config.php%00

Hm nie wiem czy dobrze rozumiem. Do zmiennej dział przypisuję wartość odnośnikiem w menu:
  1. <a href="index.php?dzial=gry/gra1&amp;strona=info">Gra 1</a>
Aqu
Czyli masz w kodzie:
  1. $dział = $_POST['dzial']
?

Poczytaj http://hakipedia.com/index.php/Local_File_Inclusion
GrumpyDogue
Cytat(Aqu @ 25.02.2015, 12:26:32 ) *
Czyli masz w kodzie:
  1. $dział = $_POST['dzial']
?

Poczytaj http://hakipedia.com/index.php/Local_File_Inclusion

Nie mam tego w kodzie. Wszystkie przypadki użycia PHP na całej stronie wrzuciłem w pierwszym poście. wink.gif
Damonsson
GETa przepuszcza przez preg_match i usuwa co niebezpieczne. POSTa tutaj nie używa.
Wygląda bezpiecznie, na tym kawałku kodu.

Cytat(GrumpyDogue @ 25.02.2015, 10:43:26 ) *
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?)

A to już zależy od tego, kto dodaje te treści do bazy. Jeśli nie Ty i nie dajesz sobie za niego uciąć ręki, że jest bezpieczny, to TAK, jest zagrożeniem.
GrumpyDogue
Cytat(Damonsson @ 25.02.2015, 13:07:40 ) *
GETa przepuszcza przez preg_match i usuwa co niebezpieczne. POSTa tutaj nie używa.
Wygląda bezpiecznie, na tym kawałku kodu.


A to już zależy od tego, kto dodaje te treści do bazy. Jeśli nie Ty i nie dajesz sobie za niego uciąć ręki, że jest bezpieczny, to TAK, jest zagrożeniem.

Kod dodaję samodzielnie w panelu phpmyadmin. A za siebie daję sobie uciąć nawet obydwie ręce. biggrin.gif
Damonsson
Czekaj czekaj, mała poprawka, nie zostawiasz tam przecież tylko bezpiecznych znaków w linijce:
  1. $_GET[$k] = (preg_match("/[0-9a-z_]+/",$v) ? stripslashes(htmlspecialchars(strip_tags($v))): '');

Bo:
$_GET['dzial']= '.passwd %00';
po tej linijce nadal zwróci:
$_GET['dzial']= '.passwd %00';

Prawda?

Jeżeli tak, to masz podatność na LFI.
redeemer
Cytat(Damonsson @ 25.02.2015, 13:25:04 ) *
Czekaj czekaj, mała poprawka, nie zostawiasz tam przecież tylko bezpiecznych znaków w linijce:
  1. $_GET[$k] = (preg_match("/[0-9a-z_]+/",$v) ? stripslashes(htmlspecialchars(strip_tags($v))): '');

Bo:
$_GET['dzial']= '.passwd %00';
po tej linijce nadal zwróci:
$_GET['dzial']= '.passwd %00';

Prawda?

Jeżeli tak, to masz podatność na LFI.


http://php.net/releases/5_3_4.php
Cytat
Paths with NULL in them (foo\0bar.txt) are now considered as invalid (CVE-2006-7243).
sadistic_son
Cytat(Damonsson @ 25.02.2015, 13:25:04 ) *
Czekaj czekaj, mała poprawka, nie zostawiasz tam przecież tylko bezpiecznych znaków w linijce:
  1. $_GET[$k] = (preg_match("/[0-9a-z_]+/",$v) ? stripslashes(htmlspecialchars(strip_tags($v))): '');

Bo:
$_GET['dzial']= '.passwd %00';
po tej linijce nadal zwróci:
$_GET['dzial']= '.passwd %00';

Prawda?

Jeżeli tak, to masz podatność na LFI.

A no racja. Ale wystarczy wrzucić do np. SWITCH() wybór działu, bo zakładam, że te są predefiniowane, i masz LFI z głowy.
Np podmień linijki 7 i 8 z pierwszego okna kodu na:
  1. switch($_GET['dzial']){
  2. case:
  3. $_GET['dzial']="strzelanki";
  4. $dzial = $_GET['dzial'];
  5. break;
  6. case:
  7. $_GET['dzial']="strategie";
  8. $dzial = $_GET['dzial'];
  9. break;
  10. $_GET['dzial']="aRPG";
  11. $dzial = $_GET['dzial'];
  12. break;
  13. default:
  14. $dzial = "strzelanki";
  15. break;
  16. }
  17.  
  18. switch($_GET['strona']){
  19. case:
  20. $_GET['strona']="o strzelankach";
  21. $strona = $_GET['strona'];
  22. break;
  23. case:
  24. $_GET['strona']="o strategiach";
  25. $strona = $_GET['strona'];
  26. break;
  27. $_GET['strona']="o aRPG";
  28. $strona = $_GET['strona'];
  29. break;
  30. default:
  31. $strona = "o strzelankach";
  32. break;
  33. }


EDIT: edytowałem post i poprawiłem drobny błąd.
GrumpyDogue
Dzięki! A dałoby się to jakoś krócej rozwiązać? Bo sprawa wygląda tak, że podstron mam dziesiątki. Jeśli trzeba to oczywiście zrobię tak jak w tym skrypcie powyżej.

Aa i przypomniał mi się jeden przypadek. Raz na FTP znalazły się jakieś dziwne pliki - ktoś najwidoczniej je w jakiś sposób wrzucił na serwer. Próbowałem je edytować i antywirus natychmiastowo je usunął z plików tymczasowych, po czym oczywiście skasowałem je z serwera. Czy jest w moim kodzie jakaś luka, która pozwoliłaby na wrzucenie plików czy raczej jest to niemożliwe?
Aqu
Możesz po prostu sprawdzać za pomocą preg_match, czy w stringu są tylko litery.
GrumpyDogue
Mógłbyś mi pokazać w jaki to sposób będzie wyglądać? Niezbyt się orientuję w PHP, więc ciężko mi zrozumieć niektóre rzeczy o których piszecie. wink.gif

EDIT: no właśnie do zmiennej 'dzial' przypisuję wartość z ukośnikiem. W niektórych przypadkach do zmiennej 'strona' także. To poważny błąd?
sadistic_son
Cytat(GrumpyDogue @ 25.02.2015, 14:07:13 ) *
A dałoby się to jakoś krócej rozwiązać? Bo sprawa wygląda tak, że podstron mam dziesiątki.

Można np. automatycznie zassać do tablicy wszystkie obecne pliki w tym katalogu ale wtedy i tak nie zabezpieczasz się przed tym co opisałeś niżej:
Cytat(GrumpyDogue @ 25.02.2015, 14:07:13 ) *
Raz na FTP znalazły się jakieś dziwne pliki - ktoś najwidoczniej je w jakiś sposób wrzucił na serwer.
Alternatyną, ktrótszą w sensie ilości znaków opcją byłoby zamiast SWITCH() wrzucić wszystkie możliwości do tablicy i potem sprawdzać czy wartość wywoływana w $_GET jest w tablicy. Ale efekt będzie ten sam co przy użyciu SWITCH() a i dochodzi Ci wtedy co najmniej jedna pętla. Jeśli chcesz to pokażę Ci jak to zrobić ale dużo pracy tym nie zaoszczędzisz.


Cytat(Aqu @ 25.02.2015, 14:22:41 ) *
Możesz po prostu sprawdzać za pomocą preg_match, czy w stringu są tylko litery.
To i tak nie zabezpieczy. Wystarczy, że ktoś wrzuci mu do katalogu plik bez rozszerzenia (bo kropkę preg_match wyrzuci) a jego skrypt mu doda do pliku .php. Tak więc nie, nie wystarczy.


Cytat(GrumpyDogue @ 25.02.2015, 14:27:07 ) *
EDIT: no właśnie do zmiennej 'dzial' przypisuję wartość z ukośnikiem. W niektórych przypadkach do zmiennej 'strona' także. To poważny błąd?
Nie, to nie bląd ale może powodować komplikacje. Np. nie bardzo rozumiem po co to robisz. I tak nazwa pliku/katalogu nie może zawierać ani slash'a ani backslash'a. Więc po ch...?

Ogólnie to polecam metodę ze SWTICH() opisaną przeze mnie wcześniej. Bo wystarczy, że ktoś wpisze taki adres:
Kod
http://twoja-strona.pl/index.php?dzial=www.stronaHakeraZeSzkodliwymKodemPHP.pl/plik

I już twój skrypt po wcześniejszym INCLUDE wykonuje kod bandziora.
GrumpyDogue
Dzięki! Więc tak zrobię z tym Switchem. I to powinno zabezpieczyć mnie przed tym co już raz się stało? W sensie, że to uniemożliwi komuś wrzucenie szkodliwych plików PHP?

EDIT: a zmiennym przypisuję wartość z ukośnikiem, bo taką mam strukturę katalogów i jeśli to jest niekonieczne to wolałbym tego nie zmieniać już - w wielu miejscach w internecie pojawiały się już linki do niektórych podstron i gdybym zmienił teraz wszystko to linki przestałyby być aktualne.
sadistic_son
Cytat(GrumpyDogue @ 25.02.2015, 15:10:23 ) *
Dzięki! Więc tak zrobię z tym Switchem. I to powinno zabezpieczyć mnie przed tym co już raz się stało? W sensie, że to uniemożliwi komuś wrzucenie szkodliwych plików PHP?

Zdecydowanie tak! No chyba, że ktoś ma możliwość podmiany Twoich plików na FTP, ale jeśli tak jest to raz, że się przed tym nie zabezpieczysz przy użyciu PHP, a dwa, że wtedy radziłbym pomyśleć o zmianie firmy hostingowej wink.gif

Cytat(GrumpyDogue @ 25.02.2015, 15:10:23 ) *
EDIT: a zmiennym przypisuję wartość z ukośnikiem, bo taką mam strukturę katalogów i jeśli to jest niekonieczne to wolałbym tego nie zmieniać już - w wielu miejscach w internecie pojawiały się już linki do niektórych podstron i gdybym zmienił teraz wszystko to linki przestałyby być aktualne.
Jak już wcześniej pisałem to nie jest błąd, lecz raczej bym tego nie zaliczył do dobrych nawyków. Z tego co pobieżnie przejrzałem Twój kod to Tobie to problemów nie sprawi, więc feel free aby tak to zostawić.
Aqu
Cytat
To i tak nie zabezpieczy. Wystarczy, że ktoś wrzuci mu do katalogu plik bez rozszerzenia (bo kropkę preg_match wyrzuci) a jego skrypt mu doda do pliku .php. Tak więc nie, nie wystarczy.

Jak ktoś ma mu wrzucić plik do katalogu?
sadistic_son
Cytat(Aqu @ 25.02.2015, 15:27:57 ) *
Jak ktoś ma mu wrzucić plik do katalogu?
No przecież napisał wcześniej, że pojawiły mu się kiedyś jakieś pliki na FTP. Nie wiem jak, ale nie jest to niemożliwe.
Aqu
No dobra, ktoś może dorzucać mu pliki na serwer, więc może wrzucić plik .php i go bezpośrednio odpalić, bez zabawy LFI.
DraGo110
Polecam Bibliotekę PDO. zawiera ona m.i.n bindowanie danych przez co unikniesz wstrzykiwania kodu itd.

Jak coś pytaj chętnie pomogę smile.gif
GrumpyDogue
Spoko, w wolnym czasie rzucę okiem na tę bibliotekę PDO. Jak czegoś nie zrozumiem to będę pytał. 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? 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?
DraGo110
oba rozwiązania są dobre gdyby nie to że w Case nie podałeś żadnego warunku więc do czego ma się odwołac ? automatycznie wskakuje do "Default" smile.gif
Ale jeśli chodzi o większa ilośc danych lepiej i szybciej będzie ci użyć switch'a niż robić wszystko na ifach.

http://php.net/manual/en/control-structures.switch.php

wypadło by też podać jakiś warunek który case ci przetworzy np w tym przypadku jezeli w zmiennej $i znajdzie się string "apple" pojawi nam się tekst "i is apple" jeśli przekażesz sobie w zmiennej "cake" to wyskoczyt ci "i is cake" itp, itd smile.gif

  1. switch ($i) {
  2. case "apple":
  3. echo "i is apple";
  4. break;
  5. case "bar":
  6. echo "i is bar";
  7. break;
  8. case "cake":
  9. echo "i is cake";
  10. break;
  11. }
GrumpyDogue
Hmm no właśnie ten case nie do końca się spisuje. Nie wiem czy coś źle zrobiłem, ale nawet po zastosowaniu się do Twojej składni występuje ten problem z postaciami. Tj. postac1 będzie w dziale gry/gra1 i gry/gra2, ale nie będzie jej już w dziale gry/gra3. I kiedy będę na stronie 'dzial=gry/gra1&strona=postacie/postac1' lub 'dzial=gry/gra2&strona=postacie/postac1' i zmienię pasek adresu na 'dzial=gry/gra3&strona=postacie/postac1' (w tym dziale nie ma takiej strony), nie przypisuje mi wartości jakie ustawię w default. IFy mam już gotowe, w nocy sobie przygotowałem i z tym rozwiązaniem idealnie się to spisuje, jeśli oczywiście tak ma być, że jeśli dokonam takiej zmiany z tymi postaciami, przekieruje mnie na stronę z informacjami o grze. Poza tym w IFach chyba jest to nieco lepiej sprecyzowane, bo mogę dla każdego działu ustalić inną stronę 'domyślną', czyli taką do jakiej przekieruje kiedy zmieni się wartość zmiennej 'strona' na jakąś, która w IFie dla danego działu nie występuje. smile.gif
sadistic_son
Nie wiem czy dobrze zrozumiałem jaki masz problem z tymi istniejącymi/nieistniejącymi stronami czy podstronami bo jestem cholernie niewyspany ale:
1) Masz błędy w składni SWITCH(), jak już pisał kolega DraGo110. Chyba nie do końca rozumiesz jak to działa. Tzn. jak "rozumuje" switch() chyba rozumiesz bo tak wynika z Twojego drugiego EDITa z posta powyżej, ale nie rozumiesz jak switch' a poprawnie skonstruować.
2) Jeśli dobrze rozumiem Twój obecny problem to rozwiążesz go tak:
  1. switch($_GET['dzial']){
  2. case "gry/gra1":
  3. switch($_GET['strona']){
  4. case "postacie/postac1":
  5. $dzial = $_GET['dzial'];
  6. $strona = $_GET['strona'];
  7. break;
  8. case "postacie/postacie...n":
  9. $dzial = $_GET['dzial'];
  10. $strona = $_GET['strona'];
  11. break;
  12. default:
  13. $dzial = "gry/gra1";
  14. $strona = "info";
  15. break;
  16. }
  17. break;
  18. case "gry/gra2":
  19. switch($_GET['strona']){
  20. case "postacie/postac1":
  21. $dzial = $_GET['dzial'];
  22. $strona = $_GET['strona'];
  23. break;
  24. case "postacie/postac...n":
  25. $dzial = $_GET['dzial'];
  26. $strona = $_GET['strona'];
  27. break;
  28. default:
  29. $dzial = "gry/gra2";
  30. $strona = "info";
  31. break;
  32. }
  33. break;
  34. case "gry/gra...n":
  35. switch($_GET['strona']){
  36. case "postacie/postac1":
  37. $dzial = $_GET['dzial'];
  38. $strona = $_GET['strona'];
  39. break;
  40. case "postacie/postac...n":
  41. $dzial = $_GET['dzial'];
  42. $strona = $_GET['strona'];
  43. break;
  44. default:
  45. $dzial = "gry/gra...n";
  46. $strona = "info";
  47. break;
  48. }
  49. break;
  50. default:
  51. $dzial = "newsy";
  52. $strona = "news";
  53. break;
  54. }
ad 1) Zwróć uwagę na dwukropek w case czyli case "wartość zmiennej" : <--- dwukropek a nie średnik!
Średnik jest po break.
Pyton_000
Jak widze taką sraj taśmę to aż mi się ....
Proszę uproszczona wersję.
  1. $dzialy = array('gra1', 'gra2', 'gra3',);
  2. $strony = array('postac1','postac2','postac3',);
  3.  
  4. $dzial = end(explode('/',$_GET['dzial']));
  5. $strona = end(explode('/',$_GET['strona']));
  6.  
  7. $dzial = "newsy";
  8. $strona = "news";
  9.  
  10. if(in_array($dzial, $dzialy))
  11. {
  12. $dzial = "gry/{$dzial}";
  13. $strona = "info";
  14.  
  15. if(in_array($strona, $strony))
  16. {
  17. $dzial = $_GET['dzial'];
  18. $strona = $_GET['strona'];
  19. }
  20. }


To co napisałem da się jeszcze lepiej napisać ale już mi się nie chce. Ale można parsować działy i strony i dopasować. Wtedy pozbywamy się tablic z początku
sadistic_son
Nie do końca, bo jeśli postac3 jest w gra1 i gra2 ale nie ma w gra3 to już dupa.
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.