Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP]Filtrowanie $_GET

Napisany przez: !*! 8.09.2008, 05:02:25

Przesyłam dane przez GET, zwykła wyszukiwarka input... Jak przefiltorwać te dane? Gdy wpisze coś takiego:

  1. xczxczc<http://december.com/html/4/element/div.html class="zxczxcx">lll</http://december.com/html/4/element/div.html>


strona jest rozwalana...

kombinowałem nawet z czymś takim ale nic to nie daje..

  1. <?php
  2. $wynik = http://www.php.net/strip_tags(http://www.php.net/stripslashes(http://www.php.net/htmlspecialchars(http://www.php.net/trim(http://www.php.net/addslashes($_GET['w2'])))));
  3. ?>

Napisany przez: TomASS 8.09.2008, 07:05:01

  1. <?php
  2. $str = "A 'quote' is <b>bold</b>";
  3.  
  4. // Output: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
  5. http://www.php.net/echo http://www.php.net/htmlentities($str);
  6.  
  7. // Output: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
  8. http://www.php.net/echo http://www.php.net/htmlentities($str, ENT_QUOTES);
  9. ?>


http://pl2.php.net/manual/pl/function.htmlentities.php

Napisany przez: !*! 8.09.2008, 11:30:34

Czytałem to, jednak problemu nie rozwiązuje:

wpisuje w input:

  1. xczxczc<http://december.com/html/4/element/div.html class="zxczxcx">lll</http://december.com/html/4/element/div.html>


filtr:

  1. <?php
  2. $wynik = $_GET['w2'];
  3. $zm = http://www.php.net/strip_tags($wynik);
  4.  
  5. http://www.php.net/echo http://www.php.net/htmlentities($zm);
  6. http://www.php.net/echo http://www.php.net/htmlentities($zm  , ENT_QUOTES);
  7.  
  8.  
  9. http://www.php.net/echo ''.$zm.'';
  10. ?>


efekt echo:

  1. 111133331111333311113333


formularz wygląda tak:

  1. <form action="" method="get">
  2.        <fieldset>
  3.  
  4.        <input type="hidden" name="xxc" value="wgo" />
  5.        <input type="text" class="fszukaj"  name="w2" value="<?php http://www.php.net/echo ''.$_GET['w2'].''; ?>" />
  6.        <input type="hidden" name="mieszkania" value="<?php http://www.php.net/echo ''.$_GET['mieszkania'].''; ?>" />
  7.  
  8.  
  9.    </fieldset>
  10. </form>


ale strona jest rozwala mimo wszytko, ponieważ dane w samym input nie są filtrowane tzn. niektóre znaki html wyskakują poza input.

Napisany przez: TomASS 8.09.2008, 14:26:53

Dlaczego tutaj nie użyłeś htmlentities:

  1. <input type="text" class="fszukaj"  name="w2" value="<?php http://www.php.net/echo ''.$_GET['w2'].''; ?>" />

?
a to po co?:
  1. <?php
  2. $zm = http://www.php.net/strip_tags($wynik);
  3. ?>


Daj tak:
  1. <form action="" method="get">
  2.       <fieldset>
  3.  
  4.       <input type="hidden" name="xxc" value="wgo" />
  5.       <input type="text" class="fszukaj"  name="w2" value="<?php http://www.php.net/echo http://www.php.net/htmlentities($_GET['w2']); ?>" />
  6.       <input type="hidden" name="mieszkania" value="<?php http://www.php.net/echo http://www.php.net/htmlentities($_GET['mieszkania']); ?>" />
  7.  
  8.  
  9.   </fieldset>
  10. </form>
  11. <?php
  12. http://www.php.net/echo http://www.php.net/htmlentities($_GET['w2']);
  13. ?>

i pięknie działa! nic się nie rozjeżdża

Napisany przez: !*! 8.09.2008, 15:19:02

Dla pewności umieśilem to w fukncji:

  1. <?php
  2. function zabezpieczget($danezget)
  3. {
  4. return http://www.php.net/mysql_real_escape_string(http://www.php.net/htmlspecialchars(http://www.php.net/strip_tags(http://www.php.net/addslashes($danezget))));
  5. }
  6. ?>


