Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem ze includowaniem i wykorzystaniem CASE
Forum PHP.pl > Forum > PHP
Kreton
mam tu stronkę http://dobrepomysly.za.pl

I działy, dajmy na to dział 2.

No i tematy są inludowane w sposób :
  1. <?php
  2. if (!isset($_GET['dzial'])){
  3. echo
  4. <center><b>Szkoła podstawowa</b></center>
  5. <ul><li><a href="index.php?go=szkola&dzial=1"><b>Swobodna twórczość dziecięca</b></a></li>
  6. ";
  7. } else {
  8. switch ($_GET['dzial'])
  9. {
  10. case 1:
  11. include("1.html");
  12. break;
  13. case 2:
  14. include("2.html");
  15. break;
  16. <!-- i tak dalej az do 40-->
  17.  }
  18. }
  19. ?>


Jak to zrobic zeby nierobić tych bardzo żmudnych case x: include("blabla.html")
niebardzo wiem jak to zrobic przy użyciu np. pętli while czy cos takiego. Pomóżcie
zbig13
Jeśli numery działów odpowiadają nazwom plików, to możesz zrobić po prostu tak:
  1. <?php
  2.  
  3. $dzial = $_GET['dzial'];
  4. include ('katalog/' . $dzial . '.html');
  5.  
  6. ?>
Spirit86
  1. <?php
  2.  
  3. $dzial = (int) $_GET['dzial'];
  4. if(file_exists('katalog/' . $dzial . '.html')) include ('katalog/' . $dzial . '.html');
  5.  
  6. ?>

może lepiej tak winksmiley.jpg
M4chu
Jeśli to nie tylko liczby, to możesz na przykład zrobic tablicę elementów odpowiadająch możliwością, i sprawdzać za pomocją in_array(). Jednak wygląda, że to raczej będą numerki, więc rozwiązanie zbig13'a będzie lepsze, jednak z jednym dodatkiem - filtrowaniem tego $_GET['dzial'].
Spirit86
Cytat(M4chu @ 2005-09-24 19:17:20)
Jeśli to nie tylko liczby, to możesz na przykład zrobic tablicę elementów odpowiadająch możliwością, i sprawdzać za pomocją in_array(). Jednak wygląda, że to raczej będą numerki, więc rozwiązanie zbig13'a będzie lepsze, jednak z jednym dodatkiem - filtrowaniem tego $_GET['dzial'].

rozwiązanie zbig13 wcale nie jest lepsze.
Zastanów się lepiej :]
zbig13
ja podsunąłem tylko propozycję jak można to zrobić krócej (zamiast switch) a z zabezpieczeniem tego kodu autor tematu powinien sobie poradzić biggrin.gif

@Spirit86 - do tego twojego kodu można zamiast (int) przed zmienną sprawdzić w warunku czy zmienna $dzial jest liczbą (funkcja is_numeric" title="Zobacz w manualu php" target="_manual). Jest to o tyle lepsze, że można kontrolować komunikat wyświetlany, gdy zmienna nie będzie miała wartości liczbowej.
Kreton
razej zmienna zawsze będzie miała wartość liczbową, chodzi o te pliki html.
Jest tego dużo i dużo latwiej mi się połąpać. A nieznam sie superowo na php

Cytat
ja podsunąłem tylko propozycję jak można to zrobić krócej (zamiast switch) a z zabezpieczeniem tego kodu autor tematu powinien sobie poradzić biggrin.gif

Niewiem co mam przez to rozumiec questionmark.gif W jaki sposób ten kod zabezpieczyc questionmark.gif
zbig13
Kod niezabezpieczony wygląda tak:

  1. <?php
  2.  
  3. include ($_GET['dzial'] . '.html');
  4.  
  5. ?>


Potencjalny włamywacz może napisać cos takiego:
http://twoja.strona.pl?dzial=http://strona.hakera.pl/1

i otworzył by się plik, który haknie ci stronę.

