if (! 0 === strpos( $_POST['GoTo'] , $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] ) )
Sowohl $_SERVER['REQUEST_SCHEME']
als auch $_SERVER['HTTP_HOST']
werden aus dem Client-Request gelesen und lassen sich somit einfach manipulieren. Damit hast du nicht viel gewonnen. Etwas gewinnst du, weil der HTTP-Roundturn damit Gegenstand der Same Origin Policy wird, in Zeiten von In-App-Browsern ist das aber noch nicht genug.
Da eine Reparatur nicht sinnvoll ist […] schicke ich den Besucher aber in die "Nice try" – Wüste.
Natürlich wäre eine Reperatur sinnvoll. Fuschererei dagegen ist es nicht.
htmlspecialchars würde z.B. immer noch eine Weiterleitung zu fremden Ressourcen erlauben
Ja, deswegen solltest du serverseitig weiterleiten, und wenn du unbedingt die Return-URL über mehrere HTTP-Roundturns speichern möchtest, dann mach das ebenfalls serverseitig, z.B. in einer Session.