Der beste Weg, die Sicherheit in der Handhabung und vermeiden XSS mit Benutzer eingegebenen URLs

StackOverflow https://stackoverflow.com/questions/205923

Frage

Wir haben eine hohe Sicherheits-Anwendung, und wir wollen, damit die Benutzer URLs einzugeben, dass andere Benutzer sehen.

Dies stellt ein hohes Risiko für XSS-Hacks - ein Benutzer möglicherweise Javascript eingeben könnte, dass ein anderer Benutzer auf die Ausführung endet. Da wir sensible Daten halten ist es wichtig, dass dies geschieht nie.

Was sind die besten Praktiken mit diesem im Umgang? Ist jede Sicherheit Black- oder White Flucht Muster allein gut genug?

Jede Beratung mit Umleitungen über den Umgang ( „Link geht außerhalb unserer Seite“ Nachricht auf einer Warnseite, bevor Sie den Link, zum Beispiel)

Gibt es ein Argument für nicht vom Benutzer eingegebenen Links überhaupt unterstützen?


Zur Verdeutlichung:

Im Grunde unserer Benutzer eingeben möchten:

  

stackoverflow.com

Und haben es Ausgang an einen anderen Benutzer:

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

Was mache ich mir Sorgen wirklich ist sie dieser Hack in einem XSS verwenden. D. h sie Eingang:

  

alert ( 'gehackt!');

So werden andere Benutzer erhalten auf diesen Link:

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

Mein Beispiel ist nur das Risiko zu erklären. - Ich bin mir sehr wohl bewusst, dass Javascript und URLs sind verschiedene Dinge, aber von ihnen Eingang letztere lassen können sie in der Lage, die ehemalige ausführen

Sie würden staunen, wie viele Websites, die Sie mit diesem Trick brechen können - HTML ist noch schlimmer. Wenn sie mit Links zu beschäftigen wissen wissen sie auch <iframe>, <img> und clevere CSS Verweise auf sanieren?

Ich bin in einer Hochsicherheitsumgebung arbeiten - eine einzige XSS Hack in sehr hohen Verlusten für uns zur Folge haben könnten. Ich bin glücklich, dass ich ein Regex produzieren könnte (oder eine der ausgezeichneten Vorschläge nutzen bisher), die alles ausschließen konnte, dass ich denken konnte, aber wäre das genug?

War es hilfreich?

Lösung

Wenn Sie URLs denke nicht, Code enthalten können, denken Sie noch einmal!

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

Lesen Sie das und weinen.

Hier ist, wie wir es auf Stack-Überlauf zu tun:

/// <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+&@#/%?=~_|!:,.;\(\)]", "");
}

Andere Tipps