Aby zabezpieczyć stronę, trzeba zrobić cos takiego:

  1. <?php
  2.  
  3. if (is_numeric ( $_GET['dzial'] )) {
  4.  
  5. $dzial = (int) $_GET['dzial'];
  6. if (file_exists('./katalog/' . $dzial . 'html') { include ('./katalog/' . $dzial . '.html'); }
  7.  
  8. } else {
  9. echo 'Nieprawidłowe dane';
  10. }
  11.  
  12. ?>

czyli połączenie mojego kodu i kodu Spirit86 biggrin.gif

Edit:

@mike_mech Racja, to z pośpiechu winksmiley.jpg Już poprawiam
Ociu
ja bym tak dał die" title="Zobacz w manualu php" target="_manual zamiast echo
Kreton
Mam gorącą prośbe, mogłbyś mi bardziej dogłębnie wytłumaczyc, jak mogłby hacknnąć tą stronkę questionmark.gif W jaki sposób ten kod napisany przez ciebie chroni przed włamem.

Nie chcę robić poźniej takiego błędu biggrin.gif
z góry THX biggrin.gif
mike
Cytat(Kreton @ 2005-09-25 12:24:39)
Mam gorącą prośbe, mogłbyś mi bardziej dogłębnie wytłumaczyc, jak mogłby hacknnąć tą stronkę questionmark.gif W jaki sposób ten kod napisany przez ciebie chroni przed włamem.

Chodzi o to że bez kontroli dołanczasz jakiś plik, to wcale nie musi byc plik u Ciebie na serwerze tylko u kogoś. Kotś może Ci tak dołączyć plik, w którym kasuje wszystkie foldery w bierzącej lokalizacji a to już problem, nie :?:

Sprawdzenie polego na tym czy zmienna przychodząca z $_POST'a jest liczbą i czy u Ciebie na serwerze istnieje plik, który masz zamiar dołączyć (masz pewność że dołanczasz seoje pliki).
Mam tylko dwa ale:
1. Do sprawdzania czy dana jest liczbe użyłbym fukncji z rozszerzenia ctype.
2. @zbig13 ma błąd w kodzie: Sprawdza istnienie pliku na poziomie (folderów) gdzie jest index.php a dołancza plik z folderu niżej. Oczywiste jest że nigy takiego pliku nie będzie. Trzeba sprawdzać czy plik istnieje w folderze niżej.
Spirit86
Cytat(Ociu @ 2005-09-25 09:26:47)

a cóż to za różnica, jeżeli i tak udaremniliśmy próbę Code Injection. Teraz to i tak nie ma znaczenia, więc można wykonywac stronę dalej.
Kreton
  1. <meta http-equiv="Content-type" content="text/html; charset=iso-8859-2" />
  2. <?php
  3. if (!isset($_GET['dzial'])){
  4. echo
  5.  
  6. <center><b>Szkoła podstawowa</b></center>
  7. <ul>
  8. <li><a href="index.php?go=efekty&dzial=1"><b>Egzamin w klasach trzecich</b></a></li>
  9. <li><a href="index.php?go=efekty&dzial=2"><b>Szkolny system diagnozowania.</b></a></li>
  10. <li><a href="index.php?go=efekty&dzial=7"><b>Świetlicowy Sejmik (spotkania społeczności świetlicowej)</b></a></li>
  11. <li><a href="index.php?go=efekty&dzial=10"><b>Kolorowy kraj „Ćwierćlandia” – impreza w ramach obchodów Dnia Matki i Dnia Dziecka w naszej szkole</b></a></li>
  12. </ul>
  13. <center><b>Gimnazjum</b></center>
  14. <ul>
  15. <li><a href="index.php?go=efekty&dzial=3"><b>„Wartość dodana” zamiast tabel lekkoatletycznych</b></a></li>
  16. <li><a href="index.php?go=efekty&dzial=5"><b>Zastosowanie minimum ze wszystkich przedmiotów w nauczaniu w gimnazjum</b></a></li>
  17. <li><a href="index.php?go=efekty&dzial=8"><b>Klasa partnerska</b></a></li>
  18. <li><a href="index.php?go=efekty&dzial=9"><b>„Miasto uczuć” – jakie uczucia wzbudza w nas nasza szkoła?</b></a></li>
  19. <li><a href="index.php?go=efekty&dzial=11"><b>Promowanie osiągnięć uczniów szkoły wśród Rodziców.</b></a></li>
  20. </ul>
  21. <center><b>Szkoła ponadgimnazjalna</b></center>
  22. <ul>
  23. <li><a href="index.php?go=efekty&dzial=4"><b>Zwiększanie efektywności uczenia się.</b></a></li>
  24. <li><a href="index.php?go=efekty&dzial=6"><b>Porównywanie wyników nauczania w poszczególnych klasach.</b></a></li>
  25. </ul>
  26. ";
  27. } else {
  28. if (is_numeric ( $_GET['dzial'] )) {
  29.  
  30. $dzial = (int) $_GET['dzial'];
  31. if (file_exists('./katalog/' . $dzial . 'html') { include ('./katalog/' . $dzial . '.html'); }
  32.  
  33. } else {
  34. echo 'Nieprawidłowe dane';
  35. }
  36.  
  37. ?>


i wyrzuca błąd
Kod
Parse error: syntax error, unexpected '{' in C:\Program Files\WebServ\httpd\Działy\I.Efekty\działy.php on line 31


A niemoge się tam doszukac jakiegoś błędnego nawiasu, co jest nie tak questionmark.gif HELP
nospor
Na samyum koncu brakuje }. Czy to tak ciezko policzyc lkiczbe otwrtych, liczbe zmaknietych i sprobowac samemu znalexc?
Kreton
dla ciebie wnikliwego programisty to moze i proste, ale dla mnie.

Moze jak jakbym ci zaczoł nawalać taktyki w Warcrafcie to dla ciebie niebyło by tak oczywiste jak dla mnie.

I tak nic to niedaje ...
kszychu
Cytat(Kreton @ 2005-09-26 16:33:03)
dla ciebie wnikliwego programisty to moze i proste, ale dla mnie.

Moze jak jakbym ci zaczoł nawalać taktyki w Warcrafcie to dla ciebie niebyło by tak oczywiste jak dla mnie.

I tak nic to niedaje ...

Kolego, troszkę szacunku dla kogoś, kto próbuje Ci pomóc.
I zamiast tekstów "i tak nic to nie daje" lepiej powiedz, co jest jeszcze nie tak jak powinno być, czy wywala jakiś błąd?
Spirit86
  1. <meta http-equiv="Content-type" content="text/html; charset=iso-8859-2" />
  2. <?
  3. if (!isset($_GET['dzial']))
  4. {
  5.  
  6. <center><b>Szkoła podstawowa</b></center>
  7. <ul>
  8. <li><a href="index.php?go=efekty&dzial=1"><b>Egzamin w klasach trzecich</b></a></li>
  9. <li><a href="index.php?go=efekty&dzial=2"><b>Szkolny system diagnozowania.</b></a></li>
  10. <li><a href="index.php?go=efekty&dzial=7"><b>Świetlicowy Sejmik (spotkania społeczności świetlicowej)</b></a></li>
  11. <li><a href="index.php?go=efekty&dzial=10"><b>Kolorowy kraj „Ćwierćlandia” – impreza w ramach obchodów Dnia Matki i Dnia Dziecka w naszej szkole</b></a></li>
  12. </ul>
  13. <center><b>Gimnazjum</b></center>
  14. <ul>
  15. <li><a href="index.php?go=efekty&dzial=3"><b>„Wartość dodana” zamiast tabel lekkoatletycznych</b></a></li>
  16. <li><a href="index.php?go=efekty&dzial=5"><b>Zastosowanie minimum ze wszystkich przedmiotów w nauczaniu w gimnazjum</b></a></li>
  17. <li><a href="index.php?go=efekty&dzial=8"><b>Klasa partnerska</b></a></li>
  18. <li><a href="index.php?go=efekty&dzial=9"><b>„Miasto uczuć” – jakie uczucia wzbudza w nas nasza szkoła?</b></a></li>
  19. <li><a href="index.php?go=efekty&dzial=11"><b>Promowanie osiągnięć uczniów szkoły wśród Rodziców.</b></a></li>
  20. </ul>
  21. <center><b>Szkoła ponadgimnazjalna</b></center>
  22. <ul>
  23. <li><a href="index.php?go=efekty&dzial=4"><b>Zwiększanie efektywności uczenia się.</b></a></li>
  24. <li><a href="index.php?go=efekty&dzial=6"><b>Porównywanie wyników nauczania w poszczególnych klasach.</b></a></li>
  25. </ul>
  26. ";
  27. }
  28. else
  29. {
  30. if(is_numeric ( $_GET['dzial'] ))
  31. {
  32. $dzial = (int) $_GET['dzial'];
  33. if(file_exists('./katalog/' . $dzial . 'html'))
  34. {
  35. include ('./katalog/' . $dzial . '.html');
  36. }
  37. else
  38. {
  39. echo 'Nieprawidłowe dane';
  40. }
  41. }
  42. }
  43. ?>
Kreton
Mam bardzo duży szacunek do was, ale wy niemacie szacunku do mnie.
Bo niejestem dobrym programistą w php.

Ok działa.
Bardzo wam dziękuję za pomoc.

Aha, i mam pytanie, jeżeli mam tn działy.php i w tym samym katalogu te pliki 1.html itd.

To jak zamienić tą komendę include questionmark.gif bo próbuję coś tu zmieniać, i zawsze wyskakuje " nieprawidłowe dane " :/
kszychu
Usuń /katalog/ z file_exists() i .....
ZACZNIJ MYŚLEĆ!!!
Berni
wrzuc sobie do tablicy nazwy dostepnych blokow z odpowiadajaca im nazwa plikow, potem wyciganij za pomoca foreach i porownaj z getem jesli blok bedzie dostepny to incuduj plik .... mniejwiecej tak:

  1. <?php
  2. $a_block = array('blok_1'=>'blok');
  3.  
  4. foreach($a_block as $block_k => $block_v){
  5.  
  6. if($_GET['block']==$block_k){
  7.  
  8.  include_once('".$block_v.".php');
  9.  
  10. }
  11.  
  12. }
  13. ?>
Spirit86
  1. <?php
  2. $a_block = array('blok_1'=>'blok');
  3. if(in_array($_GET['block'], $a_block ) include_once($ablock[$_GET['block']].'.php');    
  4. ?>


nie łatwiej tak?
Kreton
Zmieniłem na tak jak powiedzieliście, i efekt taki sam, czyli wypisuje nieprawidłowe dane, a te pliki znajduja sie w tym samym katalogu co ten skrypt.

A dodanie na koncu skrptu, Działa
  1. <?php
  2.  include ("1.html")
  3. ?>

  1. <?php
  2.  
  3. {
  4. if(is_numeric ( $_GET['dzial'] ))
  5. {
  6. $dzial = (int) $_GET['dzial'];
  7. if(file_exists( $dzial . 'html'))
  8. {
  9. include ( $dzial . '.html');
  10. }
  11. else
  12. {
  13. echo 'Nieprawidłowe dane';
  14. }
  15. }
  16. }
  17.  
  18. ?>


a tu niechce, ja juz się gubię, i niemogę sobie poradzic, a skrypty ( te z ostatnich postów) to już woogule nie kumam. Sry
h.4
Cytat
Chodzi o to że bez kontroli dołanczasz jakiś plik, to wcale nie musi byc plik u Ciebie na serwerze tylko u kogoś. Kotś może Ci tak dołączyć plik, w którym kasuje wszystkie foldery w bierzącej lokalizacji a to już problem, nie


nawet jesli wywola plik z innego serwera to i tak to mu nic nie da.
Pobierze sie tylko juz wygenerowana strona, poniewaz kod wykona sie po stronie serwera hakera. Jesli bylby kod kasujacy wszystkie foldery w danej lokalizacji to po stronie serwera tego 1 musialby byc przepuszczony przez eval();

tak mi sie przynajmniej wydaje smile.gif
zbig13
@Kreton A co się dokładnie dzieje? Są jakieś komunikaty o błędach czy coś w tym rodzaju. Napisz trochę więcej, bo na pierwszy rzut oka nie widać żadnych błędów w kodzie.
jeszcze tylko powiedz po co ta klamra przed if(is_numeric)
  1. <?php
  2.  
  3.  
  4. { // <- Po co to questionmark.gif
  5. if(is_numeric ( $_GET['dzial'] ))
  6. {
  7. $dzial = (int) $_GET['dzial'];
  8.  
  9. ?>
Kreton
musi byc ten nawias bo przed nim jest
Kod
} else {


chodzi o to ze ta konstrukcja include musi byc zła, bo nieincluduje pliku tylko pokazuje tylko ten komunikat czyli
Kod
Nieprawidłowe dane


zaznaczam ze pliki czyli 1.html 2.html itd. sa w tym samym katalogu co ten skrypt.
czyli konkretniej nie działa
  1. <?php
  2. if(file_exists( $dzial . 'html'))
  3. ?>

lub
  1. <?php
  2. include ( $dzial . '.html');
  3. ?>


i tu niemoge rozmyslij jak maja wygladar te 2 wersy
NoiseMc
Tutaj funkcją file_exists () sprawdzasz czy plik istnieje.
  1. <?php
  2.  
  3. if ( file_exists( $dzial . 'html' ) )
  4.  
  5. ?>


Jeżeli Twoja zmienna $dzial będzie miała wartość 1 to w połączeniu z ciągiem znaków 'html' dostaniesz ciąg znaków '1html' a chodzi chyba raczej o '1.html' tak więc musisz postawić kropkę przed ciągiem 'html' w Twoim kodzie czyli poprawny fragment będzie wyglądał:

  1. <?php
  2.  
  3. if ( file_exists( $dzial . '.html' ) )
  4.  
  5. ?>


W tym wypadku dostaniesz ciąg '1.html' i wrzucając go do funkcji file_exists() sprawdzasz czy istnieje plik '1.html' a nie tak jak miałeś wcześniej '1html'
Kreton
nadal nidzla wlasnie to if_exists :/, probowalem takze w innym skrypcie tego uzywac ale niedziała. Tu musi byc problem z tym if_exists
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.