teraz tylko musze przy kazdym GET dodać zabezpiecznieget... trochę roboty mnie czeka...

ps. taka filtracja dobrze się nadaje też do post i wysyłaniu danych do bazy? Czy jeszcze coś dodać?

Napisany przez: Shili 8.09.2008, 15:24:28

Załóżmy, że chcę wyszukać słowa z apostrofem.

Sprawdź, co Ci zwróci to szukanie (stawiam na to, że nic, jeśli oczywiście masz takie słowa w bazie). Czemu?
Znak ucieczki doda: addslashes i mysql_real...

Zdecyduj się na jedną z nich, dwie to nadmiar uniemożliwiający poprawne działanie wyszukiwarki. Swoją drogą podpowiem, że lepiej mysql_...

Napisany przez: TomASS 8.09.2008, 15:34:03

Wcale nie musisz wszędzie dawać html....

Możesz dać na początku każdego pliku:

  1. <?
  2. if(http://www.php.net/is_array($_GET)){
  3.    foreach ($_GET as $key => $value) {
  4.        $_GET[$key]=http://www.php.net/htmlentities($value);
  5.    }
  6. }
  7. ?>

lub jak wolisz:
  1. <?
  2. function zabezpieczget($danezget)
  3. {
  4. return http://www.php.net/mysql_real_escape_string(http://www.php.net/htmlspecialchars(http://www.php.net/strip_tags($danezget)));
  5. }
  6.  
  7. if(http://www.php.net/is_array($_GET)){
  8.    foreach ($_GET as $key => $value) {
  9.        $_GET[$key]=zabezpieczget($value);
  10.    }
  11. }
  12. ?>


czyli:
  1. <?
  2. if(http://www.php.net/is_array($_GET)){
  3.    foreach ($_GET as $key => $value) {
  4.        $_GET[$key]=http://www.php.net/htmlentities($value);
  5.    }
  6. }
  7. ?>
  8. <form action="" method="get">
  9.       <fieldset>
  10.  
  11.       <input type="hidden" name="xxc" value="wgo" />
  12.       <input type="text" class="fszukaj"  name="w2" value="<?php http://www.php.net/echo $_GET['w2']; ?>" />
  13.       <input type="hidden" name="mieszkania" value="<?php http://www.php.net/echo $_GET['mieszkania']; ?>" />
  14.  
  15.  
  16.   </fieldset>
  17. </form>
  18. <?php
  19. http://www.php.net/echo $_GET['w2'];
  20. ?>

i nie musisz się martwić.

Napisany przez: !*! 8.09.2008, 15:38:39

Shili - jeśli podam do wyszukania słowo "willa" jako:

Kod
'willa'


zostanie ono zamienione na:

Kod
\\\'willa\\\'


I zostanie bez problemu wyszukane... tylko pojawiają się \\\\\ w wyniku... Jak można to usunąć? heh zakręcone, dodanie \\ dla bezpieczeństwa, ale bląd w wyświetlaniu.. późniejszym po filtrowaniu

Napisany przez: Shili 8.09.2008, 19:44:11

Napisałam - wywal addslashes - mysql_real_escape_string jest lepsze, bo nie dość, że escapeuje znaki, które addslashes może ominąć, to w dodatku jest bezpośrednio przeznaczone do bazy mysql.

Napisany przez: !*! 8.09.2008, 22:25:55

Wywaliłem, efekt pozostał:

  1. <?php
  2. function zabezpieczget($danezget)
  3. {
  4. return http://www.php.net/mysql_real_escape_string(http://www.php.net/htmlspecialchars(http://www.php.net/strip_tags(http://www.php.net/stripslashes($danezget))));
  5. }
  6. ?>


edit dodałem stripslashes, teraz jest dobrze?

Napisany przez: Shili 8.09.2008, 22:40:11

Nie wiem, to zależy co widzisz.

Jeśli masz włączone magic quotes, to pewnie tak winksmiley.jpg

Napisany przez: !*! 9.09.2008, 06:26:28