Der Prozess einen Link „sicher“ von Rendering durch drei oder vier Schritte gehen sollte:

  • Unescape / Re-Encoding die Zeichenfolge, die Sie gegeben wurde (RSnake hat eine Reihe von Tricks an http://ha.ckers.org/xss.html , dass die Verwendung entkommen und UTF Codierungen).
  • Reinigen Sie den Link oben: Regexes einen guten Start sind - stellen Sie sicher, dass die Zeichenfolge oder werfen es weg zu kürzen, wenn es sich um eine "enthält (oder was auch immer Sie die Attribute in der Ausgabe schließen verwenden); Wenn Sie die Links tun nur als Verweise auf andere Informationen, die Sie auch das Protokoll am Ende dieses Prozesses erzwingen kann - wenn der Teil vor dem ersten Doppelpunkt ist nicht ‚http‘ oder ‚https‘ anhängen dann ‚http: //‘ an den Start auf diese Weise können Sie. nutzbare Links von unvollständiger Eingabe zu erstellen, wie ein Benutzer in einen Browser eingeben würde, und gibt Ihnen eine letzte Chance auf stolpern, was Unfug jemand in zu schleichen versucht.
  • Überprüfen Sie, ob das Ergebnis eine gut gebildete URL (Protokoll: //host.domain [: port] [/ Pfad] [/ [file]] [QUERYFIELD = Queryvalue?] [#Anchor])
  • .
  • Möglicherweise das Ergebnis gegen eine Website schwarze Liste überprüfen oder versuchen, es durch eine Art von Malware-Checker zu holen.

Wenn die Sicherheit ist eine Priorität Ich hoffe würde, dass die Benutzer ein bisschen Paranoia in diesem Verfahren vergeben würden, auch wenn es einige sicheren Links Wegwerfen nicht am Ende.

Verwenden Sie eine Bibliothek, wie OWASP-ESAPI API:

Lesen Sie die folgenden Schritte aus:

Zum Beispiel:

$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 );

Ein weiteres Beispiel ist eine integrierte Funktion nutzen zu können. PHP filter_var Funktion ist ein Beispiel:

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

Mit filter_var erlaubt JavaScript-Aufrufe und Schemata herausfiltert, die weder http noch https sind . Unter Verwendung der OWASP ESAPI Sanitizer ist wahrscheinlich die beste Option.

Ein weiteres Beispiel ist der Code von Wordpress :

, zusätzlich, da es keine Möglichkeit zu wissen, wo die URL-Links (dh, es könnte eine gültige URL sein, aber der Inhalt der URL könnte boshaft sein), Google hat ein sicheres Surfen API Sie anrufen können:

für Ihre eigenen regex Roll Hygiene ist aus mehreren Gründen problematisch:

  • Wenn Sie Jon Skeet sind, wird der Codefehler haben.
  • Vorhandene APIs haben viele Stunden Bewertung und Prüfung hinter sich.
  • Vorhandene URL-Validierung APIs betrachtet Internationalisierung.
  • Vorhandene APIs wird up-to-date mit neuen Standards gehalten werden.

Weitere Aspekte zu berücksichtigen:

  • Welche Systeme sind Sie erlauben (sind file:/// und telnet:// akzeptabel)?
  • Welche Einschränkungen sind Sie auf den Inhalt der URL platzieren möchten (sind Malware-URLs akzeptabel)?

Htmlencode nur noch die Links, wenn Sie ausgeben. Stellen Sie sicher, dass Sie nicht zulassen javascript: Links. (Am besten ist es eine weiße Liste von Protokollen zu haben, die angenommen werden, zum Beispiel http, https und mailto).

Sie geben nicht die Sprache Ihrer Anwendung, dann werde ich ASP.NET nehme an, und dafür können Sie die Microsoft Anti-Cross-Site-Scripting-Bibliothek

Es ist sehr einfach zu bedienen, alles, was Sie brauchen, ist ein gehören und das ist es:)

Während Sie auf das Thema, warum nicht eine Lese gegeben auf Entwurf Richtlinien für sichere Web-Anwendungen

Wenn eine andere Sprache .... wenn es eine Bibliothek für ASP.NET ist, hat für andere Art von Sprache auch verfügbar sein (PHP, Python, ROR, etc.)

Wie wäre es, sie als Link angezeigt wird? Verwenden Sie einfach den Text.

In Kombination mit einer Warnung auf Ihr eigenes Risiko fortfahren kann genug sein.

zusätzlich - auch unter Soll ich sanieren HTML Markup für eine gehostete CMS? für eine Diskussion über eine Benutzereingabe desinfizierenden

In meinem Projekt geschrieben in JavaScript verwende ich diese Regex als weiße Liste:

 url.match(/^((https?|ftp):\/\/|\.{0,2}\/)/)

Die einzige Einschränkung ist, dass Sie setzen müssen ./ vor für Dateien in demselben Verzeichnis, aber ich glaube, ich kann damit leben.

Für Pythonistas, versuchen Scrapy w3lib .

OWASP ESAPI pre-dates Python 2.7 und archiviert auf der heute nicht mehr existierend Google Code .

Sie können einen Hex-Code verwenden, um die gesamte URL zu konvertieren und auf Ihren Server zu senden. Auf diese Weise würde der Kunde nicht den Inhalt in dem ersten Blick verstehen. Nach dem Inhalt zu lesen, können Sie den Inhalt URL dekodieren =? und sie an den Browser senden.

Unter Berücksichtigung einer URL und damit JavaScript sind zwei verschiedene Dinge.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top