09.09.2010, 12:20 UTC+2

Sie sind nicht angemeldet.

  • Anmelden
  • Registrieren

center-pc.de

VisualCreations

Coder Youngstar

Beiträge: 393

Sprachen: C, VC# und PHP am Lernen; HTML/CSS

Themenstarter Themenstarter

1

10.03.2010, 12:00

Übersicht Sicherheitsvorkehrungen in Formularen

Hey Leute!

Was ich mit diesem sperrigen Titel meine, ist, dass es echt nett wäre, wenn ihr (damit meine ich die PHP-Cracks unter uns ^^) eine Übersicht erstellt, in der die Sicherheitsmaßnahmen für Formulare mit PHP erklärt werden.
Ich stelle mir das so vor, dass der Name der Funktion mit kurzer Berschreibung und einem wirklichen sinnvollen und verständlichen Beispiel angegeben wird.

Als Beispiel fällt mir hier die Funktion htmlspecialchars() ein, aber ich verstehe sie nicht ganz.

Und, das Wichtigste!, in einer Sprache, die jeder PHP-Anfänger (also ich z.B. ^^) verstehen kann.


Im Vorraus schon mal vielen Dank!

VisualCreations
Die Seite ist von mir erstellt: jotes-studios.de!
  • Zum Seitenanfang

ronsn

Level 0,5

Beiträge: 315

Wohnort: Berlin

Beruf: Student

2

13.03.2010, 15:46

Dann mach ich mal den Anfang.

htmlspechialchars() ist eigentlich ausreichend beschrieben.
Folgende Zeichen werden umgewandelt:
& (Ampersand/kaufmännisches Und) wird zu &.
" (doppeltes Anführungszeichen) wird zu " , wenn ENT_NOQUOTES nicht gesetzt ist.
' (einfaches Anführungszeichen) wird nur zu ' , wenn ENT_QUOTES gesetzt ist.
< (kleiner als) wird zu &lt;
> (größer als) wird zu &gt;
Fangen wir mal von vorne an. In HTML benötigst du Zeichen, um Elemente zu erstellen. Ein Element besteht mindestens aus den Zeichen < und > . Würde der User nun in einem Formular diese Zeichen benutzen, und sie würden nicht umgewandelt, dann könnte der User beispielsweise auch <h1>Hallo</h1> eingeben. Probieren wir es mal aus und geben das ein.

PHP-Quelltext

1
2
3
4
5
6
7
8
<?php
if(isset($_POST['eingabe']))
    echo $_POST['eingabe'];
?>
<form action="" method="post">
    Eingabe <input type="text" name="eingabe" value="" />
    <input type="submit" name="sent" value="Absenden" />
</form>
Was passiert? Es wird eine Überschrift 1. Ordnung ausgegeben. Vielleicht ist das noch nicht so schlimm, aber stell dir mal vor, in einem Gästebuch posten die Leute genau das. Und es geht noch schlimmer. Beispielsweise könnte er CSS darüber senden:

Quellcode

1
<style type=text/css>body { display:none; }</style>
Was passiert? Stell dir vor, das steht in einem Gästebucheintrag, dann ist die ganze Seite weg.
Noch nicht überzeugt? Versuchen wir mal etwas anderes einzugeben. Beispielsweise das hier:

Quellcode

1
<iframe src=http://www.google.de></iframe>
. Und stell dir mal vor, dass die Seite nicht google.de ist, sondern eine andere Seite in der Javascript ist und eine Weiterleitung deiner Seite initiiert. Stell dir weiter vor, derjenige will an die Passwörter deiner User kommen und hat deine Website nachgebaut. Dann leitet er auf die nachgebaute Seite weiter und fragt den User nach Name und Passwort.

Damit das nicht passiert, werden diese Zeichen umgewandelt, sodass sie im Browser angezeigt werden und nicht Bestandteil des HTML-Quelltextes werden.

PHP-Quelltext

1
2
3
4
5
6
7
8
<?php
if(isset($_POST['eingabe']))
    echo htmlspecialchars($_POST['eingabe']);
?>
<form action="" method="post">
    Eingabe <input type="text" name="eingabe" value="" />
    <input type="submit" name="sent" value="Absenden" />
</form>
Jetzt funktionieren die Beispiele nicht mehr und es wird das angezeigt, was eingegeben wurde. Also beim letzten Beispiel mit dem iframe würde im Quelltext nun folgendes stehen:

Quellcode

1
&lt;iframe src=http://www.google.de&gt;&lt;/iframe&gt;


Jetzt überzeugt? :)
  • Zum Seitenanfang

VisualCreations

Coder Youngstar

Beiträge: 393

Sprachen: C, VC# und PHP am Lernen; HTML/CSS

Themenstarter Themenstarter

3

13.03.2010, 22:15

Ähmmmm, jaaa danke. Also, ich wollte eigentlich niemanden nerven :S

So wie du es erklärst hört es sich ein wenig nach einem (leicht) genervten Professor an. :D

Aber danke, jetzt hab ich es auch verstanden :thumbsup:

Gibt es noch mehr davon?
Die Seite ist von mir erstellt: jotes-studios.de!
  • Zum Seitenanfang

ronsn

Level 0,5

Beiträge: 315

Wohnort: Berlin

Beruf: Student

4

14.03.2010, 01:30

Sorry, ich war wirklich etwas genervt. Das lag aber nicht an dir. Ich habe gerade viel zu tun und bin deswegen gestresst. Aber als ich sah, dass hier bisher noch niemand deine Frage beantwortet hat, habe ich mich gezwungen etwas zu schreiben. Verzeih mir bitte!
  • Zum Seitenanfang

