Przesyłam dane przez GET, zwykła wyszukiwarka input... Jak przefiltorwać te dane? Gdy wpisze coś takiego:
xczxczc<http://december.com/html/4/element/div.html class="zxczxcx">lll</http://december.com/html/4/element/div.html>
<?php $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']))))); ?>
<?php $str = "A 'quote' is <b>bold</b>"; // Output: A 'quote' is <b>bold</b> http://www.php.net/echo http://www.php.net/htmlentities($str); // Output: A 'quote' is <b>bold</b> http://www.php.net/echo http://www.php.net/htmlentities($str, ENT_QUOTES); ?>
Czytałem to, jednak problemu nie rozwiązuje:
wpisuje w input:
xczxczc<http://december.com/html/4/element/div.html class="zxczxcx">lll</http://december.com/html/4/element/div.html>
<?php $wynik = $_GET['w2']; $zm = http://www.php.net/strip_tags($wynik); http://www.php.net/echo http://www.php.net/htmlentities($zm); http://www.php.net/echo http://www.php.net/htmlentities($zm , ENT_QUOTES); http://www.php.net/echo ''.$zm.''; ?>
111133331111333311113333
<form action="" method="get"> <fieldset> <input type="hidden" name="xxc" value="wgo" /> <input type="text" class="fszukaj" name="w2" value="<?php http://www.php.net/echo ''.$_GET['w2'].''; ?>" /> <input type="hidden" name="mieszkania" value="<?php http://www.php.net/echo ''.$_GET['mieszkania'].''; ?>" /> </fieldset> </form>
Dlaczego tutaj nie użyłeś htmlentities:
<input type="text" class="fszukaj" name="w2" value="<?php http://www.php.net/echo ''.$_GET['w2'].''; ?>" />
<?php $zm = http://www.php.net/strip_tags($wynik); ?>
<form action="" method="get"> <fieldset> <input type="hidden" name="xxc" value="wgo" /> <input type="text" class="fszukaj" name="w2" value="<?php http://www.php.net/echo http://www.php.net/htmlentities($_GET['w2']); ?>" /> <input type="hidden" name="mieszkania" value="<?php http://www.php.net/echo http://www.php.net/htmlentities($_GET['mieszkania']); ?>" /> </fieldset> </form> <?php http://www.php.net/echo http://www.php.net/htmlentities($_GET['w2']); ?>
Dla pewności umieśilem to w fukncji:
<?php function zabezpieczget($danezget) { 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)))); } ?>
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_...
Wcale nie musisz wszędzie dawać html....
Możesz dać na początku każdego pliku:
<? if(http://www.php.net/is_array($_GET)){ foreach ($_GET as $key => $value) { $_GET[$key]=http://www.php.net/htmlentities($value); } } ?>
<? function zabezpieczget($danezget) { return http://www.php.net/mysql_real_escape_string(http://www.php.net/htmlspecialchars(http://www.php.net/strip_tags($danezget))); } if(http://www.php.net/is_array($_GET)){ foreach ($_GET as $key => $value) { $_GET[$key]=zabezpieczget($value); } } ?>
<? if(http://www.php.net/is_array($_GET)){ foreach ($_GET as $key => $value) { $_GET[$key]=http://www.php.net/htmlentities($value); } } ?> <form action="" method="get"> <fieldset> <input type="hidden" name="xxc" value="wgo" /> <input type="text" class="fszukaj" name="w2" value="<?php http://www.php.net/echo $_GET['w2']; ?>" /> <input type="hidden" name="mieszkania" value="<?php http://www.php.net/echo $_GET['mieszkania']; ?>" /> </fieldset> </form> <?php http://www.php.net/echo $_GET['w2']; ?>
Shili - jeśli podam do wyszukania słowo "willa" jako:
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ł:
<?php function zabezpieczget($danezget) { 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)))); } ?>
Nie wiem, to zależy co widzisz.
Jeśli masz włączone magic quotes, to pewnie tak
Widzę.. złe rzeczy widze np. mogę wpisać:
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ę:
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.
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:
<?php $nazwa = http://www.php.net/stripslashes($nazwa); $nazwa= http://www.php.net/ereg_replace('[^a-zA-Z0-9]', '', $nazwa); ?>
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...
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)