Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Mało kodożerny sposób na index.php?id=X - jak ?
kiler129
post 21.03.2007, 13:08:25
Post #1





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


A wiec mam dylemat natury takiej że nie wiem jak bezpiecznie includować przez get dry.gif Widziałem już sporo stron na ktorych było index.php?id=plik.php - aż się prosi o skasowanie strony tongue.gif
Ale do zeczy, mianowicie teraz mam podobny problem, jak to zrobic ale bezpiecznie i tak aby nie zajmowało 3 cyfrowej liczby linijek kody laugh.gif
Najproście ro chyba tak:

  1. <?php
  2. $id = $_GET['id'];
  3.  
  4. if($id == 1)
  5. {
  6. include 'plik1.php';
  7. }
  8.  
  9. if($id == 2)
  10. {
  11. include 'plik2.php';
  12. }
  13.  
  14. if($id == 3)
  15. {
  16. include 'plik1.php';
  17. }
  18. ?>



Ale w takim układzie spooro lini kodu przybędzie a co za tym idzie szybkość spadnie i przy sporej liczbie odwiedzających może być już kiepsko - przykładem jest np. seriws elektroda.pl który w godzinach szcytu potrafi miec czas wykonani skryptu ponad 30 sekund !
Drugim mankamentem tego kodu jest że tutaj trudno sprawdzić czy taki id istnieje, nie chce dopuścić do sytłacji gdzie użytkownik z powodu braku pliku dostaje całą stronę błędów ....

Pomyślałem że można też tak:

  1. <?php
  2. $id = $_GET['id'];
  3. $plik = ./$id;
  4.  
  5.  
  6. if (is_readable($plik)) 
  7. {
  8.  include $plik.'.php';
  9. } 
  10. else 
  11. {
  12.  echo 'Dokument o podanym ID nie istanieje ! Jeśli zaprowadził Cie tutaj któryś z linków na stronie skontaktuj się z administratorem.';
  13. }
  14. ?>


Tylko teraz czy ten sposób jest naprawde bezpieczny ? No niby jest ./ ale jakoś ja mam talent do pisania skryptów które łątwo wykrzaczyć tongue.gif



p.s. Powyższych kodów nie sprawdzałem ale powinny działać.


*/*/*/*EDIT*\*\*\*
Drugi kod był błedny tongue.gif I już umiem go shackowac tongue.gif Wystarczyło napisać index.php?id=index i pokazywał sie index.php.
Aż starch pomyśleć => index.php?id=../../pwd tongue.gif
Ale dobra mnijsza o to, poprawiłem go i wygląda tak:

  1. <?
  2. $id = $_GET['id'];
  3. $plik = './doc_'.$id.'.php';
  4.  
  5.  
  6. if (is_readable($plik)) 
  7. {
  8.  include $plik;
  9. } 
  10. else 
  11. {
  12.  echo 'Dokument o podanym ID nie istanieje ! Jeśli zaprowadził Cie tutaj któryś z linków na stronie skontaktuj się z administratorem.';
  13. }
  14. ?>


Więc teraz nie da się jako id podać index bo nie ma czegos takeigo jak doc_index.php, pilnowac tylko trzeba żeby żaden dokument php nie miał nazwy zaczynającej się na doc_.
Czy teraz skrypt jest bezpieczy ?

Ten post edytował kiler129 21.03.2007, 13:22:21


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
lent
post 21.03.2007, 15:30:52
Post #2





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 30.01.2007

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


Załóżmy, że masz dwa pliki na serwerze:
doc_index.php
doc_tajne.txt
Niby doc_tajne.txt nie zinclude'uje się bo ma końcówke .txt a nie .php, ale gdyby id=tajne.txt%00 to wyświetli się doc_tajne.txt, więc taki sposób też nie jest do końca bezpieczny.
A i zamiast is_readable() lepiej chyba używać file_exists();

Ten post edytował lent 21.03.2007, 15:33:52
Go to the top of the page
+Quote Post
kiler129
post 21.03.2007, 16:06:00
Post #3





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


To nie przejdzie bo wszystkie pliki z danymi u mnie mają rozszerzenie .php i w środku zmienne.
Poza tym pliki z hasłami (i to napewno hasłami do danych) się szyfruje winksmiley.jpg

p.s. Wole użyć is_readable() bo gdy użyje file_exists() to w razie co jak ktos zaincluduje plik który ma prawa odczytu tylko przez właściciela a nie ma prw odczytu przez php to zamiast błędu Premission denid zobaczy brak pliku o padnym id więc stwierdzi ze takiego pliku nie ma i nie będzie węszył przy nim tongue.gif

