![]() |
![]() |
![]()
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: 2 885 Pomógł: 463 Dołączył: 3.10.2009 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Poprawne użycie PDO pozwoli Ci zapomnieć o konieczności filtrowania danych, preparowanie i bindowanie parametrów do zapytań jest wystarczającym zabezpieczeniem przed atakiem sql injection. Dodatkowo PDO domyślnie eskejpuje wszystkie potencjalnie groźne znaki, dlatego polecam Ci od razu stosowanie PDO, gdyż po prostu ułatwisz sobie pracę, nie wspominając o tym, że PDO jest standardem w kwestii obsługi bazy z poziomu kodu. Odnośnie Twojego pytania: jeśli nie korzystałbym z PDO, to filtrowałbym wszystkie dane od razu, nie tuż przed dodaniem do bazy, ale od razu jeszcze przed zapisaniem w sesji i dopiero tak przefiltrowane dane zapisywałbym w sesji. Odnośnie pytania o zalety PDO: http://www.google.pl/search?q=zalety+pdo&a...lient=firefox-a (przekonywać na siłę nikogo nie będę).
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 16.10.2025 - 11:22 |