In diesem Kapitel stellen wir vor, wie Sie PHP verwenden, um vom Client übermittelte Formulardaten zu überprüfen.
Beim Umgang mit PHP-Formularen müssen wir die Sicherheit berücksichtigen. In diesem Kapitel demonstrieren wir die sichere Verarbeitung von PHP-Formulardaten. Um Hacker und Spam zu verhindern, müssen wir eine Datensicherheitsüberprüfung des Formulars durchführen. |
Das in diesem Kapitel beschriebene HTML-Formular enthält die folgenden Eingabefelder: Erforderliche und optionale Textfelder, Optionsfelder und Senden-Schaltflächen:
Die oben genannten Formularvalidierungsregeln lauten wie folgt:
Feld | Validierungsregeln |
---|---|
Name | muss. +kann nur Buchstaben und Leerzeichen enthalten |
muss. + muss eine gültige E-Mail-Adresse sein (enthält „@“ und „.“) | |
URL | Optional. Falls vorhanden, muss es eine gültige URL enthalten |
Bemerkung | Optional. Mehrzeilige Eingabefelder (Textfelder) |
Geschlecht | muss. Muss eines auswählen |
Schauen wir uns zunächst den reinen HTML-Formularcode an:
Die Felder „Name“, „E-Mail“ und „Website“ sind Texteingabeelemente und das Feld „Bemerkungen“ ist ein Textbereich. Der HTML-Code sieht so aus:
„Name“: <input type="text" name="name">E-Mail: <input type="text" name="email">Website: <input type="text" name="website">Bemerkungen : <textarea name="comment" rows="5" cols="40"></textarea>
Das Feld „Geschlecht“ ist ein Optionsfeld und der HTML-Code sieht folgendermaßen aus:
Geschlecht:<input type="radio" name="gender" value="female">Weiblich<input type="radio" name="gender" value="male">Männlich
Der HTML-Formularcode sieht so aus:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Das Formular verwendet die Methode method="post", um Daten zu übermitteln.
Was ist die Variable $_SERVER["PHP_SELF"]? $_SERVER["PHP_SELF"] ist eine superglobale Variable, die den Dateinamen des aktuell ausgeführten Skripts zurückgibt und sich auf das Dokumentstammverzeichnis bezieht. |
Daher sendet $_SERVER["PHP_SELF"] die Formulardaten an die aktuelle Seite, anstatt zu einer anderen Seite zu springen.
Was ist die Methode htmlspecialchars()? Die Funktion htmlspecialchars() konvertiert einige vordefinierte Zeichen in HTML-Entitäten. Die vordefinierten Zeichen sind: & (kaufmännisches Und) wird zu & „ (doppeltes Anführungszeichen) wird zu " ' (einfaches Anführungszeichen) wird zu ' < (kleiner als) wird zu < > (größer als) werden> |
Die Variable $_SERVER["PHP_SELF"] kann von Hackern verwendet werden!
Wenn Hacker Cross-Site-Scripting-HTTP-Links zum Angriff nutzen, wird auch die Servervariable $_SERVER["PHP_SELF"] in das Skript eingebettet. Der Grund dafür ist, dass Cross-Site-Scripting an den Pfad der ausführbaren Datei angehängt wird, sodass die Zeichenfolge $_SERVER["PHP_SELF"] den JavaScript-Programmcode hinter dem HTTP-Link enthält.
XSS wird auch CSS (Cross-Site Script) genannt, ein Cross-Site-Scripting-Angriff. Böswillige Angreifer fügen bösartigen HTML-Code in eine Webseite ein. Wenn ein Benutzer die Seite durchsucht, wird der in die Webseite eingebettete HTML-Code ausgeführt, wodurch der spezielle Zweck des böswilligen Benutzers erreicht wird. |
Geben Sie den folgenden Formulardateinamen „test_form.php“ an:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
Jetzt verwenden wir die URL, um die Übermittlungsadresse „test_form.php“ anzugeben, und der obige Code wird wie folgt geändert:
<form method="post" action="test_form.php">
Das wäre in Ordnung.
Bedenken Sie jedoch, dass der Benutzer die folgende Adresse in die Adressleiste des Browsers eingibt:
http://www.codercto.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
Die obige URL wird in den folgenden Code geparst und ausgeführt:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
Dem Code wurde ein Skript-Tag und ein Alarmbefehl hinzugefügt. Dieser Javascript-Code wird ausgeführt, wenn die Seite geladen wird (der Benutzer sieht ein Popup-Fenster). Dies ist nur ein einfaches Beispiel dafür, wie die Variable PHP_SELF von Hackern ausgenutzt werden kann.
Bitte beachten Sie, dass innerhalb des <script>-Tags beliebiger JavaScript-Code hinzugefügt werden kann! Hacker können dies nutzen, um die Seite auf eine Seite auf einem anderen Server umzuleiten. Die Seitencodedatei kann schädlichen Code schützen. Der Code kann globale Variablen ändern oder die Formulardaten des Benutzers abrufen.
$_SERVER["PHP_SELF"] kann durch Verwendung der Funktion htmlspecialchars() vermieden werden.
Der Formularcode sieht so aus:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() konvertiert einige vordefinierte Zeichen in HTML-Entitäten. Wenn der Benutzer nun die Variable PHP_SELF verwenden möchte, wird das Ergebnis wie folgt ausgegeben:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
Der Versuch, diesen Exploit auszunutzen, ist fehlgeschlagen!
Zunächst verarbeiten wir alle von Benutzern über die PHP-Funktion htmlspecialchars() übermittelten Daten.
Wenn wir die Funktion htmlspecialchars() verwenden, versucht der Benutzer, das folgende Textfeld zu übermitteln:
<script>location.href('http://www.codercto.com')</script>
Dieser Code wird nicht ausgeführt, da er als HTML-Escape-Code wie folgt gespeichert wird:
<script>location.href('http://www.codercto.com')</script>
Der obige Code ist sicher und kann normal auf der Seite angezeigt oder in E-Mails eingefügt werden.
Wenn der Benutzer das Formular absendet, werden wir die folgenden zwei Dinge tun:
Verwenden Sie die PHP-Funktion trim(), um unnötige Zeichen (wie Leerzeichen, Tabulatoren, Zeilenumbrüche) in Benutzereingabedaten zu entfernen.
Verwenden Sie die PHP-Funktion „stripslashes()“, um Backslashes () aus Benutzereingabedaten zu entfernen
Als nächstes schreiben wir diese Filterfunktionen in eine Funktion, die wir selbst definieren, was die Wiederverwendbarkeit des Codes erheblich verbessern kann.
Benennen Sie die Funktion test_input().
Jetzt können wir die Funktion test_input() verwenden, um alle Variablen in $_POST zu erkennen. Der Skriptcode lautet wie folgt:
<?php//Variablen definieren und standardmäßig auf leere Werte setzen $name= $email= $gender= $comment= $website= "" if($_SERVER["REQUEST_METHOD"]== "POST") { $name= test_input($_POST["name"]); $email= test_input($_POST["email"]); test_input($_POST["website"]); $comment= test_input($_POST["comment"]); $gender= test_input($_POST["gender"]);} functiontest_input($data){ $data= trim ($data); $data= stripeslashes($data); $data= htmlspecialchars($data); return$data;}?>
Beachten Sie, dass wir beim Ausführen des obigen Skripts $_SERVER["REQUEST_METHOD"] verwenden, um zu erkennen, ob das Formular gesendet wurde. Wenn REQUEST_METHOD POST ist, wird das Formular gesendet – und die Daten werden validiert. Wenn das Formular nicht eingereicht wird, wird die Validierung übersprungen und leer angezeigt.
Die Verwendung von Eingabeelementen in den obigen Beispielen ist optional und kann normal angezeigt werden, auch wenn der Benutzer keine Daten eingibt.
Im nächsten Kapitel stellen wir vor, wie die vom Benutzer eingegebenen Daten validiert werden.