Ten post edytował kiler129 21.03.2007, 16:08:38


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
LBO
post 21.03.2007, 16:54:28
Post #4





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Jeżeli upierasz się przy tym sposobie, uprość go.


Zrób tablicę, gdzie przyporządkujesz numer ID do pliku, wtedy wielkość kodu to kwestia wielkości tablicy, a samo include'owanie można umieścić w małej funkcji.
Go to the top of the page
+Quote Post
kiler129
post 21.03.2007, 17:49:11
Post #5





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Jakoś nie czaje, moze i to śmieszne o co pytama ale jestem chory i moge trochę od żeczy gadać tongue.gif
Weź mi napisz kodzik o co ci chodzi z tą tablicą. Po co ona ? Co w moim kodziku jest nie tego ?


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
tansky
post 21.03.2007, 23:05:12
Post #6





Grupa: Zarejestrowani
Postów: 87
Pomógł: 0
Dołączył: 5.12.2005

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


Jeśli dobrze zrozumiałem przedmówcę...
  1. <?php
  2.  
  3. if ($_GET['id']) {
  4. $zezwalaj = array ( // w tej tablicy zapisujesz sobie powiazania id / plik
  5. "1" => "logowanie",
  6. "2" => "artykuly",
  7. "3" => "forum"
  8. );
  9.  
  10. $id = $_GET['id'];
  11. $path = 'resources/'; // ścieżka do includowanych plików
  12.  
  13. $asked = $path.$zezwalaj[$id].'.php';
  14.  
  15. if (array_key_exists($id, $zezwalaj) && file_exists($asked)) include ($asked);
  16. }
  17. ?>


Pisane na szybko z ręki, więc może coś być nie tak.

Ten post edytował tansky 21.03.2007, 23:09:11
Go to the top of the page
+Quote Post
vokiel
post 22.03.2007, 06:24:49
Post #7





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Mam małą propozycję, aby przekazywaną wartość przerabiać na liczbę (skoro podajesz w $_GET id)
kod tansky'ego po malusiej modyfikacji:

  1. <?php
  2. if (isset($_GET['id'])) 
  3. {
  4. $zezwalaj = array ( // w tej tablicy zapisujesz sobie powiazania id / plik
  5. "1" => "logowanie",
  6. "2" => "artykuly",
  7. "3" => "forum"
  8. );
  9.  
  10. $id = (int)$_GET['id']; // jeśli będziesz przekazywał id tylko jako liczbę to można by sie tak zabezpieczy
    ć
  11.  
  12. $path = 'resources/'; // ścieżka do includowanych plików
  13. $asked = $path.$zezwalaj[$id].'.php';
  14. if (array_key_exists($id, $zezwalaj) && file_exists($asked)) include ($asked);
  15. }
  16. ?>


--------------------
Go to the top of the page
+Quote Post
marrrecki
post 22.03.2007, 07:29:50
Post #8





Grupa: Zarejestrowani
Postów: 110
Pomógł: 0
Dołączył: 19.07.2006
Skąd: Lublin

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


  1. <?php
  2. $id = $_GET['id']
  3. switch $id {
  4. case '1':
  5.  echo 'raz';
  6. break;
  7. case '2':
  8.  echo 'dwa';
  9. break;
  10. default:
  11.  echo 'nie ma';
  12. break
  13. }
  14. ?>


Może coś taiego ci się przyda?
Go to the top of the page
+Quote Post
kiler129
post 22.03.2007, 17:53:02
Post #9





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


No dobra super a gdzie zwiały polskie znaki ?
Jak napisze tak:

$tresc = 'ęóąśłżźćń';

A następnie wywyołam echo $tresc; to pokaże się

ę󹜳żŸćń

co z tym zrobić ?


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Jabol
post 22.03.2007, 17:59:13
Post #10





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

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


Cytat("forum.php.pl")
<meta http-equiv="content-type" content="text/html; charset=iso-8859-2" />
Lub też inn charset (UTF/cp1250), w zależności od tego w jakim jest zakodowany Twój plik php (sprawdź w ustwieniach edytora).
Go to the top of the page
+Quote Post
kiler129
post 22.03.2007, 18:25:50
Post #11





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Hmm a jak koduje wordpad ? tongue.gif

----

a co to za pytanie ? hmm ?
następnym razem będzie ostrzeżenie


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
revyag
post 22.03.2007, 19:08:01
Post #12





Grupa: Przyjaciele php.pl
Postów: 2 258
Pomógł: 16
Dołączył: 21.09.2004
Skąd: Kielce

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


Przenoszę na przedszkole


--------------------
-------------

------
Go to the top of the page
+Quote Post
empathon
post 22.03.2007, 19:13:50
Post #13





Grupa: Zarejestrowani
Postów: 246
Pomógł: 31
Dołączył: 13.11.2006
Skąd: się znamy?

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


