anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mo 09 Jun, 2025 13:46

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: function is_serialized()
BeitragVerfasst: Sa 11 Jul, 2009 23:48 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 02:45 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 02 Feb, 2009 21:11
Beiträge: 168
Geschlecht: Männlich
LoGD: salator.selfhost.de/lotgd
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);

_________________
if(date("ymmd")=="10050502") echo("Der alte Sack wird heute 40");


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 10:27 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
Huch, da is mir wohl irgendwo n Fehler unterlaufen. Danke, ich werds mal umschreiben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 11:23 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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;
}


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 15:07 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
Dir ist aber schon klar, das die Überprüfung per regulärem Ausdruck wahrscheinlich rechenintensiver als eine simple Fehlerunterdrückung oder -Behandlung ist, oder?

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 15:53 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 18:51 
Offline
Großmeister
Großmeister

Registriert: Mi 15 Dez, 2004 00:41
Beiträge: 467
Wohnort: München
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.

_________________
A bus station is where busses stop. A train station is where trains stop. On my desk there is a workstation...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 19:24 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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) ^^


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 21:34 
Offline
Freak
Freak

Registriert: So 30 Okt, 2005 17:48
Beiträge: 1408
Wohnort: PB
Geschlecht: Männlich
LoGD: http://dav.blood-reaver.de/lotgd/
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

_________________
Mehr oder minder inaktiv


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 21:59 
Offline
Großmeister
Großmeister

Registriert: Mi 15 Dez, 2004 00:41
Beiträge: 467
Wohnort: München
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. ;)

_________________
A bus station is where busses stop. A train station is where trains stop. On my desk there is a workstation...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: function is_serialized()
BeitragVerfasst: So 12 Jul, 2009 22:19 
Offline
Profi
Profi

Registriert: Mo 30 Okt, 2006 21:29
Beiträge: 195
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 ^^


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum