PHP-Formularvalidierung

本节和下一节讲解如何使用 PHP 来验证表单数据。

PHP-Formularvalidierung

Tipp:Beeinhalten Sie bei der Verarbeitung von PHP-Formularen die Sicherheit!

Diese Seiten zeigen, wie PHP-Formulare sicher bearbeitet werden. Eine angemessene Überprüfung der HTML-Formulardaten ist wichtig, um Hacker und Spam zu verhindern!

Die von uns später verwendeten HTML-Formulare enthalten verschiedene Eingabefelder: Erforderliche und optionale Textfelder, Auswahlknöpfe sowie den Abschicken-Knopf:

Das obige Formular verwendet folgende Überprüfungsvorschriften:

Feld Überprüfungsvorschriften
Name Erforderlich. Muss Buchstaben und Leerzeichen enthalten.
E-Mail Erforderlich. Muss eine gültige E-Mail-Adresse enthalten (inklusive @ und .).
Website Optional. Wenn ausgefüllt, muss eine gültige URL enthalten.
Kommentar Optional. Mehrzeiliges Eingabefeld (Textfeld).
Geschlecht Erforderlich. Eine Auswahl muss getroffen werden.

Zunächst schauen wir uns den reinen HTML-Code dieses Formulars an:

Textfelder

Die Felder name, email und website sind Texteingabefelder, das Kommentar-Feld ist ein Textfeld. Der HTML-Code ist wie folgt:

Name: <input type="text" name="name">
E-Mail: <input type="text" name="email">
Website: <input type="text" name="website">
Kommentar: <textarea name="comment" rows="5" cols="40"></textarea>

Auswahlknöpfe

Das Geschlecht ist ein Auswahlknopf, der HTML-Code ist wie folgt:

Geschlecht:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

Formularelemente

Der HTML-Code des Formulars ist wie folgt:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>

Bei der Übermittlung dieses Formulars werden die Formulardaten über method="post" gesendet.

Was ist die Variable $_SERVER["PHP_SELF"]?

$_SERVER["PHP_SELF"] ist eine Super globale Variable, die den Dateinamen der aktuellen ausführbaren Skriptdatei zurückgibt.

Daher sendet $_SERVER["PHP_SELF"] die Formulardaten an die selbe Seite, anstatt zu einer anderen Seite zu springen. Auf diese Weise können die Benutzer Fehlerhinweise auf der Formularseite erhalten.

Was ist die Funktion htmlspecialchars()?

Die Funktion htmlspecialchars() wandelt spezielle Zeichen in HTML-Entitäten um. Dies bedeutet, dass HTML-Zeichen wie < und > durch < und > ersetzt werden. Dies verhindert, dass Angreifer durch das Einfügen von HTML oder JavaScript-Code (Cross-Site Scripting-Angriff) in das Formular den Code ausnutzen.

Wichtige Hinweise zur Sicherheit von PHP-Formularen

Die Variable $_SERVER["PHP_SELF"] kann von Hackern ausgenutzt werden!

Wenn Ihre Seite PHP_SELF verwendet, können Benutzer einen Unterstrich eingeben und Cross-Site Scripting (XSS) ausführen.

Tipp:Cross-Site Scripting (XSS) ist ein Typ von Computersicherheitslücke, die häufig in Web-Anwendungen vorkommt. XSS ermöglicht es Angreifern, Client-Skripte in von anderen Benutzern angezeigte Webseiten einzufügen.

Angenommen, auf einer Seite namens "test_form.php" befindet sich folgender Formular:

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

Jetzt, wenn der Benutzer die normale URL in der Adresszeile aufruft: "http://www.example.com/test_form.php", wird der obige Code in folgendes umgewandelt:

<form method="post" action="test_form.php">

Bis jetzt ist alles in Ordnung.

Allerdings, wenn der Benutzer die folgende URL in die Adresszeile eingibt:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

In diesem Fall wird der obige Code in folgendes umgewandelt:

<form method="post" action="test_form.php"/><script>alert('hacked')</script>

Dieser Code fügt einen Skript-Code und einen Befehl zur Anzeige eines Hinweises hinzu. Und wenn diese Seite geladen wird, wird der JavaScript-Code ausgeführt (der Benutzer sieht ein Hinweisfenster). Dies ist ein einfaches und harmloses Beispiel darüber, wie die PHP_SELF-Variablen genutzt werden können.

Sie sollten sich bewusst sein Der <script>-Tag kann jeden JavaScript-Code hinzufügen!Hackers can redirect users to a file on another server, where malicious code can change global variables or submit forms to other addresses to save user data, etc.

How to avoid the exploitation of $_SERVER["PHP_SELF"]?

By using the htmlspecialchars() function, we can avoid the exploitation of $_SERVER["PHP_SELF"].

The form code is like this:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

The htmlspecialchars() function converts special characters to HTML entities. Now, if the user tries to exploit the PHP_SELF variable, it will cause the following output:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>">

Not exploitable, no harm!

PHP form data validation

The first thing we need to do is pass all variables through PHP's htmlspecialchars() function.

After we use the htmlspecialchars() function, if the user tries to submit the following content in a text field:

<script>location.href('http://www.hacked.com')</script>

- The code will not be executed because it will be saved as escaped code, like this:

<script>location.href('http://www.hacked.com')</script>

Now this code is safe to display on the page or in an email.

When the user submits the form, we also need to do two things:

  1. (By using PHP's trim() function) remove unnecessary characters from the user's input data (extra spaces, tabs, new lines)
  2. (By using PHP's stripslashes() function) remove backslashes (\) from the user's input data

Next, we create a check function (this is more efficient than writing code repeatedly).

We name the function test_input().

Now, we can check each $_POST variable through the test_input() function, the script is like this:

Example

<?php
// Definition of variables and setting them to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}
function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

Laufender Beispiel

Bitte beachten Sie, dass wir am Anfang des Skripts überprüfen, ob das Formular mit $_SERVER["REQUEST_METHOD"] eingereicht wurde. Wenn REQUEST_METHOD POST ist, wurde das Formular eingereicht - und sollte überprüft werden. Wenn nicht eingereicht, wird die Überprüfung übersprungen und ein leeres Formular angezeigt.

Allerdings sind alle Eingabefelder im obigen Beispiel optional. Selbst wenn der Benutzer keine Daten eingibt, funktioniert das Skript normal.

Der nächste Schritt ist die Erstellung von Pflichtfeldern für die Eingabe und die Erstellung der erforderlichen Fehlermeldungen.