Cytat(kiler129 @ 22.03.2007, 18:25:50 ) *
Hmm a jak koduje wordpad ? tongue.gif


Spróbuj Eclipse PHP IDE ( podaje linka do wersji na windows ).


--------------------
Goldenline: Łukasz Rodziewicz
Go to the top of the page
+Quote Post
LBO
post 22.03.2007, 19:26:47
Post #14





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Cytat(vokiel @ 22.03.2007, 06:24:49 ) *
Mam małą propozycję, aby przekazywaną wartość przerabiać na liczbę (skoro podajesz w $_GET id)
kod tansky'ego po malusiej modyfikacji:

[...]
[/php]


O to to to smile.gif O to mi chodziło.

Powoli dojdziemy do idei routera.
Go to the top of the page
+Quote Post
kiler129
post 22.03.2007, 20:42:23
Post #15





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Wszystko ok tylko niech ktos mi powie dlaczego ten kod nie działa:

  1. <?
  2.  
  3. if(count($_GET) == 1)
  4. {
  5.  if (isset($_GET['id'])) 
  6.  {
  7.  $tablica = array (
  8.  "1" => "logowanie",
  9.  "2" => "artykuly",
  10.  "3" => "forum"
  11.  );
  12.  $id = (int)$_GET['id']; 
  13.  $path = './resources/'; 
  14.  $asked = $path.$tablica[$id].'.php';
  15.  if (array_key_exists($id, $tablica) && file_exists($asked)) include ($asked);
  16.  }
  17.  else
  18.  {
  19.  echo 'Dokument o podanym ID nie istnieje';
  20.  }
  21. }
  22. else
  23. {
  24. $tresc = 'wstep';
  25. }
  26.  
  27. ?>


Tzn. działa ale po padaniu id np. 6718234239843 skrypt poprostu nic nie wytświetla zamista pokazac błąd o braku takiego id - co jest ?
Napewno gdzies jest błąd ale ja go nie widze ;P


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
Istalacar
post 22.03.2007, 20:57:41
Post #16





Grupa: Zarejestrowani
Postów: 108
Pomógł: 4
Dołączył: 3.03.2007

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


Po dodaniu wcięć:

  1. <?
  2.  
  3. if(count($_GET) == 1)
  4. {
  5.  if (isset($_GET['id'])) 
  6.  {
  7. $tablica = array (
  8.  "1" => "logowanie",
  9.  "2" => "artykuly",
  10.  "3" => "forum"
  11. );
  12. $id = (int)$_GET['id']; 
  13. $path = './resources/'; 
  14. $asked = $path.$tablica[$id].'.php';
  15. if (array_key_exists($id, $tablica) && file_exists($asked)) include ($asked);
  16.  }
  17.  else
  18.  {
  19.  echo 'Dokument o podanym ID nie istnieje';
  20.  }
  21. }
  22. else
  23. {
  24. $tresc = 'wstep';
  25. }
  26.  
  27. ?>


Po prostu źle klamerki ustawiłeśsmile.gif.
Go to the top of the page
+Quote Post
kiler129
post 22.03.2007, 21:03:42
Post #17





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

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


Nadal nie działa :[
Ale poradziałem sobie ineczej:

  1. <?php
  2. $tresc = 'Dokument o podanym ID nie istnieje !';
  3. $path = './resources/'; 
  4. if(count($_GET) == 1)
  5. {
  6.  if (isset($_GET['id'])) 
  7.  {
  8.  $tablica = array (
  9.  "0" => "wstepniak",
  10.  "1" => "download",
  11.  "2" => "faq",
  12.  "3" => "logowanie",
  13.  "4" => "informacje",
  14.  "5" => "reklama",
  15.  "6" => "forum",
  16.  "7" => "kontakt"
  17.  );
  18.  $id = (int)$_GET['id']; 
  19.  
  20.  $asked = $path.$tablica[$id].'.php';
  21.  if (array_key_exists($id, $tablica) && file_exists($asked)) include ($asked);
  22.  }
  23. }
  24. else
  25. {
  26. include $path.'wstepniak.php';
  27. }
  28. ?>


Ale teraz z kolei coś schrzaniłem w tablicy tongue.gif
Ktoś powie co ?
Kod
Parse error: parse error, unexpected T_CONSTANT_ENCAPSED_STRING, expecting ')' in F:\WebServ\httpd\web\index.php on line 14




*/*/*/*/EDIT\*\*\*\*

Brak kropki przy 3 id ;p poprawione aby ktos nie wrzucil sobie z bledem jak tego użyć smile.gif

Ten post edytował kiler129 22.03.2007, 21:07:36


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 1.08.2025 - 02:23