Najlepszy sposób radzenia sobie z bezpieczeństwem i unikania XSS z adresami URL wprowadzonymi przez użytkownika

Mamy aplikację o wysokim poziomie bezpieczeństwa i chcemy umożliwić użytkownikom wprowadzanie adresów URL, które inni użytkownicy będą widzieć.

Wprowadza to wysokie ryzyko hakowania XSS - użytkownik może potencjalnie wprowadzić javascript, który inny użytkownik kończy się wykonaniem. Ponieważ przechowujemy poufne dane, ważne jest, aby nigdy do tego nie doszło.

Jakie są najlepsze praktyki w radzeniu sobie z tym? Czy jakakolwiek biała lista zabezpieczeń lub sam wzorzec ucieczki jest wystarczająco dobry?

Wszelkie rady dotyczące postępowania z przekierowaniami ("to link wychodzi poza naszą witrynę " komunikat na stronie ostrzegawczej przed kliknięciem linku, na przykład)

Czy jest jakiś argument za tym, aby w ogóle nie wspierać linków wprowadzanych przez użytkowników?


Wyjaśnienie:

W zasadzie nasi użytkownicy chcą wprowadzić:

Stackoverflow.com

I niech wyświetli to innemu użytkownikowi:

<a href="http://stackoverflow.com">stackoverflow.com</a>

Naprawdę martwię się o to, że używają tego w hack XSS. Tzn. wpisują:

Alert ('hacked!');

Więc inni użytkownicy dostają ten link:

<a href="alert('hacked!');">stackoverflow.com</a>

Mój przykład jest tylko po to, aby wyjaśnić ryzyko - jestem świadomy, że javascript i adresy URL to różne rzeczy, ale pozwalając im wprowadzić te ostatnie, mogą być w stanie wykonać te pierwsze.

Zdziwiłbyś się, ile stron możesz złamać tą sztuczką-HTML jest jeszcze gorszy. Jeśli wiedzą, aby radzić sobie z linkami, czy wiedzą również, aby dezynfekować <iframe>, <img> i sprytne referencje CSS?

Pracuję w środowisku o wysokim poziomie bezpieczeństwa - pojedynczy hack XSS może to spowodować dla nas bardzo duże straty. Cieszę się, że mogłem stworzyć Regex (lub użyć jednej z doskonałych sugestii do tej pory), które mogłyby wykluczyć wszystko, co mogłem myśleć, ale czy to wystarczy?

Author: Keith, 2008-10-15

8 answers

Jeśli uważasz, że Url nie może zawierać kodu, pomyśl jeszcze raz!

Https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

Przeczytaj to i zapłakaj.

Oto Jak to zrobimy na Stack Overflow:

/// <summary>
/// returns "safe" URL, stripping anything outside normal charsets for URL
/// </summary>
public static string SanitizeUrl(string url)
{
    return Regex.Replace(url, @"[^-A-Za-z0-9+&@#/%?=~_|!:,.;\(\)]", "");
}
 46
Author: Jeff Atwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-16 12:26:16

