![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 15.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich forumowiczów bardzo gorąco, ponieważ jest to mój pierwszy post na tym forum.
Następnym razem będę witał trochę mniej entuzjastycznie (IMG:style_emoticons/default/biggrin.gif) Co prawda, podobne pytanie zadałem na innym forum, ale już przez ponad miesiąc nie otrzymałem żadnej odpowiedzi, więc postanowiłem w zmienionej wersji zadać je wam, drodzy PHP-owcy. Jak większość ludzi zadających tutaj pytania ja również piszę swój serwis i mój problem polega na tym, że obawiam się o jego podatność na ataki. Bardzo dużo czytałem na temat SQL Injection i innych typach ataków, noo... już ze dwa tygodnie. Żeby zebrać jak najwięcej informacji w jednym miejscu i nie tworzyć podobnych tematów, pozwolę sobie zadać pytania w punktach. Wiem, że należy filtrować wszystkie dane pochodzące od użytkownika (to jest priorytet). 1) Jeśli mam formularz oparty o zmienne sesyjne (w tym miejscu muszę zaznaczyć, że walidacja następuje na każdym polu input i textarea), to czy dane pochodzące z każdego pola przed dostaniem się do zmiennej sesyjnej muszą zostać od razu przefiltrowane, czy mogą zostać przefiltrowane przed samym dodaniem do bazy. Konkretnie chodzi mi o znaki: " ' \ załóżmy, że ktoś wpisał: McDonald's (czy apostrof w czystej postaci może być przechowywany w zmiennej przez trzy etapowy formularz, czy trzeba go od razu ucinać znakiem ucieczki? 2) Wyłączyłem na serwerze opcję magic_quotes_gpc. Od tej chwili przy użyciu funkcji mysql_real_escape_string do bazy danych żywcem dodają mi się znaki: " ' \ bez żadnej ucieczki. Czy to jest prawidłowe działanie skryptu? Na przykład, gdy dodam wpis: <?php echo date("Y-m-d"); ?> to ten tekst w czystej postaci dodawany jest do bazy. 3) Napisałem skrypt, który przy pomocy trzech zmiennych GET pobiera z bazy odpowiednie rekordy, pola. Na początku tego skryptu następuje walidacja tych zmiennych: if(preg_match('/^[\węĘóÓąĄśŚłŁźŹżŻńŃ\- ]$/D', $_GET['zmienna']) &&.... walidacja dwóch kolejnych zmiennych) { // jeśli TRUE // tutaj następuje pobranie danych z bazy mysql_query("SELECT.... } else { include("......."); } Czy przy takim zabezpieczeniu (preg_match), j/w konieczne jest używanie funkcji mysql_real_escape_string przed pobraniem danych? Przed mysql_query powinno być: $zmienna = mysql_real_escape_string($_GET['zmienna']); czy można już to sobie darować? 4) Gdzieś wyczytałem, że trzeba filtrować tablice $_SERVER - konkretnie jakie zmienne? 5) Jeśli taki wpis: <?php echo date("Y-m-d"); ?> w bazie jest poprawny, bez żadnych backslash-y to przed wyświetleniem go na stronie wystarczy sama funkcja htmlspecialchars($zmienna, ENT_QUOTES); czy polecacie coś jeszcze? 6) Ostatnie pytanie, na które znam odpowiedź ale jakoś mnie to trapi... czy trzeba filtrować zmienne pól: checkbox, radio i select przekazywane metodą POST? Wybaczcie, że tak obszernie to napisałem ale chciałem jak najjaśniej przekazać wam swoje myśli, problemy, zagwozdki... Proszę o dokładne opisanie/wytłumaczenie każdego punktu, to rozwieje moje wątpliwości. Dziękuję i pozdrawiam. |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 42 Pomógł: 0 Dołączył: 15.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
darko, Noidea, bardzo dziękuję za pomoc. Rozwialiście wszelkie moje wątpliwości, zaczynam filtrować dane od samego początku,
jeszcze przed dodaniem do sesji. Jeśli załapię PDO, przeskoczę na to rozszerzenie, jak nie to zostaję przy wyrażeniach regularnych i standardowych zapytaniach mysql. PLUSY dla was i na koniec mam jeszcze ostatnie pytanie, odnośnie czysto praktycznego wykonania. Jest sobie formularz: Użytkownik wprowadza wartość do pola "a", we wprowadzonym ciągu znajduje się cudzysłów. Teraz wykonuję filtrację za pomocą addslashes. Przed ten cudzysłów wstawiany jest backslash i $_SESSION['a'] przyjmuje wartość: abcd\"efgh Gdy skrypt się wykona następuje powrót do formularza i teraz input "a" przy pomocy stripslashes wyświetla abcd"efgh. Input wyświetla $_SESSION['a']. Ok, tu wszystko jest jasne. Użytkownik wypełnia pozostałe pola, następuje drugi etap wprowadzania danych itd. Teraz moment dodania wpisów do bazy. Pytanie: jak bezpiecznie, bez backslasha dodać wartość $_SESSION['a'] do bazy? Czy poprawnym będzie: stripslashes(mysql_real_escape_string($_SESSION['a'])); (IMG:style_emoticons/default/questionmark.gif) jak w tym przypadku użyję samego mysql_real_escape_string to do bazy zostanie dodany również backslash? |
|
|
![]() ![]() |
![]() |
Aktualny czas: 14.10.2025 - 12:25 |