2016-07-26 7 views
0

Ich habe eine Webseite, die Daten aus einer Datenbank liest und dann anzeigt, aber ich habe gerade ein Problem mit Daten gefunden, die HTML darin enthalten könnten.Sanitizing HTML-Code

In meiner Datenbank habe ich die folgenden drei Einträge:

Bob

Jill

<button onClick="alert('hi')">Click me!</button> 

Jetzt habe ich meine HTML-Seite, die die Daten erhält und zeigt sie an und hat ein Click-Ereignis auf jeder Eintrag, also ein Beispiel wäre:

Mein Code entfernt e scape Zeichen so < wird &lt;

Das funktioniert gut, bis ich auf den letzten Eintrag bekommen, und ich am Ende mit:

<div onClick="DoSomething()"> 
    <a>&lt;button onClick="alert('hi')"&gt;Click me too!&lt;/button&gt;</a> 
</div> 

Es erwartet Displays so würde ich sehen:

<button onClick="alert('hi')">Click me too!</button> 

aber Es wird auch darauf hingewiesen, dass ein Klickereignis "hi" anzeigen soll.

Weiß jemand, wie ich das onClick sicher stoppen kann, das durch den Namen definiert wird, aber noch mein onClick-Ereignis auf dem umgebenden div.

Ich kann die Namen nicht beschränken, die der Datenbank hinzugefügt werden können.

+0

Sie können Ihre App für XSS-Angriffe öffnen, wenn Sie zulassen, dass solche Dinge nicht bereinigt werden. jemand könnte theoretisch Code injizieren und es ausführen – vsync

+0

Der schlechte Name, der das HTML enthält, existiert derzeit nicht, könnte aber. Dies ist ein extremes Beispiel, aber ich habe keine Möglichkeit, die Namen zu beschränken, die in die Datenbank eingegeben werden können (dies ist eine Legacy-Desktop-App, die älter als 15 Jahre ist und nun eine Web-Schnittstelle hat). Also ja, ich muss sanieren, aber ich weiß nicht, wie ich das machen kann, aber den Namen behalten, den der Benutzer eingegeben hat. Ich dachte, wenn ich die Escape-Charaktere änderte, würde es das tun. – sbarnby71

+0

@ sbarnby71 Wenn Sie PHP verwenden, können Sie Striptags verwenden: http://php.net/manual/pt_BR/function.strip-tags.php. Für andere Sprachen ist die Logik dieselbe. – user3753202

Antwort

0

Dargestellt, was passiert ist. Wenn ich erstellen, um die HTML-Elemente, die die Itemnamen halte ich ein benutzerdefiniertes Attribut war die Schaffung darauf DispName und setzen den Namen des Elements darin genannt, zB:

<div onclick="DoSomething()" DispName="&lt;button onClick="alert('hi')"&gt;Click me too!&lt;/button&gt;"> 
    <div>&lt;button onClick="alert('hi')"&gt;Click me too!&lt;/button&gt;</div> 
<div> 

Also, wenn meine Onclick-Ereignis aufgerufen wurde würde ich .getAttribute ("DispName") für die Entität, auf die geklickt wurde, und angenommen, dass ich den Wert < erhalten würde. button onClick = "alert ('hi')" > Klicken Sie mich auch an! </button > zurück, aber was ich zurückbekam, war der unsanitisierte Text von <button onClick="alert('hi')">Click me too!</button>.

Ich denke, was passiert ist, sobald ich meine HTML-Elemente zum DOM hinzufügen, ist das Attribut DispName vom DOM unanitisiert. Das bereinigte Skript, das nicht in einem Attribut enthalten ist, bleibt wie erwartet erhalten.

Nicht sicher, ob jemand dies bestätigen kann, aber jetzt weiß ich, warum ich dann das Rogue-Skript ausführen, wenn ich versuche, den Wert in DispName zu verwenden.

Verwandte Themen