2016-09-13 7 views
2

Ich arbeite derzeit auf einer Seite, wo ich den Benutzer benötigen, um mehrere Variablen einzugeben, die bei der Übergabe dann auf der ganzen Seite angezeigt werden. .XSS Javascript, Exploit Überprüfung

Problem ist, muss es 100% sicher Code sein, und während ich bin ok PDO/MySQL etc. mit Hilfe von Javascript nicht etwas, das ich in sehr fließend bin

Im Moment habe ich folgendes:

<script language="JavaScript"> 
function showInput() { 
    document.getElementById('var1').innerText = 
       document.getElementById("user_var1").value; 
    document.getElementById('var2').innerText = 
       document.getElementById("user_var2").value; 
} 
</script> 

mit dem html

<form> 
    your variable 1 is = <input type="text" name="message" id="user_var1"><br /> 
    your variable 2 is = <input type="text" name="message" id="user_var2"><br /> 
</form> 
<input type="submit" onclick="showInput();"> 
    <p>var1 = <span id='var1'></span></p> 
    <p>var2 = <span id='var2'></span></p> 

Von dem, was ich sagen kann, ".innerText" verwenden, sollten alle html etc stoppen verwendet werden, und ich habe mit

getestet
<script>alert(document.cookie);</script> 

was dazu führt, dass oben nur so gedruckt wird, wie es ist (nicht ausgeführt).

z.B.

your variable 1 is = <script>alert(document.cookie);</script> 

Gibt es noch etwas, das Sie empfehlen, um sicherzustellen, dass es sicher ist (XSS oder anders)? Nur Zeichen, die eingegeben werden sollten müssen/und AZ 0-9

Vielen Dank im Voraus :)

bearbeiten

Nur um zu klären, ist der einzige Code, was oben ist, wird die Seite nicht ziehen Daten aus einer Datenbank etc (was Sie oben sehen, ist praktisch die vollständige PHP-Seite, nur fehlt die HTML-Kopf Körper Tags usw.).

+0

was meinst du mit '100% sicherem Code' JS kann nicht sicher sein, es läuft auf einem Rechner, über den du keine Kontrolle hast. Die einfachste "Attacke" wäre hier das Überschreiben von 'showInput' mit dem, was ich will, oder wenn ich das nur deaktivieren möchte, entferne die IDs von den Knoten, sortiere mit der Schaltfläche oder ändere den Clickhandler auf der Schaltfläche. Und das fängt gerade erst an, also was meinst du mit Sicherheit? – Thomas

+0

Zugegeben 100% sicher war wahrscheinlich der falsche Begriff zu verwenden. Damit meine ich, der Benutzer wäre nicht in der Lage, etwas in das Hosting zu injizieren oder hinzuzufügen oder es zum Durchlaufen eines anderen Verzeichnisses zu verwenden (z. B. unter Verwendung von ../../../). z.B. Bei einigen Seiten, die mysql verwenden, musste ich zu PDO usw. wechseln, um die Injektionen zu stoppen. – user6796243

+0

Das ist, was ich sage, der Benutzer muss nur F12 im Browser drücken und kann so ziemlich alles ausführen * was er/sie will * in Ihrer Seite. Wie 'showInput = null;' oder 'document.getElementById ('var1'). InnerHTML =" ... was auch immer ... "' oder ... Sie haben (fast) überhaupt keine Kontrolle. – Thomas

Antwort

0

Dort ist keine Sicherheitslücke hier (lesen Sie bitte vor downvote).

Nur um zu klären, ist der einzige Code ist, was oben ist, die Seite nicht Ziehen von Daten aus einer Datenbank usw. (was Sie oben sehen, ist praktisch die volle PHP-Seite, fehlt nur die HTML-Kopf Body-Tags usw.).

<input type="text" name="message" id="user_var1"> 
<input type="text" name="message" id="user_var2"> 

da kein Code vorhanden, die diese beiden Felder auffüllt:

daher die beiden folgenden Felder können nicht durch irgendetwas anderes als den aktuellen Benutzer aufgefüllt werden.

Die beiden DOM-Elemente, die von Code aufgefüllt werden, sind wie folgt:

<span id='var1'></span> 
<span id='var2'></span> 

Der Code, der tut dies ist

document.getElementById('var1').innerText = 
       document.getElementById("user_var1").value; 
document.getElementById('var2').innerText = 
       document.getElementById("user_var2").value; 

Es ist die Nicht-Standard-innerText statt textContent verwenden, jedoch innerText setzt den Textinhalt anstelle des HTML-Inhalts und verhindert, dass der Browser Tags oder Skripts rendern kann.

