Seite 1 von 1

PHP register_globals ON: DEFINEs sicherer als globale Vars?

Verfasst: 03.01.2007, 13:21
von Airport1
Normale globale Variablen haben den Nachteil dass bei einer
Server Config a la

register_globals On

diese "von aussen" ueber die URL ueberschrieben werden koennen.
Nun, wie stehts mit define()s? Sind diese "sicherer" ?
Oder kann man diese auch "aushebeln" oder vor ihrer Definition (!) "vorbelegen", wenn ja, wie ?

Verfasst:
von

Verfasst: 04.01.2007, 12:39
von Graccem
Define erzeugt keine Variablen, sondern Konstanten. Es hat also später noch gewisse Nachteile, wenn du damit rechnen möchtest. Du bräuchtest also quasi für jede Operation eine neue Konstante.

Register_globals on ist aber eigentlich nur ein Problem, wenn man unsauber arbeitet. Wenn du Variablen hast, die nur intern verwendet werden sollen, musst du diese zuvor einfach mit einem Startwert belegen. Dieser Startwert würde dann die Werte aus GET/POST wieder überschreiben.

Verfasst: 04.01.2007, 12:46
von Airport1
Schoen dass endlich jemand antwortet ;)

Was Konstanten sind ist mir schon klar ;) Gerechnet oder geaendert werden die nicht..
allerdings werden sie hier zur Konfiguration "missbraucht", und zwar nur deshalb weil sie angebl. nicht von aussen ueberschrieben werden koennen, sprich SICHERER sind, und auch nicht vorinitialisiert sein muessen..

Soll heissen jemand soll vor Einbindung eines Scripts z.B. schreiben koennen:

define('NAME', 'hase');
require_once(...);

das ist offensichtlich besser udn vor allem sicherer (register globals = on ) als ne globale variable a la:

$name = 'hase;
require_once(...);

Normale Variablen werden derzeit vorinitialisiert. Grade wegen der Sicherheit bzgl. evtl. register gobal_vars = on

Die eigentliche Frage war, ob man es von aussen schaffen kann defined oder sogar noch nicht defined Constants zu ueberschreiben.. habe dazu aber nix und nirgends was gefunden, also geht es offensichtlich wohl nicht..

Verfasst: 04.01.2007, 13:18
von SloMo
Airport1 hat geschrieben:Die eigentliche Frage war, ob man es von aussen schaffen kann defined oder sogar noch nicht defined Constants zu ueberschreiben.. habe dazu aber nix und nirgends was gefunden, also geht es offensichtlich wohl nicht..
Denke ich auch, aber PHP ist hinsichtlich solcher Dinge immer für Überraschungen gut.

Alternativ könntest Du auch ein Array benutzen:

Code: Alles auswählen

// schützen...
unset( $Config );

// Konfig setzen...
$Config['NAME'] = 'hase';
Auf diese Weise könnten einzelne Konfigwerte von Dir voreingestellt werden, und der User könnte sie dann in einer eigenen config.inc.php überschreiben (was ja bei Konstanten nicht geht). Beispiel:

Code: Alles auswählen

// schützen...
unset( $Config );

// Deine defaults...
$Config['NAME'] = 'default_hase';

// Useranpassungen in Extradatei config.inc.php...
$Config['NAME'] = 'custom_hase';

Verfasst: 04.01.2007, 14:13
von net(t)worker
die variabeln die von aussen an ein php-script übergeben werden, stehen vor start des scriptes zur Verfügung, wenn du eine variable am scriptanfang also per

Code: Alles auswählen

$name="";
"initialisierst" kann man diese var von aussen nicht mehr manipulieren....

ähnliches gilt für Konstante die du über define erstellst, diese können garnicht von aussen vorbelegt werden...

ob man nun eine Konstante oder eine Variable nimmt ist absolut abhängig davon, ob sich im scriptablauf der Inhalt ändern oder absolut "konstant" bleibt....

Verfasst: 04.01.2007, 15:54
von Graccem
Airport1 hat geschrieben: Soll heissen jemand soll vor Einbindung eines Scripts z.B. schreiben koennen:

define('NAME', 'hase');
require_once(...);

das ist offensichtlich besser udn vor allem sicherer (register globals = on ) als ne globale variable a la:

$name = 'hase;
require_once(...);

Normale Variablen werden derzeit vorinitialisiert. Grade wegen der Sicherheit bzgl. evtl. register gobal_vars = on
Naja, da $name vom Script beschrieben wird, ist das auch ausreichend sicher. Da hat dann doch eher die Konstante ein Manko, da diese sich dann nicht mehr überschreiben lässt und der gefakte Wert dann drin stehen würde. ABER
Die eigentliche Frage war, ob man es von aussen schaffen kann defined oder sogar noch nicht defined Constants zu ueberschreiben.. habe dazu aber nix und nirgends was gefunden, also geht es offensichtlich wohl nicht..
so etwas ist mir nicht bekannt. Das kann man aber ebenfalls abfangen.

Code: Alles auswählen

define('Test',1); // Der gefakte Wert, wie auch immer dieser ins Scipt kommt

if (!defined('Test')) {
	define('Test',2); // Der richtige Wert
} else {
	die();
}
Mit der Überprüfung sollte man auf der sicheren Seite sein, falls es mal ein Bug geben sollte, der es erlaubt, die Konstanten zu beschreiben.