2012-05-03 7 views
11

Mam stronę, na której chcę zaakceptować adres e-mail w parametrach GET. Jeśli używam FILTER_VALIDATE_EMAIL, czy nadal jestem podatny na ataki typu XSS i JavaScript injection?Czy ustawienie FILTER_VALIDATE_EMAIL w PHP zapewnia odpowiednie zabezpieczenia?

Nie pytam, czy jest to dobry, czy wystarczająco dobry, weryfikator adresów e-mail. Chcę wiedzieć, czy nadal można wstrzykiwać zły kod internetowy przez arbitralne ciągi przekazywane przez niego - czy muszę zrobić dodatkowe filtrowanie, aby temu zapobiec?

Odpowiedz

9

tak, prawidłowy adres e-mail może być używany jako pojemnik dla niektórych starannie spreparowanych ciągów.

wydostań się z myślenia "filtrującego" i weź w "ucieczkę". Uniwersalny filtr "make it safe" po prostu nie istnieje.

na przykład, jeśli adres e-mail zostanie wyświetlony jako zwykły dokument tekstowy, nic nie będzie potrzebne. jeśli jest on wyprowadzany do dokumentu html, jako węzeł tekstowy, musi zostać zmieniony na Escape dla znaków specjalnych html i uprawnia. jeśli zostanie on umieszczony w dokumencie HTML, a jego wartość znajdzie się wewnątrz atrybutu html, wówczas trzeba będzie wykonać bardzo ostrożne unikanie i będzie to zależało od kontekstu. jeśli jest używany w kwerendzie sql, to musi zostać zmieniona przez specyficzną dla bazy danych funkcję ucieczki. i tak dalej.

to wszystko na temat kontekstu użycia, a nie zawartości ciągu. dotyczy to wszystkiego (nie tylko wiadomości e-mail lub innego wkładu użytkownika), a nie tylko kwestia bezpieczeństwa, ale jest to kwestia poprawności programowania.

fyi, pamiętam specyfikację adresu e-mail zezwalającą na cytowane ciągi, więc coś w rodzaju "<script>alert('xss')</script>"@example.com byłoby ważne. możliwości są oczywiste.

+1

Na przykład, nie ma też uniwersalnego" bezpiecznego "powitania. To, co w niektórych społeczeństwach jest grzeczne, w innych jest niegrzeczne. Poznaj swój kontekst! – Xeoncross

+1

+1. FILTER_VALIDATE_EMAIL służy do sprawdzania, czy adresy e-mail są poprawne i jak pokazuje powyższy przykład, nie ma to nic wspólnego z żadnym innym problemem dotyczącym iniekcji. Gdyby to * miało * blokować cytaty lub mniej niż wtedy, byłoby to tylko przez współwystępowanie i nie byłoby czymś, na czym powinieneś polegać. – bobince

2

To powinno być wystarczająco dobre, ale naturalnie powinieneś uciec przed wprowadzeniem go do bazy danych, itp. Nigdy nie wiesz, jaki rodzaj błędu może istnieć w PHP lub Apache, itp., Co może pozwolić na atak w każdym razie .

+5

Nie ma nic wspólnego z błędami. Prawidłowe adresy e-mail nie są automatycznie bezpieczne dla bazy danych. E-mail 'john.o'connor @ somewhere.com' da ci żal, jeśli po prostu wstrzykniesz to do zapytania SQL ... – Cylindric

Powiązane problemy