VisualCreations

Coder Youngstar

Beiträge: 393

Sprachen: C, VC# und PHP am Lernen; HTML/CSS

Themenstarter Themenstarter

5

14.03.2010, 11:38

Macht nichts^^

Kann ich verstehen.



Hab da noch ne Frage (wenn jemand Zeit hat):

Kann man htmlspecialchars() eig auch "speichern"?
Also so:

PHP-Quelltext

1
2
3
4
$Anwender htmlspecialchars($_POST["Anwender"]);
$E-Mail-Adresse htmlspecialchars($_POST["E-Mail-Adresse"]);
$Homepage htmlspecialchars($_POST["Homepage"]);
$Post htmlspecialchars($_POST["Post"]);


Die Frage ist jetzt halt, ob, wenn man die Variable weiter unten wieder verwendet (echo, oder auch in Datenbank speichern), die HTML-Zeichen immernoch verstellt sind. Also ob htmlspecialchars() sich dauerhaft anwenden lässt?
Die Seite ist von mir erstellt: jotes-studios.de!
  • Zum Seitenanfang

ronsn

Level 0,5

Beiträge: 315

Wohnort: Berlin

Beruf: Student

6

15.03.2010, 00:28

Erstmal, Variablennamen dürfen nicht aus Bindestrichen ( - ) bestehen, da sie als Subtraktions-Operator gelten.

Also dauerhaft zu speichern, also zur Laufzeit des Skripts, geht, indem du schreibst:

PHP-Quelltext

1
$_POST['daten'] = htmlspecialchars($_POST['daten']);
Um das wieder rückgängig zu machen, kann die Funktion htmlspecialchars_decode() benutzt werden. Sie wird genauso wie htmlspecialchars() angewendet.
Für das Abspeichern in einer Datenbank gibt es aber die nächste sicherheitsrelevante Funktion, die aber erst nach einen mysql_connect() aufgerufen werden kann.
Die Funktion entwertet Zeichen, die in einem SQL-Befehl wichtige Zeichen sind, genau wie in htmlspecialchars(). Die Funktion heißt mysql_real_escape_string() und erwartet als Parameter den String, der "entwertet" werden soll. Das sollte IMMER angewendet werden, da sonst die sogenannte MySQL-Injection-Gefahr besteht.

PHP-Quelltext

1
$sql 'SELECT `TEBELLENSPALTE` FROM `TABELLE` WHERE `TABELLENSPALTE` = "'.mysql_real_escape_string($_POST['daten']).'";';
Wichtig ist, dass mysql_real_escape_string() erst NACH mysql_connect() aufgerufen werden kann!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ronsn« (15.03.2010, 01:18)

  • Zum Seitenanfang

VisualCreations

Coder Youngstar

Beiträge: 393

Sprachen: C, VC# und PHP am Lernen; HTML/CSS

Themenstarter Themenstarter

7

15.03.2010, 15:07

Ahh OK. Danke.

Zur ersten Möglichkeit:

Ich könnte also das machen:

PHP-Quelltext

1
2
3
$_POST['daten'] = htmlspecialchars($_POST['daten']);

$Name $_POST['daten'];


Um die Daten dauerhaft "entschädigt" zu haben.


Zum zweiten Punkt:

Danke, werd ich einbinden.
Die Seite ist von mir erstellt: jotes-studios.de!
  • Zum Seitenanfang

ronsn

Level 0,5

Beiträge: 315

Wohnort: Berlin

Beruf: Student

8

15.03.2010, 20:17

PHP-Quelltext

1
2
3
$_POST['daten'] = htmlspecialchars($_POST['daten']);

$Name $_POST['daten'];

Huch, dann hab ich dich falsch verstanden. Mal angenommen in $_POST['daten'] soll der Name von irgendwem stehen, dann reicht folgendes aus:

PHP-Quelltext

1
$Name htmlspecialchars($_POST['daten']);

So weist du der Variablen $Name den konvertierten String aus $_POST['daten'] zu.

Vielleicht liegt das auch an einem Verständnisproblem mit Rückgabewerten. Das was in der Funktion "berechnet" wird, wird zurückgegeben. Die angehängte Grafik zeigt mit einem grünen Pfeil, wohin das "berechnete" gegeben wird.

Somit wird auch klar, wenn du schreibst

PHP-Quelltext

1
$Name htmlspecialchars($_POST['daten']);
, dass in $Name nun der berechnete Wert (also der umgewandelte String) steht. Und solange du der Variablen $Name keinen anderen Wert zuweist, bleibt da auch der umgewandelte String drin. Solange, bis das Programm beendet wurde, also bis zum Ende des Skripts.
»ronsn« hat folgendes Bild angehängt:
  • rückgabewert.jpg
  • Zum Seitenanfang

VisualCreations

Coder Youngstar

Beiträge: 393

Sprachen: C, VC# und PHP am Lernen; HTML/CSS

Themenstarter Themenstarter

9

15.03.2010, 21:22

Ah ja, genau das meinte ich. Danke!!
Die Seite ist von mir erstellt: jotes-studios.de!
  • Zum Seitenanfang

ronsn

Level 0,5

Beiträge: 315

Wohnort: Berlin

Beruf: Student

10

15.03.2010, 22:05

Ich hab nicht wenig geschrieben. Was meintest du denn? :)
  • Zum Seitenanfang

Schülerpraktikum
Blinkster - Das Coumputerforum - dolph-in-forum.de - mynotiz.de - online Notizen - Coole Onlinespiele



Impressum