phpbar.de logo

Mailinglisten-Archive

[php] achja, die Sicherheit ...

[php] achja, die Sicherheit ...

Yannik Hampe yannikh at gmail.com
Sam Sep 23 23:50:49 CEST 2006



Sebastian Mendel wrote:
> Yannik Hampe schrieb:
>> Sebastian Mendel wrote:
>>> schon gelesen?
>>>
>>> http://www.hardened-php.net/hphp/zend_hash_del_key_or_index_vulnerability.html
>>>
>>>
>>> so auf die schnelle würde mir einfallen einfach alle Anfragen mit einer
>>> Zahl als Namen abzulehnen, oder?
>>>
>> *les*
>> Interessanter Bug...
>> Also ja... Meines Erachtens müsste sowas schützen:
>> if (preg_match('/[?&][-]{0,1}\d+=/',$_SERVER['REQUEST_URI'])) 
>> exit('Irgendeine Fehlermeldung');
>> (Code by Yannik Hampe, with 14-days-money-back guarantee... Use at your 
>> own risk...)
> 
> und was ist mit ; anstelle von ?
> und mit POST und COOKIE?
Tjo, stimmt... Also vielleicht doch besser:
foreach(get_defined_vars() as $key =>$v) if (is_numeric($key)) exit('nö');
> 
> script.php?var=1;123=fake
> 
> Wie es ja schon seit Jahren vom W3C empfohlen wird und auch verwendet wird.
Das ist mir aber neu. Und mein Apache nimmt auch nur &.
Im Zweifelssfall wäre mein regex aber schnell umgeschrieben und die 
foreach-Schleife sollte es in jedem Fall bringen :-).
> 
> ein is_numeric über die $_REQUEST keys wäre wohl am praktischsten ...
Meine Version mit get_defined_vars gefällt mir aber noch besser. Denn 
wenn Register Globals aus sind, dann sollte es schneller gehen.
Wobei man natürlich mit einem ini_get auch einfach prüfen kann, ob 
register_globals an sind und die Prüfung ggf. wegfallen lassen kann.

Wenn man noch Arrays im Request verwendet, ist vielleicht ein rekursiver 
check auch ganz nützlich:
array_walk_recursive($_REQUEST,create_function('$a,$b','if 
(is_numeric($a)) exit("nö");'));
> 
>> Ansonsten kann man natürlich auch einfach bestimmten Code vermeiden. Zum 
>> Beispiel "deren" Beispielcode:
>>
>> [...]
> 
> Da gibt es auch wesentlich verbreiterten Code wo das zutrifft, der
> gezeigte war wohl nur der kürzeste.
Das heisst ja nicht, dass man solchen Code bei seinen eigenen Projekten 
nicht vermeiden kann.
Ich halte es eh für fraglich, ob es eine gute Idee ist die 
unset-Funktion auf diese Weise zu nutzen.
Es erhöht nämlich nicht gerade die Lesbarkeit des Codes, wenn irgendwo 
am Anfang einer php-Datei bestimmte Variabeln geunseted werden, auf die 
dann wo ganz anders wieder zugegriffen wird.
> 
> Besonders da man ja nicht garantieren kann das auf allen Systemen
> register_globals=off ist.

Nö, aber darum geht es ja gerade. Systeme, auf denen 
register_globals=off sind, sind ja sowieso nicht betroffen.



Yannik

php::bar PHP Wiki   -   Listenarchive