Zudem hast du noch eine weitere Lücke eingebaut. In der Zeile
trigger_error( 'Nicht erwarteter Referer: ' . $_SERVER['HTTP_REFERER'] . ' ' . $str, E_USER_ERROR );
wird der HTTP_REFERER nicht maskiert. Wenn der Server so konfiguriert ist, dass er PHP-Fehler ausgibt, ermöglich das einem Angreifer JavaScript einzuschleusen.
Schaun wir mal:
<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include '<script>alert("Böse");</script>';
Ausgaben im Browser:
Warning: include(<script>alert("Böse");</script>): failed to open stream: No such file or directory in /var/www/seminar/htdocs/test/test.php on line 5
Warning: include(): Failed opening '<script>alert("Böse");</script>' for inclusion (include_path='.:/usr/share/php') in /var/www/seminar/htdocs/test/test.php on line 5
Warum kommt das alert nicht?
Quelltext:
<br />
<b>Warning</b>: include(<script>alert("Böse");</script>): failed to open stream: No such file or directory in <b>/var/www/seminar/htdocs/test/test.php</b> on line <b>5</b><br />
<br />
<b>Warning</b>: include(): Failed opening '<script>alert("Böse");</script>' for inclusion (include_path='.:/usr/share/php') in <b>/var/www/seminar/htdocs/test/test.php</b> on line <b>5</b><br />
Objektive Gegenprobe, denn der Browser könnte das manipuliert haben. Also noch :
wget -O- http://127.0.0.1/test/test.php
... zeigt exakt obigen Quelltext.
Fazit:
- PHP behandelt selbst alle Strings in Fehlermeldungen.
Wenn der Server so konfiguriert ist, dass er PHP-Fehler ausgibt, ermöglich das einem Angreifer JavaScript einzuschleusen.
Das ist also nicht „falsch verstanden“, sondern falsch.