Próbuję wymyślić funkcję, przez którą mogę przejść wszystkie moje ciągi, aby ją odkazić. Aby ciąg, który z niego wyszedł, był bezpieczny do wstawienia do bazy danych. Ale jest tak wiele funkcji filtrujących , że nie jestem pewien, których powinienem użyć / potrzebować.
Proszę, pomóż mi wypełnić puste miejsca:
function filterThis($string) {
$string = mysql_real_escape_string($string);
$string = htmlentities($string);
etc...
return $string;
}
php
filter
sanitization
Lauren
źródło
źródło
Odpowiedzi:
Zatrzymać!
Popełniasz błąd. Och, nie, wybrałeś odpowiednie funkcje PHP, aby Twoje dane były nieco bezpieczniejsze. W porządku. Twój błąd dotyczy kolejności operacji oraz sposobu i miejsca korzystania z tych funkcji.
Ważne jest, aby zrozumieć różnicę między oczyszczaniem i sprawdzaniem poprawności danych użytkownika, ucieczką danych do przechowywania i ucieczką do prezentacji.
Odkażanie i weryfikacja danych użytkownika
Kiedy użytkownicy przesyłają dane, musisz się upewnić, że dostarczyli coś, czego oczekujesz.
Odkażanie i filtrowanie
Na przykład, jeśli oczekujesz liczby, upewnij się, że przesłane dane to liczba . Możesz także rzutować dane użytkownika na inne typy. Wszystko, co zostało przesłane, jest początkowo traktowane jak ciąg, więc wymuszenie, aby znane dane numeryczne były liczbami całkowitymi lub zmiennoprzecinkowymi, czyni czyszczenie szybkim i bezbolesnym.
A co z dowolnymi polami tekstowymi i obszarami tekstowymi? Musisz się upewnić, że w tych dziedzinach nie ma nic nieoczekiwanego. Przede wszystkim musisz się upewnić, że pola, które nie powinny zawierać treści HTML, w rzeczywistości nie zawierają HTML. Istnieją dwa sposoby rozwiązania tego problemu.
Najpierw możesz spróbować eskapować dane wejściowe HTML za pomocą
htmlspecialchars
. Nie powinieneś używaćhtmlentities
do neutralizowania HTML, ponieważ wykona on również kodowanie znaków akcentowanych i innych znaków, które według niego również powinny być zakodowane.Po drugie, możesz spróbować usunąć dowolny możliwy kod HTML.
strip_tags
jest szybki i łatwy, ale też niechlujny. HTML Purifier wykonuje znacznie dokładniejszą pracę, zarówno usuwając cały HTML, jak i umożliwiając selektywną białą listę tagów i atrybutów.Nowoczesne wersje PHP są dostarczane z rozszerzeniem filtra , które zapewnia kompleksowy sposób oczyszczania danych wprowadzanych przez użytkownika.
Uprawomocnienie
Upewnienie się, że przesłane dane są wolne od nieoczekiwanych treści, to tylko połowa pracy. Musisz także spróbować upewnić się, że przesłane dane zawierają wartości, z którymi możesz faktycznie pracować.
Jeśli spodziewasz się liczby od 1 do 10, musisz sprawdzić tę wartość. Jeśli używasz jednego z tych nowych, wymyślnych liczbowych danych wejściowych ery HTML5 z pokrętłem i krokami, upewnij się, że przesłane dane są zgodne z krokiem.
Jeśli te dane pochodzą z tego, co powinno być menu rozwijanym, upewnij się, że przesłana wartość jest taka, która pojawiła się w menu.
A co z danymi wejściowymi, które spełniają inne potrzeby? Na przykład dane wejściowe powinny być sprawdzane za pomocą
strtotime
lub klasy DateTime . Podana data powinna mieścić się w oczekiwanych zakresach. A co z adresami e-mail? Wspomniane wcześniej rozszerzenie filtru może sprawdzić, czy adres jest poprawnie sformułowany, chociaż jestem fanem biblioteki is_email .To samo dotyczy wszystkich innych kontrolek formularza. Masz przyciski opcji? Sprawdź na liście. Masz pola wyboru? Sprawdź na liście. Czy przesłać plik? Upewnij się, że plik jest odpowiedniego typu i traktuj jego nazwę jak niefiltrowane dane użytkownika.
Każda nowoczesna przeglądarka ma wbudowany pełny zestaw narzędzi programistycznych, co sprawia, że manipulowanie formularzem jest dla każdego banalne. Twój kod powinien zakładać, że użytkownik całkowicie usunął wszystkie ograniczenia po stronie klienta dotyczące zawartości formularza !
Ucieczka danych do przechowywania
Po upewnieniu się, że dane są w oczekiwanym formacie i zawierają tylko oczekiwane wartości, musisz się martwić o zachowanie tych danych w pamięci.
Każdy mechanizm przechowywania danych ma określony sposób, aby upewnić się, że dane są odpowiednio chronione i zakodowane. Jeśli tworzysz SQL, to akceptowanym sposobem przekazywania danych w zapytaniach są przygotowane instrukcje z symbolami zastępczymi .
Jednym z lepszych sposobów pracy z większością baz danych SQL w PHP jest rozszerzenie PDO . Postępuje zgodnie z powszechnym schematem przygotowywania instrukcji , wiążąc zmienne z instrukcją , a następnie wysyłając instrukcję i zmienne do serwera . Jeśli wcześniej nie pracowałeś z PDO, oto całkiem niezły samouczek zorientowany na MySQL .
Niektóre bazy danych SQL mają własne rozszerzenia w PHP, w tym SQL Server , PostgreSQL i SQLite 3 . Każde z tych rozszerzeń ma przygotowaną obsługę instrukcji, która działa w ten sam sposób, co PDO. Czasami może być konieczne użycie tych rozszerzeń zamiast PDO do obsługi niestandardowych funkcji lub zachowania.
MySQL ma również własne rozszerzenia PHP. A właściwie dwóch. Chcesz używać tylko tego o nazwie mysqli . Stare rozszerzenie „mysql” zostało wycofane i nie jest bezpieczne ani rozsądne w użyciu we współczesnych czasach.
Osobiście nie jestem fanem mysqli. Sposób, w jaki wykonuje zmienne wiązanie przygotowanych instrukcji, jest nieelastyczny i może być trudny w użyciu. W razie wątpliwości użyj zamiast tego PDO.
Jeśli nie używasz bazy danych SQL do przechowywania danych, zapoznaj się z dokumentacją interfejsu bazy danych, którego używasz, aby określić, jak bezpiecznie przekazywać przez nią dane.
Jeśli to możliwe, upewnij się, że Twoja baza danych przechowuje dane w odpowiednim formacie. Przechowuj liczby w polach numerycznych. Przechowuj daty w polach dat. Przechowuj pieniądze w polu dziesiętnym, a nie zmiennoprzecinkowym. Przejrzyj dokumentację dostarczoną przez bazę danych, aby dowiedzieć się, jak prawidłowo przechowywać różne typy danych.
Ucieczka danych do prezentacji
Za każdym razem, gdy pokazujesz dane użytkownikom, musisz upewnić się, że dane są bezpieczne, chyba że wiesz, że nie należy ich uciekać.
Emitując HTML, prawie zawsze powinieneś przekazywać wszelkie dane, które zostały pierwotnie dostarczone przez użytkownika
htmlspecialchars
. W rzeczywistości jedyny raz, kiedy nie powinieneś tego robić, to kiedy wiesz, że użytkownik dostarczył HTML i wiesz, że został on już oczyszczony za pomocą białej listy.Czasami trzeba wygenerować JavaScript za pomocą PHP. Javascript nie ma takich samych reguł ucieczki jak HTML! Bezpiecznym sposobem na dostarczenie wartości dostarczonych przez użytkownika do JavaScript za pośrednictwem PHP jest przejście
json_encode
.I więcej
Walidacja danych ma znacznie więcej niuansów.
Na przykład kodowanie zestawu znaków może być ogromną pułapką . Twoja aplikacja powinna być zgodna z praktykami opisanymi w „ UTF-8 do końca ”. Istnieją hipotetyczne ataki, które mogą wystąpić, gdy traktujesz dane łańcuchowe jako niewłaściwy zestaw znaków.
Wcześniej wspomniałem o narzędziach do debugowania przeglądarki. Narzędzia te mogą być również używane do manipulowania danymi z plików cookie. Pliki cookie należy traktować jako niezaufane dane wejściowe użytkownika .
Sprawdzanie poprawności danych i ucieczka to tylko jeden aspekt bezpieczeństwa aplikacji internetowych. Powinieneś zapoznać się z metodologiami ataków na aplikacje internetowe , aby móc zbudować przed nimi ochronę.
źródło
<>
, nie każdego znaku do jego encjihtmlspecialchars
dwa razy, ponieważ mówi o tym w części „Kiedy użytkownicy przesyłają dane” oraz w części „Podczas wyświetlania danych”.Najskuteczniejszą metodą oczyszczania, która zapobiega iniekcji SQL, jest parametryzacja za pomocą
PDO
. Za pomocą zapytań parametrycznych zapytanie jest oddzielane od danych, co eliminuje zagrożenie iniekcją SQL pierwszego rzędu.Jeśli chodzi o usuwanie HTML,
strip_tags
jest to prawdopodobnie najlepszy pomysł na usunięcie HTML, ponieważ po prostu usunie wszystko.htmlentities
robi to, na co wygląda, więc to też działa. Jeśli chcesz przeanalizować, który HTML zezwolić (to znaczy chcesz zezwolić na niektóre tagi), powinieneś użyć dojrzałego istniejącego parsera, takiego jak HTML Purifierźródło
Dane wejściowe bazy danych - jak zapobiec iniekcji SQL
Musisz wycofać dane wejściowe użytkownika przed wstawieniem lub zaktualizowaniem ich do bazy danych. Oto starszy sposób, aby to zrobić. Chciałbyś teraz używać zapytań parametrycznych (prawdopodobnie z klasy PDO).
Dane wyjściowe z bazy danych - jak zapobiec XSS (Cross Site Scripting)
Używaj
htmlspecialchars()
tylko podczas wyprowadzania danych z bazy danych. To samo dotyczy HTML Purifier. Przykład:I wreszcie ... o co prosiłeś
Muszę zaznaczyć, że jeśli używasz obiektów PDO z parametrami zapytań (właściwy sposób to zrobić), to naprawdę nie ma łatwego sposobu, aby to łatwo osiągnąć. Ale jeśli używasz starego sposobu 'mysql', to jest to, czego potrzebujesz.
źródło
Moje 5 centów.
Nikt tutaj nie rozumie, jak
mysql_real_escape_string
działa. Ta funkcja niczego nie filtruje ani nie oczyszcza.Nie możesz więc używać tej funkcji jako uniwersalnego filtra, który uchroni Cię przed wtryskiem.
Możesz go używać tylko wtedy, gdy rozumiesz, jak działa i gdzie ma to zastosowanie.
Mam odpowiedź na bardzo podobne pytanie, które już napisałem: Czy w PHP przy wysyłaniu stringów do bazy należy zadbać o niedozwolone znaki przy pomocy htmlspecialchars () czy też użyć wyrażenia regularnego?
Kliknij, aby uzyskać pełne wyjaśnienie dotyczące bezpieczeństwa po stronie bazy danych.
Jeśli chodzi o elementy htmlent - Charles ma rację, mówiąc ci o oddzieleniu tych funkcji.
Wyobraź sobie, że zamierzasz wstawić dane wygenerowane przez administratora, który może publikować HTML. Twoja funkcja zepsuje to.
Chociaż odradzałbym htmlentities. Ta funkcja stała się przestarzała dawno temu. Jeśli chcesz zamienić tylko
<
,>
i"
postacie w trosce o bezpieczeństwo HTML - korzystanie z funkcji, która została opracowana celowo do tego celu - AN htmlspecialchars () jeden.źródło
mysql_real_escape_string
wymyka potrzebne znaki w ciągu. Nie jest to ścisłe filtrowanie ani oczyszczanie, ale umieszczanie łańcucha w cudzysłowie też nie jest (i wszyscy to robią, prawie nigdy nie widziałem pytania na ten temat). Więc nic nie jest oczyszczane, kiedy piszemy SQL? Oczywiście nie. To, co zapobiega iniekcji SQL, to użyciemysql_real_escape_string
. Także otaczające cudzysłowy, ale wszyscy to robią, a jeśli przetestujesz to, co robisz, z tym pominięciem otrzymasz błąd składni SQL. Naprawiono niebezpieczną częśćmysql_real_escape_string
.WHERE id = 1
? ;)WHERE my_field = two words
(bez cudzysłowów), aby uzyskać błąd składni. Twój przykład jest zły, ponieważ nie wymaga cudzysłowów ani znaków ucieczki, a jedynie sprawdzenie liczbowe. Nie powiedziałem też, że cytaty są bezużyteczne. Powiedziałem, że wszyscy ich używają, więc to nie jest źródło problemów z iniekcją SQL.everyone use them
ciebie, możesz sprawdzić kody tutaj na SO. Wiele osób nie używa cytatów z liczbami. Domyśl. I proszę, pamiętaj, że nie omawiam tutaj tego, co powiedziałeś, a czego nie. Wyjaśniam tylko podstawowe zasady bezpieczeństwa baz danych. Lepiej się uczyć zamiast pustych argumentów. Nikt tu nie wspomniał o cytatach ani o castingu, ale m_r_e_s tylko tak, jakby to była magia. O czym mówięDo wstawienia do bazy danych wystarczy
mysql_real_escape_string
(lub użyj zapytań parametrycznych). Zwykle nie chcesz zmieniać danych przed ich zapisaniem, co by się stało, gdybyś użyłhtmlentities
. Doprowadziłoby to do zniekształconego bałaganu później, pohtmlentities
ponownym uruchomieniu go, aby wyświetlić go gdzieś na stronie internetowej.Użyj,
htmlentities
gdy wyświetlasz dane na jakiejś stronie internetowej.Nieco powiązane, jeśli wysyłasz przesłane dane gdzieś w e-mailu, na przykład w formularzu kontaktowym, pamiętaj, aby usunąć znaki nowego wiersza z wszelkich danych, które zostaną użyte w nagłówku (takich jak Od: imię i nazwisko oraz adres e-mail, poddział itp. )
Jeśli tego nie zrobisz, to tylko kwestia czasu, zanim roboty spamujące znajdą twoją formę i wykorzystają ją, nauczyłem się na własnej skórze.
źródło
1) Używając natywnych filtrów php , otrzymałem następujący wynik:
(skrypt źródłowy: https: // RunFor github.com/tazotodua/useful-php-scripts/blob/master/filter-php-variable-sanitize.php )
źródło
To zależy od rodzaju używanych danych. Ogólnie najlepiej byłoby użyć,
mysqli_real_escape_string
ale na przykład wiesz, że nie będzie treści HTML, użycie strip_tags zapewni dodatkowe bezpieczeństwo.Możesz także usunąć znaki, o których wiesz, że nie powinny być dozwolone.
źródło
Zawsze zalecam użycie małego pakietu walidacyjnego, takiego jak GUMP: https://github.com/Wixel/GUMP
Zbuduj wszystkie podstawowe funkcje wokół takiej biblioteki i prawie nie da się zapomnieć o urządzeniach sanitarnych. „mysql_real_escape_string” nie jest najlepszą alternatywą dla dobrego filtrowania (jak wyjaśniono w „Your Common Sense”) - a jeśli zapomnisz użyć go tylko raz, cały system będzie można zaatakować przez zastrzyki i inne nieprzyjemne ataki.
źródło
Dla wszystkich, którzy tutaj rozmawiają i polegają na mysql_real_escape_string, powinniście zauważyć, że ta funkcja była przestarzała w PHP5 i nie istnieje już w PHP7.
IMHO najlepszym sposobem wykonania tego zadania jest użycie sparametryzowanych zapytań poprzez wykorzystanie PDO do interakcji z bazą danych. Sprawdź to: https://phpdelusions.net/pdo_examples/select
Zawsze używaj filtrów do przetwarzania danych wejściowych użytkownika. Zobacz http://php.net/manual/es/function.filter-input.php
źródło
mysqli_real_escape_string()
jest dostępne.Używasz mysql_real_escape_string () w kodzie podobnym do poniższego.
Jak mówi dokumentacja, jego celem jest unikanie znaków specjalnych w ciągu przekazanym jako argument, biorąc pod uwagę bieżący zestaw znaków połączenia, aby można było bezpiecznie umieścić go w mysql_query () . Dokumentacja dodaje również:
htmlentities () służy do konwersji niektórych znaków w encjach, gdy wyprowadzasz ciąg znaków w treści HTML.
źródło
To jest 1 sposób, w jaki obecnie ćwiczę,
Przykład:
- E-mail: sprawdź, czy dane wejściowe są w prawidłowym formacie e-mail
- tekst / ciąg: sprawdź, czy dane wejściowe są tylko w formacie tekstowym (ciąg)
- liczba: sprawdź, czy dozwolony jest tylko format liczb.
- itp. Pelase odwołaj się do biblioteki do sprawdzania poprawności danych wejściowych php z portalu php
- Po sprawdzeniu poprawności, kontynuuj używając przygotowanej instrukcji SQL / PDO.
- Po zakończeniu pamiętaj o wyjściu i zakończeniu połączenia.
- Nie zapomnij wyczyścić wartości wyjściowej po zakończeniu.
Uważam, że to wystarczy na podstawowe sekcje. Powinno to zapobiec wszystkim poważnym atakom ze strony hakerów.
Ze względów bezpieczeństwa po stronie serwera możesz chcieć ustawić w swoim apache / htaccess ograniczenie dostępu i zapobieganie robotom, a także zapobieganie routingowi. Oprócz bezpieczeństwa systemu po stronie serwera jest wiele do zrobienia.
Możesz się nauczyć i otrzymać kopię sec z poziomu htaccess apache sec (typowe rpaktyki)
źródło
źródło
a co z tym
albo to
źródło