2013-01-10 11 views
10

Mam formularz z polem tekstowym, które umieszcza dane w pliku php, który korzysta z funkcji "htmlentities", aby bezpiecznie wysłać wiadomość e-mail do właściciela witryny.Utwory PHP nie wystarczą, aby powstrzymać hakerów przed wstrzykiwaniem html z formularza

Problem polega na tym, że ktoś zdołał uzyskać hiperłącze w tekście, a htmlentities() go nie usuwa.

To mój tekstowe html:

<input name="usertext" type="text" /> 

To jest mój kod PHP, który odbiera dane post (wyszedłem kod e-mail, bo to nie jest problem zmieniłem to tylko echo odebranych danych, tak. mógłbym spróbować powtórzyć co haker zrobił Jeśli wiem, jak on to zrobił, mogę znaleźć sposób, aby zatrzymać jej dzieje).

echo trim(htmlentities($_POST["usertext"], ENT_QUOTES)); 

teraz haker wysłać jakieś dane i to był html wynik (kod źródłowy - oznacza to, że pokazał normalny link w przeglądarce):

<a target="_blank" href="mailto:[email protected]">[email protected]</a> 

Pomyślałem, że htmlentities() zawsze powstrzyma kogokolwiek przed wejściem do wszelkiego rodzaju html. Jeśli wejdę hiperłącze, takie jak:

<a href="aaa" /> 

uzyskać:

&lt;a href="aaa" /&gt; 

Ale tekst hakera nie został zakodowany tak.

Więc moje pytania to:

  1. Jak haker wpisać tagi html tak, że htmlentities function() nie zrobił nic do niego?
  2. Jak mogę skopiować to do testowania? (odpowiedź na powyższe pytanie):

Zrobiłem trochę badań i możliwe, że haker zakodował swój tekst w utf-7 czy coś w tym stylu?

Otrzymałem już kilka e-maili z tymi samymi linkami. Ten haker oczywiście testuje moją stronę, żeby sprawdzić, czy może zrobić XSS czy coś.

+0

Po wysłaniu wyślij surowe żądanie z zawartością pola $ _POST ["usertext"]. Możesz również dodać kodowanie do htmlentities, które powinny pasować do kodowania treści. – MatsLindh

+0

Czy sprawdziłeś gdzieś dołączony JavaScript, może jest on tworzony dynamicznie? – martinstoeckli

+0

Czy poprawnie kodujesz zawartość HTML przed wysłaniem? – inhan

Odpowiedz

4

Ładne pytanie! Myślę, że możesz przeczytać ten link, który wyjaśnia problem i daje rozwiązanie.

Proponowane rozwiązanie polega na podaniu do przeglądarki (poprzez metatag) zestawu znaków na stronie.

+0

Dzięki. To połączenie jest bardzo interesujące i wydaje się, że haker mógł użyć utf-7. Jedyny problem polega na tym, że kiedy kopiuję przykłady utf-7 do mojego pola tekstowego i przesyłam je, przeglądarka pokazuje tylko dokładne znaki i nie konwertuje ich na znaczniki html. W każdym razie wydaje się, że jest to jedyny sposób, aby prawdopodobnie zrobił to haker. Podam utf-8, gdzie mogę np. (Php code) nagłówek ("Content-Type: text/html; charset = utf-8"); To może zadziałać. Ponieważ nie mogę powtórzyć tego, co zrobił haker, nigdy się nie dowiem, czy to działa, dopóki nie spróbuje ponownie :) – Daniel

0

To nie jest najbardziej eleganckie rozwiązanie, ale nie widząc reszty kodu, można sprawdzić, czy pole tekstowe użytkownika zawiera ciąg "href" i odmówić.

+0

To jest jeden sposób i zrobię to, jeśli nikt nie będzie w stanie zrozumieć, jak haker przeszedł przez funkcję htmlentities – Daniel

0

Czy htmlspecialchars() rade? Wydaje się, że to sugeruje ten numer article w W3Schools.

Powiązane problemy