Po kilku godzinach szukania błędów odkryłem przyczynę jednego z moich najbardziej irytujących błędów.Czy bezpieczne jest odblokowanie ampersand do wprowadzania danych przez użytkownika?
Kiedy użytkownicy wpisują mi wiadomość na mojej stronie, mogą ją tytułować za pomocą zwykłego tekstu i encji html.
Oznacza to, że w niektórych przypadkach użytkownicy będą wpisywać tytuły ze wspólnymi obrazami encji html, takimi jak ta twarz. (͡ ° ͜ʖ ͡ °).
Aby zapobiec wstrzykiwaniu html, używam htmlspecialchars(); na tytule i denerwująco przekształciłby obraz w jego format strony HTML po wyświetleniu na stronie później.
(͡° ͜ʖ ͡°)
zdałem sobie sprawę, problem tutaj było to, że tytuł był zakodowany jako powyższym przykładzie, a htmlspecialchar, jak robi to, co chciałem i wtrysk kodowanie możliwe html, było obrócenie ampersanda w podmiotach do
&.
Przez to, że nie uciekłem ze wszystkich amperandów i zmieniono je z powrotem na &, naprawiłem mój problem i twarz wyszła zgodnie z oczekiwaniami.
Jednak nie jestem pewien, czy jest to nadal bezpieczne przed złośliwym html. Czy bezpieczne jest dekodowanie ampersandów w tytułach przypisanych przez użytkownika? Jeśli nie, jak mogę rozwiązać ten problem?
Jeśli twoje obiekty są wyświetlane jako tekst, prawdopodobnie dwa razy wywołasz 'htmlspecialchars()'. –
@Marat. Kiedy POST pobierał wartość z wejścia, automatycznie kodował bardziej niejasne elementy, takie jak nos i usta twarzy, którą dostarczyłem. Jednak nie kodował on rzeczy takich jak cytaty lub ostre nawiasy. Więc to jest rzeczywiście mój problem, niektóre z encji są kodowane dwukrotnie. Niestety nie wiem, jak to naprawić, poza ponownym kodowaniem. Oto dlaczego zadałem to pytanie, aby sprawdzić, czy jest lepszy sposób. – Clint
Takie automatyczne wyprowadzanie po stronie przeglądarki może wystąpić, jeśli strona zawierająca formularz używa przestarzałego jednobajtowego kodowania, takiego jak Windows-1252. Czy na pewno używasz Unicode (w szczególności UTF-8)? ;-) –