Das größte Sicherheitsproblem bei der Verwendung von register_globals war, daß ein "Angreifer" beliebige globale Variable in deinem Code setzen konnte, indem er diese einfach an die URL angehängt bzw. per POST an dein Script geschickt hat. Als Programmierer mußte man daher stets darauf achten, alle Variablen, die im Skript verwendet wurden, vor der Verwendung zu initialisieren.
Mit der Verwendung von $_GET ( bzw. $_POST für Formulare, die mit method="POST" abgeschickt werden, $_COOKIE für Cookies und $_SESSION für Session-Daten usw.) fällt diese Schwachstelle weg.
Es gibt allerdings noch genug andere Fallstricke.
- vor der Verwendung in SQL-Queries müssen alle Eingaben entsprechend bereinigt bzw. escaped werden (oder man verwendet gleich prepared statements bzw. parametrisierte Queries).
- Soll eine Usereingabe auch wieder aus der Seite ausgegeben werden, müssen alle Zeichen mit einer speziellen Bedeutung in HTML (zumindest die Zeichen < > & und Anführungszeichen) mit htmlspecialchars() in die entsprechenden HTML-Entities (< ; > ; & ;) umgewandelt werden. HTML-Tags sollten ebenfalls ausgefiltert werden (strip_tags()). Im "besten" Fall wird nur das Seitenlayout zerstört, wenn der Benutzer beliebiges HTML eingeben kann, im schlimmsten Fall können über eingeschleustes JavaScript in <script>-Tags Daten ausgelesen oder manipuliert werden.