Warum existiert eval() in PHP?

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Warum existiert eval() in PHP?

Beitrag von hardfalcon »

Moin, ich weiss natürlich, was der PHP-Befehl eval() macht. Allerdings frage ich mich: Wozu hat man diesen Befehl überhaupt eingeführt? Das einzige sinnvolle Einsatzszenario, das ich mir vorstellen kann, ist, eine Shell zu programmieren, und das sollte ja weiß Gott nicht die Nestimmung von PHP sein...
Kennt hier vielleicht jemand ein Szenario, wo es Sinn macht, eval() zu verwenden? Würde mich echt mal interessieren...
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Flexiblerer Codegestaltung.
z.B.

Code: Alles auswählen

mysql_query("SELECT event FROM datenbank WHERE id='1'");
if ($mysql_fetch_array['event']== _mycode_sendmail_){
    //mail()
}
->

Code: Alles auswählen

mysql_query("SELECT code FROM datenbank WHERE id='1'");
//if (irgendwelche sicherheitsabfrage == true){
    eval($mysql_fetch_array['code'];
//}
Stellt natürlich auch ein Sicherheitsrisiko dar...
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Oder für meinen [php][/php] tag, damit ich in meinem CMS direkt an einer bestimmten Stelle code einfügen kann.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ich nutze diese Funktion für kurze einfach php-Tests.

Auf einer URL wird mit eine Textarea ein php-Script von mir geschreiben, dann sende ich dies ab, und lasse es dann mit Eval auusführen. Und muss damit nicht immer eine datei schreiben und hochladen ... spart n menge Zeit ;-)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Wirklich überzeugt hat mich bis jetzt eignentlich nur das mit den [php]-Tags (wobei ich das trotzdem noch relativ kritisch sehe, bei nem ordentlichen CMS sollte man doch nich noch irgendwo PHP-Code einbetten müssen).

TomS: Dein Beispiel scheint mir nicht nur recht synthetisch, sondern v.a. (wie du ja selbst zugibst) sehr unsicher zu sein.

Stargate: Dafür braucht man doch auch kein eval(), man kann den Code ja auch in ner temporären Datei speichern (braucht natürlich ein Verzeichnis mit entsprechend gesetzten Zugriffsrechten), hinter dem Code noch ein unlink("Dateiname.test"); einfügen, und das Script dann mit include("Dateiname.test"); ausführen...

//EDIT: Egal, was solls, wegen mir werden die eh kaum nen Befehl da rausschmeissen, in andern Sprachen gibts ja auch genug unsichere Befehle... <)
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Beitrag von TomS »

Synthetisch schon. Ist ja jeder Code. Aber prinzipiell das gleiche wie DDs PHP-Tags. Bloß, dass bei den php-tags noch normaler Text außen rum steht. Oder auch nicht...
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Interessant dazu finde ich hier besonders die Warnung, was man damit
anstellen kann :lol:

http://www.php-faq.de/q-string-ausfuehren.html
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Beim Woltlab Burning Board ist es z.B. so, dass sämtliche Board-Templates in der Datenbank liegen und dann per eval() ausgeführt werden.

Da ist dann auch gleich ein Editor integriert, damit man online recht simpel Änderungen an den Templates machen kann.

Ziemlich praktisch und auch sicher.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

IMHO ist grade so etwas ein hohes Sicherheitsrisiko. Ich habe in den letzten Wochen mehrere Internetseiten gesehen, wo man über ne SQL-Injection Zugriff auf die Datenbank hatte. Da die normalen MySQL-User meistens keine FILE-Rechte haben, können die nicht einfach irgendein PHP-Script mit beliebigem Code auf dem Webserver speichern, ihre eigenen Tabellen können diese Benutzer aber natürlich verändern. Und genau hier liegt das Problem: Wenn jetzt ein CMS oder ein Forum irgendwo ne SQL-Injection auftaucht (und das ist in der Vergangenheit auch schon beim Woltlab-BB vorgekommen), kann der Angreifer über die DB ja beliebigen PHP-Code zur Ausführung bringen. Natürlich ist das nicht in erster Linie ein Problem von PHP sondern eins von unverantwortllichen Programmierern der jeweiligen Webanwendug, aber das Resultat ist das gleiche: Auf dem angegriffenen Server kann der Angreifer nicht nur die Datenbank auslesen, sondern auch noch eigenen PHP-Code ausführen.
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Es kommt ja immer darauf an, was du anbieten willst.

Wenn du deinen Boardkäufern eine komfortable Möglichkeit bieten willst, das Board nach Herzenslust den eigenen Bedürfnissen anzupassen ist das in jedem Fall eine sichere Methode (tatsächlich im Normalfall "nur" durch Injections aushebelbar, die Löcher musst du dann natürlich versuchen zu stopfen).

Sicherer ist natürlich fixe Dateien in Ordnern ohne Schreibrechte, die die User dann eben per ftp hin- und herschieben müssen.

Aber wer Angst vor sql-injections hat, der hat sich bestimmt auch Alufolie um den Kopf gewickelt. ;)
Antworten