wake-up-neo.com

HTML-Eingabewert desinfizieren

Müssen Sie außer den Anführungszeichen (") noch etwas in (") innerhalb von konvertieren:

<input type="text" value="$var">

Ich persönlich sehe nicht, wie man das ohne " on*=... ausbrechen kann.

Ist das richtig?

Edit : Offensichtlich halten manche Leute meine Frage für zu vage;

<input type="text" value="<script>alert(0)</script>"> wird nicht ausgeführt. Daher ist es unmöglich, die Verwendung ohne " zu unterbrechen.

Ist das richtig?

15
KaekeaSchmear

Es gibt wirklich zwei Fragen, die Sie stellen (oder die zumindest interpretiert werden können):

  1. Kann das in Anführungszeichen gesetzte value -Attribut von input[type="text"] Eingefügt werden, wenn Anführungszeichen nicht zulässig sind?

  2. Kann ein beliebiges Attribut eines Elements in Anführungszeichen eingefügt werden, wenn Anführungszeichen nicht zulässig sind?.

Die zweite wird trivial durch Folgendes demonstriert:

<a href="javascript:alert(1234);">Foo</a>

Oder

<div onmousemove="alert(123);">...

Das erste ist etwas komplizierter.

HTML5

Nach der HTML5-Spezifikation :

Attributwerte sind eine Mischung aus Text- und Zeichenreferenzen, mit der zusätzlichen Einschränkung, dass der Text kein mehrdeutiges kaufmännisches Und enthalten darf.

Was in zitierten Attributen weiter verfeinert wird, um:

Der Attributname, gefolgt von null oder mehr Leerzeichen, gefolgt von einem einzelnen U + 003D EQUALS SIGN-Zeichen, gefolgt von null oder mehr Leerzeichen, gefolgt von einem einzelnen "" "(U + 0022) -Zeichen, gefolgt vom Attributwert , der zusätzlich zu den oben angegebenen Anforderungen für Attributwerte keine wörtlichen U + 0022-Anführungszeichen (") und schließlich ein zweites einzelnes" "" (U + 0022) -Zeichen enthalten darf.

Kurz gesagt, jedes Zeichen außer einem "mehrdeutigen kaufmännischen Und" (&[a-zA-Z0-9]+;, Wenn das Ergebnis keine gültige Zeichenreferenz ist) und ein Anführungszeichen sind innerhalb eines Attributs gültig.

HTML 4.01

HTML 4.01 ist in Bezug auf die Syntax weniger aussagekräftig als HTML5 (einer der Gründe, warum HTML5 ursprünglich erstellt wurde). Es tut jedoch sagen Sie dies :

Wenn es sich bei Skript- oder Stildaten um den Wert eines Attributs handelt (entweder um einen Stil oder um die eigentlichen Ereignisattribute), sollten Autoren das Vorkommen des abgrenzenden einfachen oder doppelten Anführungszeichens innerhalb des Werts gemäß der Konvention der Skript- oder Stilsprache umgehen. Autoren sollten sich auch von "&" fernhalten, wenn das "&" nicht der Anfang einer Zeichenreferenz sein soll.

Beachten Sie, dass dies sagt, was ein Autor tun soll, nicht was ein Parser tun soll. Ein Parser könnte also eine ungültige Eingabe technisch akzeptieren oder ablehnen (oder für gültig erklären).

XML 1.0

Das XML 1.0 Spec definiert ein Attribut als:

Attribut :: = Name Eq AttValue

wobei AttValue definiert ist als:

