Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Filtrowanie $_GET
Forum PHP.pl > Forum > Przedszkole
!*!
Przesyłam dane przez GET, zwykła wyszukiwarka input... Jak przefiltorwać te dane? Gdy wpisze coś takiego:

  1. xczxczc<div class="zxczxcx">lll</div>


strona jest rozwalana...

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

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


źródełko
!*!
Czytałem to, jednak problemu nie rozwiązuje:

wpisuje w input:

  1. xczxczc<div class="zxczxcx">lll</div>


filtr:

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


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 echo ''.$_GET['w2'].''; ?>" />
  6.        <input type="hidden" name="mieszkania" value="<?php 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.
TomASS
Dlaczego tutaj nie użyłeś htmlentities:
  1. <input type="text" class="fszukaj"  name="w2" value="<?php echo ''.$_GET['w2'].''; ?>" />

?
a to po co?:
  1. <?php
  2. $zm = 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 echo htmlentities($_GET['w2']); ?>" />
  6.       <input type="hidden" name="mieszkania" value="<?php echo htmlentities($_GET['mieszkania']); ?>" />
  7.  
  8.  
  9.   </fieldset>
  10. </form>
  11. <?php
  12. echo htmlentities($_GET['w2']);
  13. ?>

i pięknie działa! nic się nie rozjeżdża
!*!
Dla pewności umieśilem to w fukncji:

  1. <?php
  2. function zabezpieczget($danezget)
  3. {
  4. }
  5. ?>


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ć?
Shili
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_...
TomASS
Wcale nie musisz wszędzie dawać html....

Możesz dać na początku każdego pliku:
  1. <?
  2. if(is_array($_GET)){
  3.    foreach ($_GET as $key => $value) {
  4.        $_GET[$key]=htmlentities($value);
  5.    }
  6. }
  7. ?>

lub jak wolisz:
  1. <?
  2. function zabezpieczget($danezget)
  3. {
  4. }
  5.  
  6. if(is_array($_GET)){
  7.    foreach ($_GET as $key => $value) {
  8.        $_GET[$key]=zabezpieczget($value);
  9.    }
  10. }
  11. ?>


czyli:
  1. <?
  2. if(is_array($_GET)){
  3.    foreach ($_GET as $key => $value) {
  4.        $_GET[$key]=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 echo $_GET['w2']; ?>" />
  13.       <input type="hidden" name="mieszkania" value="<?php echo $_GET['mieszkania']; ?>" />
  14.  
  15.  
  16.   </fieldset>
  17. </form>
  18. <?php
  19. echo $_GET['w2'];
  20. ?>

i nie musisz się martwić.
!*!
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
Shili
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.
!*!
Wywaliłem, efekt pozostał:

  1. <?php
  2. function zabezpieczget($danezget)
  3. {
  4. }
  5. ?>


edit dodałem stripslashes, teraz jest dobrze?
Shili
Nie wiem, to zależy co widzisz.

Jeśli masz włączone magic quotes, to pewnie tak winksmiley.jpg
!*!
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;)
Shili
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.
!*!
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/
do
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
!*!
Mylisz się, po zmianie na post i wpisaniu \\ nadal pojawia się \\\\ ... poza tym get w przypadku wyszukiwarki jest lepszym rozwiązaniem.
dr_bonzo
Kurde,
do bazy wstawiasz dane przerzucone TYLKO przez mysql_real_escape()
do wyswietlania uzywasz htmlspecialchars(), i tyle [nie wazne skad dane pochodza].
!*!
a ok.. dodatkowo idą dane przez filtr:

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


teraz żadne znaczki nie powinny się przedostać? winksmiley.jpg
kazag
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ł.
!*!
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...
Shili
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();
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.