Die hab ich mal teilweise geändert. Hier noch ein paar Anmerkungen, auch zu Dingen, die ich nicht geändert habe. Zum Beispiel gehört der Zeilenumbruch nach einem ?> mit zum schließenden PHP-Tag und landet nicht in der Ausgabe. Man muss also nicht
<?php ...
?><!doctype ...
Gut zu wissen, dass wusste ich nicht.
Ein Location-Header will eine vollständige URL. Was ist besser daran, ./foo.ext statt foo.ext zu notieren? Gegebenenfalls sollte das erläutert werden.
Das hat keinen speziellen Grund, Gewohnheitssache.
Der Teil mit dem crypt() soll später gegen eine PHP-Funktion ausgetauscht werden können, schreibst du. Dann mach das doch gleich austauschbar, pack den Code in eine Funktion.
Man kann genauso in alle Ewigkeit crypt() verwenden, weil password_hash() ohnehin dasselbe tut - es gibt in PHP in dieser hinsicht leider wieder einen ziemlich Wildwuchs.
Ich habe überlegt, das ganze in eine Funktion auszualgern, aber das macht das ganze nicht besser - wenn, dann müsste man das Ordentlich machen und password_hash() und password_verify() nachbilden, das hat aber dann ein Codemonster zur Folge, welches die Sache für einsteiger nicht grade verständlicher macht:
https://github.com/ircmaxell/password_compat/blob/master/lib/password.php