XSS - (CSS) zagrożenie ze strony użytkowników.

Modyfikacja: 2012-02-11

Ataki typu XSS (CSS - Cross-site scripting) są częstą zmorą serwisów internetowych. Polegają one na podobnej zasadzie co SQL injection, tzn. na przemyceniu do bazy danych niepożądanego kodu, który będzie się wykonywał po załadowaniu strony u użytkowników końcowych.

Pisząc serwisy internetowe należy zwrócić uwagę czy podawane dane przez użytkownika są należycie sprawdzane, czy wartości jakie wpisuje są zgodne z założeniami strony WWW.

Jeżeli użytkownik powinien mieć możliwości wpisywania dowolnego ciągu znaków, to należy zadbać o usuwanie lub zamienianie zarezerwowanych znaków dla (X)HTML i javascript. W większości przypadków, serwisy wymagają zgodności podawanej treści przez użytkownika z późniejszym jej wyświetleniem. Znaki specjalne, są to zarezerwowane elementy dla języka (X)HTML, należą do nich (ostatnie dwa dodałem dla pewności):

Znak specjalny Numerycznie Nazwą
" &#34 "
& & &
' ' '
< &#60; &lt;
> &#62; &gt;
/ &#47; &frasl;
\ &#92;

Korzystając z języków umożliwiających tworzenie serwisów internetowych (PHP, Java) warto zwrócić uwagę na wbudowane funkcję zamieniające znaki specjalne na wpisy w postaci numerycznej lub „nazewniczej”. W przypadkach, w których jest to możliwe i nie zagraża to prawidłowemu działaniu strony WWW, odpowiednie sprawdzenie danych powinno być wykonane po stronie użytkownika np.: strona online sprawdzająca tekst w poszukiwaniu znaków specjalnych i zamieniająca je na odpowiedniki numeryczne lub „nazewnicze”.

Poniżej zamieszczam krótki skrypt który może zostać użyty w celu usuwania znaków specjalnych zarezerwowanych dla języka (X)HTML.

Drukuj Zaznacz kod
function changeReservedChar(idGet){
	var text = document.getElementById(idGet).value;
	
	text = text.replace(/&/g, "&#38;");
	text = text.replace(/"/g, "&#34;");
	text = text.replace(/'/g, "&#39;");
	text = text.replace(/\//g, "&#47;");
	text = text.replace(/\\/g, "&#92;");
	text = text.replace(/</g, "&#60;");
	text = text.replace(/>/g, "&#62;");
	
	return text;
}