Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Co złego jest w tej funkcji
Forum PHP.pl > Forum > PHP
ColdFire
Witam. Mam taki kłopot- napisałem sobie funkcję zabezpieczającą linki przed atakami- jest tam pare funkcji na wyrost, ale to taki szczegół. funkcja wygląda tak:
  1. <?php
  2.  
  3. function danger_links($site)
  4. {
  5. $_GET['site']=strtolower($_GET['site']);
  6. if(strpos($_GET['site'], ".")!==false ||
  7.  (strpos($_GET['site'], "get")!==false)  ||
  8.  (strpos($_GET['site'], "union")!==false)  ||
  9.  (strpos($_GET['site'], "select")!==false) ||
  10.  (strpos($_GET['site'], "drop")!==false) ||
  11.  (strpos($_GET['site'], "<")!==false)  ||
  12.  (strpos($_GET['site'], ">")!==false)  ||
  13.  (strpos($_GET['site'], "%")!==false)  ||
  14.  (strpos($_GET['site'], "@")!==false)  ||
  15.  (strpos($_GET['site'], "update")!==false))
  16. {
  17. die ('Niedozwolony adres url');
  18. }
  19. }
  20.  
  21. ?>

po usunięciu $_GET['site']=danger_links($_GET['site']); wszystko wraca do normy... co zatem jest złego w w/w funkcji?
po czym w indexie robię
  1. <?php
  2.  
  3. $_GET['site']=danger_links($_GET['site']);
  4.  
  5. ?>

Przy wpisaniu któregoś "niebezpiecznego" linku pojawia się żądany napis, jednak wpisując cokolwiek innego nie wyświetla mi innej strony- a jest ona wyświetlana poprzez:
  1. <?php
  2.  
  3. elseif(isset($_GET['site']) && !empty($_GET['site']) && !isset($_GET['id']) || empty($_GET['id']) ) {
  4. $query = "SELECT * FROM `". $db_prefix ."_sites` WHERE name='".$_GET['site']."' ";
  5. $result = mysql_query($query);
  6. while ($row = mysql_fetch_row($result)) {
  7. if($row[3]==false) {
  8. echo ($row[6]);
  9. }
  10. else {
  11. eval ($row[6]);
  12. }
  13. }
  14. }
  15.  
  16. ?>
phobos
ta ostania czesc kodu ktora zapodales zaczyna sie od elseif czy to jest jakas czesc wiekszego kodu( jest cos przed tym czy nie ma? )
i jak mozesz to podaj jaki link do strony jest dobry a nie dziala
ColdFire
tak, to część kodu (najpierw ładowanie gdy nie ma podane $_GET['site'], potem podany fragment, a potem gdy jest podany $_GET['site'] i $_GET['id'] )wszystkie ładuą stronę na tej samej zasadzie, różne są tylko zapytania.
Link:
www.digital-creations.pl/index.php?site=Prace (= index.php ,strona domyślna) + link który powinien działać to formularz kontaktowy- część stron nie ma, ale akurat formularz jest)
phobos
moze wystarczy zastowsowac nawiasy sprubuj tak
  1. <?php
  2.  
  3. elseif((isset($_GET['site']) && !empty($_GET['site'])) && (!isset($_GET['id']) || empty($_GET['id'])) )
  4.  
  5. ?>
ColdFire
to dobrze działa, problem jest z funkcją danger_links- wiem to daltego, że gdy usunę linijkę $_GET['site']=danger_links($_GET['site']); wszystko działa normalnie- znakiem tego coś nie tak z funkcją danger_links-tylko co?
phobos
ah omg ale mnie przycmilo problem jest z ta funkcja bo ta funckcja nie zwraca nic wiec jak napiszesz
  1. <?php
  2. $_GET['site']=danger_links($_GET['site']);
  3. ?>

to tak jakbys napisal ze $_GET['site']="";dopisz na koncu funkcju return $_GET['site']
albo zamien ta czesc kodu
  1. <?php
  2. $_GET['site']=danger_links($_GET['site']);
  3. ?>

na
  1. <?php
  2. danger_links($_GET['site']);
  3. ?>

i powinno elegancko dzialac
DeyV
Cytat
$_GET['site']=danger_links($_GET['site']);


Robisz przypisanie wyniku funkcji do zmiennej.

Tyle tylko, że, zauważ, twoja funkcja nic nie zwraca. Mały paradoks, nieprawdaż?

2 sprawa. Po co przekazujesz do funkcji parametr, skoro nigdy z niego nie korzystasz?
Albo rezygnujesz z przesyłania parametru, albo zdecydowanie z niego korzystasz, nie odwołując się w ciele funkcji do zmiennych superglobalnych (co zdecydowanie polecam) .

W takim przypadku funkcja ta wyglądałaby mniej więcej tak:
  1. <?php
  2. function danger_links( $sSite )
  3. {
  4. $sSite =strtolower( $sSite );
  5. if( strpos( $sSite , ".") !== false  
  6. || ( strpos( $sSite , "get") !== false )
  7. || ( strpos( $sSite , "union") !== false ) ) {
  8. die ('Niedozwolony adres url');
  9. }
  10.  
  11. return $sSite ;
  12. }
  13. ?>
ColdFire
Cytat
Robisz przypisanie wyniku funkcji do zmiennej.

Tyle tylko, że, zauważ, twoja funkcja nic nie zwraca. Mały paradoks, nieprawdaż?
ohmy.gif ohmy.gif jaki wstyd... zapomniałem o returnie biggrin.gif natomiast zainteresowało mnie
Cytat
Albo rezygnujesz z przesyłania parametru, albo zdecydowanie z niego korzystasz, nie odwołując się w ciele funkcji do zmiennych superglobalnych (co zdecydowanie polecam) .
dlaczego polecasz takie rozwiązanie? tzn. krótko mówiąc w czym ono jest lepsze?
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.