anpera.net
https://anpera.dyndns.org/phpbb3/

function is_serialized()
https://anpera.dyndns.org/phpbb3/viewtopic.php?f=34&t=4950
Seite 1 von 1

Autor:  Welv [ Sa 11 Jul, 2009 23:48 ]
Betreff des Beitrags:  function is_serialized()

Da ich ne Funktion brauche die mir folgendes ohne NOTICE-Fehler ausgibt...
PHP:
if(is_array(unserialize($str))) $str=unserialize($str);

...habe ich mir folgendes geschrieben

PHP:
<php

function is_serialized($str){
//Prüft ob ein String mit serialize() serialisiert wurde
//regex: fängt mit s an, :, beliebig viele zahlen, :, " oder {, beliebig viele Zeichen, hört mit ; oder } auf
if(preg_match("/^s:[\d+]:[\"|\{].*(\;|\})$/", $str)) return true;
else return false;
}



//Beispiel:

$array=array("bla",1,array("asdf","fdsa"));

$str=serialize($array);

if(is_serialized($str)) $array=unserialize($str);

?>


Vielleicht braucht sie ja jemand oder hat Verbesserungsvorschläge.

Autor:  Salator [ So 12 Jul, 2009 02:45 ]
Betreff des Beitrags:  Re: function is_serialized()

Einspruch! Wenn du ein Array serialisierst ist das erste Zeichen mit ziemlicher Sicherheit ein a, gefolgt von einem Doppelpunkt und der Anzahl der Elemente.

$array=array("bla",1,array("asdf","fdsa"));
$str=serialize($array);
output($str);

Wenn dein erstes Zeichen ein s ist, hast du eine String-Variable serialisiert.

$array="test";
$str=serialize($array);
output($str);

Vielleicht hast du auch eine doppelte Serialisierung drin:

$array=array("bla",1,array("asdf","fdsa"));
$str=serialize($array);
$str=serialize($str);
output($str);

Autor:  Welv [ So 12 Jul, 2009 10:27 ]
Betreff des Beitrags:  Re: function is_serialized()

Huch, da is mir wohl irgendwo n Fehler unterlaufen. Danke, ich werds mal umschreiben.

Autor:  Welv [ So 12 Jul, 2009 11:23 ]
Betreff des Beitrags:  Re: function is_serialized()

Neben
a für array und
s für string, hab ich auch
i für integer,
b für, ich denke mal, bool (true/false) und
d für dezimal? keine ahnung, auf jeden fall für zahl mit kommastelle,
gefunden.

PHP:
function is_serialized($in){
//Prüft ob ein String mit serialize() serialisiert wurde
if(is_string($in)){
$array="^a:\d+:\{.*(;})$";
$integer="^i:\d+;$";
$dezimal="^d:\d+\.\d+;$";
$string="^s:\d+:\".*(\";)$";
$bool="^b:(0|1);$";
if(preg_match("/(".$array.")|(".$integer.")|(".$dezimal.")|(".$string.")|(".$bool.")/", $in)) return true;
else return false;
}else return false;
}

Autor:  Auric [ So 12 Jul, 2009 15:07 ]
Betreff des Beitrags:  Re: function is_serialized()

Dir ist aber schon klar, das die Überprüfung per regulärem Ausdruck wahrscheinlich rechenintensiver als eine simple Fehlerunterdrückung oder -Behandlung ist, oder?

Autor:  Eliwood [ So 12 Jul, 2009 15:53 ]
Betreff des Beitrags:  Re: function is_serialized()

Nur so ne Frage. Was spricht eigentlich dagegen, einfach die ersten zwei Buchstaben zu überprüfen? (Und was machst du, wenn ein Objekt serialisiert wurde? ;o)