Aber selbst wenn es stattdessen die innerHTML-Eigenschaft festlegen würde, könnte der Benutzer sich selbst angreifen (genauso wie sie Entwicklerwerkzeuge in ihrem Browser öffnen würden).

Im Interesse des korrekten Funktionsverhaltens und der Internetstandards würde ich jedoch textContent statt innerText oder innerHTML verwenden.

Beachten Sie, dass

<script>alert(document.cookie);</script> 

sowieso nicht funktionieren würde, wäre es

<svg onload="alert(document.cookie)" /> 

oder ähnlich sein. HTML5 gibt an, dass ein über innerHTML eingefügtes Tag <script> nicht ausgeführt werden soll.

+0

:) Vielen Dank für Ihre Eingabe. War wirklich verwirrt darüber, wie es sicher sein könnte, wenn die Bearbeitung über "inspect element" ein Sicherheitsrisiko darstellte (seit seiner Client-Seite). – user6796243

+0

Bitte beachten Sie, dass diese Antwort teilweise falsch ist. Während der Code in der Frage in der Tat nicht anfällig ist, wäre es, wenn es innerHTML verwendet. Aus Sicht von XSS spielt es keine Rolle, wie Sie Javascript einfügen können. Wenn es möglich ist, ist die Seite anfällig. Sie können argumentieren, dass das Risiko kleiner ist (es ist tatsächlich), aber es ist dennoch anfällig für DOM XSS. Nur für einen Beispielangriff für solch ein Szenario: Ein Benutzer kann etwas in ein Feld eingeben, das auf die Seite dom kopiert wird, genau wie oben, aber mit innerHTML. Was passiert, wenn ein Kollege "hilfreich" einen Teil der einzufügenden Daten versendet? –

2

Nur basierend auf dem, was Sie oben tun, werden Sie nicht XSS haben. innerText wird richtiges Entkommen tun.

Um Ihre Website 100% sicher zu sein, ist eine große Aufgabe. Einige der Dinge, die ich mir ansehen würde, betreiben Ihre Website über HTTPS mit HSTS, um zu verhindern, dass ein Angreifer auf Netzwerkebene die Site manipuliert, parameterizing your SQL queries, indem Sie bei der Formularübermittlung CSRF Tokens hinzufügen.

Speziell in Bezug auf XSS ist einer der häufigsten Wege, Menschen XSS'd bekommen, weil sie unsichere DOM-Manipulation durchführen. Wenn Sie sich Sorgen um die Sicherheit machen, empfehle ich Ihnen, JS auf React zu portieren, da Sie ein "virtuelles DOM" manipulieren, das es React ermöglicht, kontextsensitives Escaping durchzuführen. Es entlastet auch den Entwickler von der richtigen Flucht.

Ein schneller Sicherheitsgewinn ist das Hinzufügen einer CSP policy zu Ihrer Site und das Setzen der script-src Direktive auf self. Eine CSP-Richtlinie legt den Kontext fest, in dem bestimmte Inhalte auf Ihrer Website ausgeführt werden können. Wenn also beispielsweise script-src auf self gesetzt ist (was bedeutet, dass Ihr JS in das src-Attribut eines <script>-Tags geladen wird, das auf dieselbe Domäne verweist, in der der HTML-Code geliefert wird und nicht inline auf der Seite), tut jemand XSS (wahrscheinlich *) nicht laufen.

Dies sind nur einige Beispiele für verschiedene Sicherheitslösungen, die Ihnen zur Verfügung stehen, sowie eine kurze Einführung in die Sicherheitsmethoden. Ich bin froh, dass Sie die Sicherheit ernst nehmen!

* Es gibt einige Umstände (wenn Sie beispielsweise Ihre Skripte dynamisch generieren), in denen der Code ausgeführt werden kann.

+0

Danke dafür. Die Zeit wird ein Faktor dafür sein und es ist offensichtlich, dass ich viel lesen muss. Eine Option, über die ich nachgedacht habe, war die Verwendung eines iframe und der obige Code auf einer anderen Hosting-Seite + Domain. Von dem, was ich sehen kann, sollte jeder Exploit dann an das neue Hosting-Paket gebunden sein (wodurch der Schaden begrenzt wird). – user6796243

+0

Absolut, so dass die gleiche Herkunftsrichtlinie (https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy) als Verteidigung verwendet wird, was (zum größten Teil) gut ist. solange es keine sensiblen Informationen auf der iframe-Domain gibt – winhowes

+1

Danke :) Grundsätzlich hätte das neue Hosting-Paket nur den obigen Code (nichts anderes). – user6796243