AttValue :: = '"' ([^ <&"] | Referenz) * '"' |" '"([^ <&'] | Referenz) *" '"

Das & Ähnelt dem Konzept eines "mehrdeutigen Et-Zeichens" aus HTML5, sagt jedoch im Grunde "jedes nicht codierte Et-Zeichen".

Beachten Sie jedoch, dass < Von Attributwerten ausdrücklich abgelehnt wird.

Während HTML5 dies zulässt, lehnt XML1.0 dies explizit ab.

Was heißt das

Dies bedeutet, dass für ein kompatibler und fehlerfreier Parser HTML5 die Zeichen < In einem Attribut ignoriert und XML einen Fehler verursacht.

Dies bedeutet auch, dass sich HTML 4.01 für einen kompatiblen und fehlerfreien Parser auf nicht spezifizierte und möglicherweise ungewöhnliche Weise verhält (da die Spezifikation das Verhalten nicht detailliert angibt).

Und hier kommt es auf den Kern des Problems an. In der Vergangenheit war HTML eine so lose Spezifikation, dass jeder Browser etwas andere Regeln für den Umgang mit fehlerhaftem HTML hatte. Jeder würde versuchen, es zu "reparieren" oder zu "interpretieren", was Sie meinten. Das bedeutet, dass ein HTML5-kompatibler Browser die JS in <input type="text" value="<script>alert(0)</script>"> nicht ausführen würde, ein HTML 4.01-kompatibler Browser jedoch nicht. Und es gibt nichts zu sagen, dass es im XML- oder HTML5-Parser einen Fehler gibt, der zur Ausführung führt (obwohl dies ein ziemlich schwerwiegendes Problem wäre).

DASS ist der Grund, warum OWASP (und die meisten Sicherheitsexperten) empfehlen, entweder alle nicht alphanumerischen Zeichen oder &<" innerhalb eines Attributwerts zu kodieren . Das kostet nichts, nur die zusätzliche Sicherheit, zu wissen wie der Parser des Browsers den Wert interpretiert.

Haben Sie haben zu? Nein. Eine eingehende Verteidigung legt jedoch nahe, dass sich der potenzielle Nutzen lohnt, da dies keine Kosten verursacht.

24
ircmaxell

Wenn Benutzer Daten übermitteln, müssen Sie sicherstellen, dass sie die gewünschten Informationen bereitgestellt haben. 

Wenn Sie beispielsweise eine Nummer erwarten, stellen Sie sicher, dass die übermittelten Daten eine Nummer sind . Sie können auch Umwandeln von Benutzerdaten in andere Typen . Alles, was übermittelt wird, wird anfangs wie eine Zeichenfolge behandelt. Wenn Sie also aus bekannten numerischen Daten eine Ganzzahl oder einen Float machen, wird die Desinfektion schnell und schmerzlos.

Sie müssen sicherstellen, dass Felder, die keinen HTML-Inhalt enthalten dürfen, tatsächlich keinen HTML-Code enthalten. Es gibt verschiedene Möglichkeiten, wie Sie mit diesem Problem umgehen können.

Sie können versuchen, die HTML-Eingabe mit htmlspecialchars zu umgehen. Sie sollten htmlentities nicht zum Neutralisieren von HTML verwenden, da es auch die Kodierung von Akzenten und anderen Zeichen ausführt, von denen es der Meinung ist, dass sie auch kodiert werden müssen.

Sie können versuchen, jeden möglichen HTML-Code zu entfernen. strip_tags ist schnell und einfach, aber auch schlampig. HTML Purifier erledigt eine wesentlich gründlichere Arbeit, indem er den gesamten HTML-Code entfernt und eine selektive Whitelist von Tags und Attributen durchlässt.

Sie können die OWASP PHP Filter verwenden. Sie sind wirklich einfach zu bedienen und effektiv.

Sie können die Filtererweiterung verwenden, die eine umfassende Methode zur Bereinigung von Benutzereingaben bietet. 

Beispiele

Der folgende Code entfernt alle HTML-Tags aus einer Zeichenfolge:

$string = "<h1>Hello, World!</h1>";
$new_string = filter_var($string, FILTER_SANITIZE_STRING);
// $new_string is now "Hello, World!"

Der folgende Code stellt sicher, dass der Wert der Variablen eine gültige IP-Adresse ist:

$ip = "127.0.0.1";
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
// $valid_ip is TRUE

$ip = "127.0.1.1.1.1";
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
// $valid_ip is FALSE

E-Mail-Adressen desinfizieren und validieren:

<?php
$a = '[email protected]';
$b = 'bogus - at - example dot org';
$c = '([email protected])';

$sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) {
    echo "This (a) sanitized email address is considered valid.\n";
}

$sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) {
    echo "This sanitized email address is considered valid.";
} else {
    echo "This (b) sanitized email address is considered invalid.\n";
}

$sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) {
    echo "This (c) sanitized email address is considered valid.\n";
    echo "Before: $c\n";
    echo "After:  $sanitized_c\n";    
}
?>

Referenz:

Was sind die besten PHP Eingabe-Bereinigungsfunktionen?

http://code.tutsplus.com/tutorials/sanitize-and-validate-data-with-php-filters--net-2595

https://security.stackexchange.com/q/42498/71827

http://php.net/manual/de/filter.examples.sanitization.php

5

Ich glaube, die Person bezieht sich auf Cross-Site-Scripting-Angriffe. Sie haben dies mit php, security und xss gekennzeichnet

nehmen Sie zum Beispiel 

<input type="text" value=""><script>alert(0)</script><"">

Der obige Code führt den Alert-Box-Code aus.

<?php $var= "\"><script>alert(0)</script><\""; ?>
<input type="text" value="<?php echo $var ?>">

Dadurch wird auch die Alert-Box ausgeführt. Um dieses Problem zu lösen, müssen Sie es entkommen ", <> und einige weitere, um sicher zu gehen. PHP hat einige Funktionen, die es wert sind, untersucht zu werden, und jeder hat seine Ups und Downs!

htmlentities() - Convert all applicable characters to HTML entities
htmlspecialchars() - Convert special characters to HTML entities
get_html_translation_table() - Returns the translation table used by  htmlspecialchars and htmlentities
urldecode() - Decodes URL-encoded string

Sie müssen aufpassen, dass Sie eine Variable übergeben, und es gibt Möglichkeiten, Fehler zu erzeugen und zu bewirken, dass diese ausbricht. Am besten stellen Sie sicher, dass die Daten im Fehlerfall nicht ausführbar formatiert werden. Aber Sie haben Recht, wenn es sich nicht um Zitate handelt, die Sie nicht durchbrechen können, aber es gibt Wege, wie Sie oder ich es an diesem Punkt nicht verstehen, die dies zulassen.

3
webternals

Wenn Ihre Frage "Welche Arten von XSS-Angriffen sind möglich" ist, sollten Sie sie besser googeln. Ich werde nur einige Beispiele nennen, warum Sie Ihre Eingaben desinfizieren sollten

  • Wenn die Eingabe von echo '<input type="text" value="$var">' generiert wird, unterbricht sie der einfache '.

  • Wenn die Eingabe auf der Seite PHP reiner HTML-Code ist, wird sie durch value=<?php deadly_php_script ?> abgebrochen

  • Wenn dies eine einfache HTML-Eingabe in einer HTML-Datei ist, sollte das Konvertieren von doppelten Anführungszeichen ausreichend sein. 

Das Konvertieren anderer Sonderzeichen (wie <, > usw.) ist jedoch eine gute Vorgehensweise. Eingaben werden gemacht, um Informationen einzugeben, die auf dem Server\in einer anderen Seite\script gespeichert werden würden. Sie müssen also prüfen, was diese Dateien beschädigen könnte. Nehmen wir an, wir haben dieses Setup:

index.html:

<form method=post action=getinput.php> <input type="text" name="xss"> <input type="submit"></form>

getinput.php:

echo $_POST['xss'];

Der Eingabewert ;your_deadly_php_script unterbricht sie vollständig (in diesem Fall können Sie auch serverseitig bereinigen)

Wenn das nicht genug ist - geben Sie weitere Informationen zu Ihrer Frage an, und fügen Sie weitere Beispiele für Ihren Code hinzu.

3
bigbobr

$ var = "><script>alert(0);</script> würde funktionieren ... Wenn Sie die Anführungszeichen schließen können, können Sie das Tag schließen und ein anderes öffnen.

0
mathieu