$this->bbcode_second_pass_code('', '
$type = NULL;
if($var{1} == ':') {
if($var{0} == 'a') $type = 'array';
elseif($var{0} == 's') $type = 'string';
}

if($type !== NULL) return true;
else return false;')

PS: English für "Dezimalzahl" ist float. und f dürfte auch der entsprechende Buchstaben sein...

Autor:  Chaosmaker [ So 12 Jul, 2009 18:51 ]
Betreff des Beitrags:  Re: function is_serialized()

Probiers doch damit:

$this->bbcode_second_pass_code('', '$check = serialize(false);
if ($deineTolleVariable == $check || ($temp = @unserialize($deineTolleVariable)) !== false) {
$deineTolleVariable = $temp;
}')

Spart die ganze Rumgeparserei und erschlägt hoffentlich alle Fälle.

Autor:  Welv [ So 12 Jul, 2009 19:24 ]
Betreff des Beitrags:  Re: function is_serialized()

Ich dachte dieses
PHP:
@unserialize($deineTolleVariable)
schon versucht zu haben, was mir eine NOTICE brachte. Hab wohl irgendwo nen Fehler gemacht.

Aber grundsätzlich wollt ich halt einfach was ohne Unterdrückung schreiben :D


Chaosmaker hat geschrieben:
Nur so ne Frage. Was spricht eigentlich dagegen, einfach die ersten zwei Buchstaben zu überprüfen? (Und was machst du, wenn ein Objekt serialisiert wurde? ;o)


Wenn ein string mit a:... anfängt, muss es ja nicht unbedingt ein serialisierter sein. Wollts nur so genau wie möglich überprüfen.

Stimmt, an Objekte hab ich noch ned gedacht, werd ich auch ned.


Naja. wer will darfs behalten. Ich bleib nu doch bei @unserialize($var) ^^

Autor:  Auric [ So 12 Jul, 2009 21:34 ]
Betreff des Beitrags:  Re: function is_serialized()

Wenn du bei @ bleibst, kannst du es auch in etwa so machen:
$this->bbcode_second_pass_code('', 'function try_unserialize($data) {
$pre_err = error_get_last();
$uns = @unserialize($data);
$err = error_get_last();
if(!empty($err) || $err["line"] == $pre_err["line"]) {
$uns = $data;
}
return $uns;
}')
Wobei der Abgleich mit unserialize(false) auch eine alternative ist. Leider wirft PHP bei soetwas keine verwertbare Exception, sonst ließe sich das ganze deutlich eleganter verarbeiten!

Auric

Autor:  Chaosmaker [ So 12 Jul, 2009 21:59 ]
Betreff des Beitrags:  Re: function is_serialized()

Mit error_get_last funktionierts aber nur einmal - beim 2. unserialize (vorausgesetzt, daß zwischendurch nicht ein anderer Fehler auftrat) ist $err["line"] == $pre_err["line"] nämlich true (und !empty($err) muß natürlich empty($err) heißen, aber das ! war vmtl. nur ein Flüchtigkeitsfehler).

@Welv: Bei Dir fehlte eben das @ davor, das für eine Fehlerunterdrückung sorgt, deshalb erschien die NOTICE-Meldung. Das ist in meinem kleinen Vierzeiler schon aus gutem Grund enthalten. ;)

Autor:  Welv [ So 12 Jul, 2009 22:19 ]
Betreff des Beitrags:  Re: function is_serialized()

Zitat:
@Welv: Bei Dir fehlte eben das @ davor, das für eine Fehlerunterdrückung sorgt, deshalb erschien die NOTICE-Meldung. Das ist in meinem kleinen Vierzeiler schon aus gutem Grund enthalten.


@Welv wäre gut gewesen, dann hätte es meinen Fehler vielleicht unterdrückt den ich bim Versuch mit @unserialize() begangen hab ;) Is mir nämlich schon klar wie das funzt, aber wie gesagt, hab wohl was falsch gemacht und deswegen ne NOTICE bekommen. Vielleicht hatte die auch garnichts damit zu tun, war viel drumrum ^^

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/