Alten PHP-Code für neue PHP-Version anpassen (EREG, PREG_MATCH, etc.)

Cold Carnage

Lt. Junior Grade
Registriert
Juli 2010
Beiträge
417
Ich habe ein älteres Content-Management-System (welches spielt keine Rolle) in dem folgende Zeile vorkommt:

Code:
if(eregi("file.php", $_SERVER["PHP_SELF"]) || eregi("file.php", $HTTP_SERVER_VARS["PHP_SELF"])) die("Access denied!");

Das funktioniert allerdings seit einigen PHP-Versionen nicht mehr. Mir ist die Umstellung nach einigen Versuchen bisher leider noch nicht gelungen. Ich bin ein nahezu absoluter Amateuer in PHP, komplett eigene PHP-Scripte programmiere ich nicht. Daher dachte ich mir, ich frage hier mal nach, ob jemand so lieb ist und mir aufzeigt, wie man die Zeile jetzt umschreiben muss beziehungsweise kann. Mit preg_match()? Mit strpos()? Oder mit strstr()?

Vielleicht liefert gleich jemand die konkrete Antwort, das wäre super hilfreich (mehr als eine Lernaufgabe)! ;)

Mir erschließt sich noch nicht einmal so ganz, wozu diese Zeile überhaupt genau da ist. Ist das eine Art Sicherheitsabfrage? Ist diese möglicherweise in der neuen PHP-Version obsolet und kann weg?

Vorab vielen Dank für alle konstruktiven Beiträge! :)
 
Cold Carnage schrieb:
Ich habe ein älteres Content-Management-System
Ich weiß, du willst das nicht hören... Ich weiß, du willst nur dein offensichtliches Problem loswerden und nichts von den 100000 unsichtbaren aber viel schlimmeren wissen...
Schmeiß das CMS weg, tausch es gegen eine wirklich aktuelle Version aus. Ist keine aktuelle verfügbar (bzw. die letzte Aktualisierung schon Jahre her), dann setz das Projekt auf einem neuen CMS auf. Einem, dass nicht auf Steinzeit-PHP aufbaut.

Warum? Weil dein alter Mist unter Garantie tausende Sicherheitslücken unterschiedlicher Schwere hat.

Ich bin ein nahezu absoluter Amateuer in PHP, komplett eigene PHP-Scripte programmiere ich nicht.
Wenn du ein totaler Amateur hinsichtlich Autoreparaturen wärst, würdest du das Bremssystem an einem Schulbus reparieren?
Ach? Nein? Warum sollte ein Amateur dann kaputtes PHP reparieren? Bezahl einen Profi.
Selbst wenn dir hier jemand präzise erklärt, wie du eregi durch preg_match ersetzt, so uralter Code wie deiner hat garantiert noch zig andere schwere Lücken, die dich, deinen Hoster und deine Kunden unnötig gefährden. Lass einen Profi drüber gehen.

Oh, und noch ein Grund, warum du dieses CMS nicht nutzen solltest: Es wurde offensichtlich von Vollidioten geschrieben. Wer bitte verwendet eine Regex-Funktion, wenn es stripos() auch getan hätte? Da muss man schon arg Banane sein.

Mir erschließt sich noch nicht einmal so ganz, wozu diese Zeile überhaupt genau da ist. Ist das eine Art Sicherheitsabfrage? Ist diese möglicherweise in der neuen PHP-Version obsolet und kann weg?
Also was die Funktion macht hätte dir sogar Google verraten. Wie willst du die ganzen weiteren Probleme im System finden und beheben, wenn es daran schon scheitert?
Aber für dich: eregi() prüft, ob ein regulärer Ausdruck in einem String enthalten ist, ohne dabei auf Groß- und Kleinschreibung zu achten. In diesem speziellen Fall: Enthalten die beiden speziellen Server-Variablen den Wert "file.php"? Dann beende an dieser Stelle mit "Zugriff verweigert"

WARUM es das tut, das kann dir hier keiner sagen. Es wird aber wichtig sein.
 
Wie bereits geschrieben, es ist ein älteres System, daraus könnte man schließen, dass es keine aktuellere Version gibt, sonst würde ich wohl selbst darauf kommen, es zu aktualisieren. Soviel Verstand sollte man einem schon zutrauen. Ja, den Umständen bin ich mir genauso bewusst. Ja, ein kompletter Wechsel wäre sinnvoll, vorausgesetzt, man findet etwas gleichwertiges. Ja, das System ist seit mehreren Jahren im Einsatz. Es hat sich bisher immer noch bewährt. Aber in der Zeit ändern sich Dinge, auch das ist klar. Das soll jetzt erst einmal nur eine kurzfristige Übergangslösung sein, zumal es nur um diese einzige Zeile geht (ich habe einen Einblick in die restliche Programmierung, es ist zudem nicht schwierig, die betroffenen Befehle im Quelltext zu finden).

Anstatt über Sinn und Zweck zu philosophieren, wäre eine konstruktive Antwort zur eigentlichen Frage sinnvoller und weniger zeitaufwendig für beide Seiten. Was die Funktion macht, ist mir durch die oben verlinkte Internetseite bekannt. Dort habe ich natürlich ebenfalls die Ausführungen zu preg_match(), strpos() und strstr() gefunden. Welche dieser Funktionen wäre also als Ersatz für die Zeile am ehesten geeignet? Ich habe schon vor einiger Zeit versucht, das Problem zu lösen. Damals kam folgendes, am Original angelehntes, Konstrukt heraus:

Code:
if(preg_match("#/file.php#i", $_SERVER["PHP_SELF"]) || preg_match("#/file.php#i", $HTTP_SERVER_VARS["PHP_SELF"])) die("Access denied!");

So funktioniert das jedoch nicht. Ich bin mir fast sicher, dass ein erfahrener PHP-Programmier möglicherweise mit nur einem Satz das Rätsel lösen könnte - ohne zu streng mit mir zu sein, egal wie peinlich der Fehler auch sein mag. Dass ich das System umstelle, ist schon geplant. Aber von heute auf morgen geht das nicht, wenn man nicht alles an Inhalten verlieren will. Deswegen versuche ich das Problem kurzfristig aus der Welt zu schaffen. :)

PS: Der Server wird umgestellt, dadurch kann die alte PHP-Version nicht länger angesprochen werden (htaccess).
 
Zuletzt bearbeitet:
Cold Carnage schrieb:
Welche dieser Funktionen wäre also als Ersatz für die Zeile am ehesten geeignet?
stripos(), denn du willst ja case insensitive prüfen. RegEx - Funktionen sind, wie ich schon sagte, REssourcenverschwendung und der ursprüngliche Programmierer hatte wohl echt einen Vollschatten...

Code:
if(preg_match("#/file.php#i", $_SERVER["PHP_SELF"]) || preg_match("#/file.php#i", $HTTP_SERVER_VARS["PHP_SELF"])) die("Access denied!");
Der Slash dürfte der Schuldige sein. Meines Erachtens nach hat der da nix zu suchen. # dient als Delimiter (ungewöhnlich, aber ok....), der Slash hingegen... kein Nutzen.
Außerdem vermute ich, dass du den Punkt nicht direkt als Zeichen angeben darfst, sondern [.] schreiben musst. Schnapp dir einen RegEx - Tester, gibt genug gute online-tools.

AAAAAABER! Scheiß auf RexEx. Um nach "file.php" zu suchen braucht es keine RegEx-Funktion, da reicht stripos.
 
Zurück
Oben