Widzę.. złe rzeczy widze np. mogę wpisać:

Kod
/


i wyskoczy mi ze dwa takie... można się tego pozbyć? aby nie było można robić spacji, apostrofów itp.? Nie są mi one potrzebne do szczęścia;)

Napisany przez: Shili 9.09.2008, 08:42:51

Widzisz już takie rzeczy po dodaniu do bazy, czy jeszcze przed?

Jeśli przed, to wszystko jest dobrze, jeśli w bazie się coś takiego pojawia, to jest źle. Także sprecyzuj gdzie widzisz podwójny / i pomyślimy, względnie się wytłumaczy czemu tak jest.

Napisany przez: !*! 9.09.2008, 09:19:37

Przed dodaniem, w zasadzie w każdym polu tak jest, baza jest "czysta". \\ pojawia sie po zatwierdzeniu formularza, oczywiście nie przejdze, bo blokuje go filtr, ale jeśli wpiszę:

Kod
\\nazwa\\ otrzymam wynik \\\\nazwa\\\\


jest jeden myk z tym, na stronie mam inny include z linkami... jeśli chce wyszukać poprzez właśnie "\\nazwa\\" i kliknę na inny link, w adresie strony pojawia sie taki ciąg znaków

Kod
%5Cnazwa%5C


niby ok, bo tak przeglądarka widzi taki adres, ale... gdy kliknę tak z parę razy ta zmienna się klonuje

Kod
%5Cnazwa%5C%5Cnazwa%5C%5Cnazwa%5C%5Cnazwa%5C


po kilku takich klikach strona jest blokowana, riques-url/

Napisany przez: do 9.09.2008, 09:24:34

Wysyłaj dane postem to uniknieiesz takich, problemów ze slashami.

Co do twojego pytania dodaj w <form action="" nazwe pliku do którego jest wysyłany formularz

Napisany przez: !*! 9.09.2008, 15:40:31

Mylisz się, po zmianie na post i wpisaniu \\ nadal pojawia się \\\\ ... poza tym get w przypadku wyszukiwarki jest lepszym rozwiązaniem.

Napisany przez: dr_bonzo 9.09.2008, 15:51:18

Kurde,
do bazy wstawiasz dane przerzucone TYLKO przez mysql_real_escape()
do wyswietlania uzywasz htmlspecialchars(), i tyle [nie wazne skad dane pochodza].

Napisany przez: !*! 9.09.2008, 16:06:13

a ok.. dodatkowo idą dane przez filtr:

  1. <?php
  2. $nazwa = http://www.php.net/stripslashes($nazwa);
  3. $nazwa= http://www.php.net/ereg_replace('[^a-zA-Z0-9]', '', $nazwa);
  4. ?>


teraz żadne znaczki nie powinny się przedostać? winksmiley.jpg

Napisany przez: kazag 9.09.2008, 17:20:16

Czy nie jest tak, że mysql sam dodaje slashe podczas przesyłania danych do bazy? I htmlspecialchars() powinno już wystarczyć (ewentualnie możesz sprawdzać typ danych, jeśli np. mają być tylko liczbowe, lub ten typ wymuszać). Ja osobiście dodaje jeszcze strip_tags i imho starczy.

edit: i staram się używać POST kiedy tylko jest to możliwe, żeby mi ktoś głupich linków nie konstruował.

Napisany przez: !*! 9.09.2008, 18:06:45

kazag - a jak zrobiłbyś w POST wyszukiwarkę ze stronicowaniem + 4 includy na stronie z czego każdy ma swoje stronicowanie? jest to conajmniej kłopotliwe...

Napisany przez: Shili 10.09.2008, 09:46:10

Cytat
Czy nie jest tak, że mysql sam dodaje slashe podczas przesyłania danych do bazy?
Nie. Gdyby tak było, to nie byłoby również mowy o czymś takim jak sql injection.

Jeśli jest włączona dyrektywa magic quotes, to faktycznie slashe są dodawane - ale nie potrafią obsłużyć wszystkich znaków specjalnych. Dlatego o wiele lepsze jest i tak mysql_real_escape_string();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)