Proces renderowania linku "bezpiecznego" powinien przejść trzy lub cztery kroki:

  • Unescape / re-encode the string you ' ve been given (RSnake udokumentował wiele trików w http://ha.ckers.org/xss.html które używają kodowania ucieczki i UTF).
  • Wyczyść łącze: wyrażenia regularne są dobrym początkiem - upewnij się, że obcinasz łańcuch lub wyrzucasz go, jeśli zawiera " (lub cokolwiek, czego używasz, aby zamknąć atrybuty w wyjściu); jeśli robisz łącza tylko jako odniesienia do innych informacji można również wymusić protokół na końcu tego procesu-jeśli część przed pierwszym dwukropkiem nie jest "http" lub "https", dodaj "http: / /" do początku. Pozwala to na tworzenie użytecznych linków z niekompletnego wejścia, gdy użytkownik wpisuje się w przeglądarkę i daje ostatnią szansę na potknięcie się, niezależnie od tego, co ktoś próbował się wkraść.
  • Sprawdź, czy wynik jest dobrze uformowany URL (protokół: / / host.domena [: port] [/ścieżka] [/[plik]] [?queryField=queryValue] [#anchor]).
  • ewentualnie sprawdź wynik na czarnej liście witryny lub spróbuj pobrać go za pomocą jakiegoś programu do sprawdzania złośliwego oprogramowania.

Jeśli Bezpieczeństwo jest priorytetem, mam nadzieję, że użytkownicy wybaczą trochę paranoi w tym procesie, nawet jeśli skończy się to wyrzuceniem niektórych bezpiecznych linków.

 12
Author: Bell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-16 20:08:37

Użyj biblioteki, takiej jak OWASP-ESAPI API:

Czytaj po:

Na przykład:

$url = "http://stackoverflow.com"; // e.g., $_GET["user-homepage"];
$esapi = new ESAPI( "/etc/php5/esapi/ESAPI.xml" ); // Modified copy of ESAPI.xml
$sanitizer = ESAPI::getSanitizer();
$sanitized_url = $sanitizer->getSanitizedURL( "user-homepage", $url );

Innym przykładem jest użycie wbudowanej funkcji. Funkcja PHP filter_var jest przykładem:

$url = "http://stackoverflow.com"; // e.g., $_GET["user-homepage"];
$sanitized_url = filter_var($url, FILTER_SANITIZE_URL);

Za pomocą filter_var pozwala na wywołania javascript i filtruje schematy, które nie są ani http ani https. Korzystanie z OWASP ESAPI Sanitizer jest prawdopodobnie najlepszą opcją.

Jeszcze jeden przykład to kod z WordPress:

Dodatkowo, ponieważ nie ma sposobu, aby dowiedzieć się, gdzie linki URL (tj. może to być poprawny adres URL, ale zawartość adresu URL może być złośliwa), Google ma Bezpieczne przeglądanie API można wywołanie:

Wgrywanie własnego regex ' u do kanalizacji jest problematyczne z kilku powodów:

  • jeśli nie jesteś Jon Skeet, kod będzie zawierał błędy.
  • istniejące interfejsy API mają za sobą wiele godzin przeglądu i testowania.
  • istniejące interfejsy API weryfikujące adres URL uwzględniają internacjonalizację.
  • istniejące interfejsy API będą aktualizowane wraz z nowymi standardy.

Inne kwestie do rozważenia:

  • jakie programy zezwalasz (są file:/// i telnet:// akceptowalne)?
  • jakie ograniczenia chcesz umieścić na zawartości adresu URL (czy URL złośliwego oprogramowania jest akceptowalny)?
 8
Author: Dave Jarvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-01 22:10:20

Po prostu HTMLEncode linki, gdy je wypisujesz. Upewnij się, że nie zezwalasz na javascript: linki. (Najlepiej mieć białą listę akceptowanych protokołów, np. http, https i mailto.)

 3
Author: Patrick McElhaney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-19 21:14:40

Nie podajesz języka aplikacji, wtedy zakładam ASP.NET do tego możesz użyć Microsoft Anti-Cross Site Scripting Library

Jest bardzo łatwy w użyciu, wystarczy tylko include i tyle:)

Skoro już jesteś w temacie, dlaczego nie przeczytać wytycznych dotyczących projektowania bezpiecznych aplikacji internetowych

Jeśli w jakimkolwiek innym języku.... jeśli istnieje biblioteka dla ASP.NET, musi być dostępna również dla innych języków (PHP, Python, ROR, etc)

 3
Author: balexandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-15 19:04:22

A może nie wyświetlać ich jako linka? Po prostu użyj tekstu.

W połączeniu z ostrzeżeniem, aby postępować na własne ryzyko może wystarczyć.

Dodawanie - Zobacz także Czy powinienem wyczyścić znaczniki HTML dla hostowanego CMS ' a? do dyskusji na temat dezynfekcji wejścia użytkownika

 1
Author: warren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:26

Możesz użyć kodu szesnastkowego, aby przekonwertować cały adres URL i wysłać go na serwer. W ten sposób klient nie zrozumiałby treści na pierwszy rzut oka. Po przeczytaniu zawartości możesz odszyfrować adres URL zawartości = ? i wysłać go do przeglądarki.

 -1
Author: Shashi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-26 08:14:19

Zezwalanie na adres URL i zezwalanie na JavaScript to dwie różne rzeczy.

 -7
Author: Nick Stinemates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-15 18:48:21