Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Unserialize klappt bei meinem array nicht

Frage Entwicklung PHP

Mitglied: coltseavers

coltseavers (Level 2) - Jetzt verbinden

26.05.2010, aktualisiert 28.05.2010, 4315 Aufrufe, 8 Kommentare

Ich habe folgendes Problem:

Ich möchte in einem Formular ein Array per POST übergeben.
Dazu gehe ich her und mache folgendes:
(Formularübetragungsmethode ist post)
01.
<? 
02.
	$serialisiertesarray = serialize ($irgendeinarray); 
03.
	print("<input type=\"hidden\" name=\"arraydaten\" value=".$serialisiertesarray .">"); 
04.
?> 
In dem aufgerufenen Skript gehe ich nun her und mache folgendes:
01.
<? 
02.
	print("Array: ".$_POST["arraydaten"]); 
03.
?> 
In diesem Moment wird mir der aus dem Array erzeugte String angezeigt:
a:3:{i:0;s:6:\"200027\";i:1;s:6:\"200028\";i:2;s:6:\"200031\";}

Für mich macht das den Eindruck, als sei bis zu dieser Stelle alles so, wie es sein soll.

Dann mache ich folgendes:
01.
<? 
02.
	$neuesarray = unserialize ($_POST["arraydaten"]); 
03.
	$i = count($neuesarray); 
04.
?> 
Die Variable $i hat komischerweise den Wert 1, und nicht 3.

Folgende Prüfung gibt entsprechend auch die Fehlermeldung aus:
01.
<? 
02.
	if(!is_array($neuesarray)){	 
03.
		print("Fehler bei array-erzeugung!"); 
04.
05.
?> 

Was läuft da falsch?
Ist mein PHP auf dem Server nicht korrekt konfiguriert?
Einen Fehler im Code halte ich inzwischen nämlich für recht unwahrscheinlich - er ist ja recht übersichtlich, und ich hab schon so'n paar Stunden versucht und nachgelesen...

Wäre für qualifizierte Vorschläge sehr dankbar!

Colt Seavers
Mitglied: chr-fritz
27.05.2010 um 01:12 Uhr
Was zeigt denn var_dump() für den Unserialisierten Array an?

01.
var_dump(unserialize($_POST['arraydaten']));
Bitte warten ..
Mitglied: coltseavers
27.05.2010 um 03:08 Uhr
ein var_dump gibt aus: bool(false)
Bitte warten ..
Mitglied: coltseavers
27.05.2010 um 03:30 Uhr
Fehler gefunden!

diese zeile
$neuesarray = unserialize ($_POST["arraydaten"]);

habe ich wie folgt geändert:
$neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));

Damit werden die Backshlashes aus dem String entfernt und das Array wird auch wieder als solches erkannt und verwertbar...
Habs in nem Buch gefunden...
Bitte warten ..
Mitglied: chr-fritz
27.05.2010 um 11:57 Uhr
Ich würde dir aber trozdem raten den "stripshlashes()" nicht zu verwenden, da der Fehler durch die Konfigurationsoptionen "magic_quotes_gpc" und "magic_quotes_runtime" welche auf "on" gestellt sind zurück zu führen ist. http://de2.php.net/manual/de/info.configuration.php#ini.magic-quotes-gp ...

Daher würde ich überprüfen ob eine der beiden Optionen auf "on" bzw. "true" gestellt ist, und die Arrays "$_POST", "$_GET", "$_REQUEST" evtl. auch "$_COOKIE" und "$_FILES" rekursiv mit "stripslashes()" behandeln.

Ohne dies wirst du spätestens auf einem System auf welchem eine der beiden Optionen eingeschaltet ist das gleiche Problem wieder erhalten.
Bitte warten ..
Mitglied: coltseavers
27.05.2010 um 12:51 Uhr
Hi Fritz,

vielen Dank für die Antwort!
"magic_quotes_gpc" war tatsächlich auf on, das hab ich dann gleich mal abgeschaltet.
(muß man erstmal drauf kommen, dass es so ne einstellung überhaupt gibt!)

ich hab nun aber deinen ratschlag nicht ganz verstanden.
im ersten satz schreibst du ich solle stripslashes() nicht verwenden, im zweiten rätst du aber dazu.

meine meinung: man kann die funktion beim deserialisieren auch weiterhin mitbenutzen - schaden tut sie ja nicht, und wenn man - wie du schon sagtest - den server wechselt - vermeidet das probleme. oder wie würdest du den code schreiben, wenn du per POST ein array übergeben wolltest?
Bitte warten ..
Mitglied: chr-fritz
27.05.2010 um 16:08 Uhr
Hallo,

falls die Funktion weiterhin benutzt wird kann es passieren, dass auf einem System bei dem "magic_quotes_gpc" aus ist, der Serialisierte String zerstört wird. Daher habe ich hierzu eine Funktion welche einen Array rekursiv durchgeht und jedes Element mittles "stripslashes()" behandelt. Sie sieht ungefär so aus:
01.
function stripslashesRecursive($array){ 
02.
  $newArray=array(); 
03.
  foreach($array as $key=>$val){ // gehe jedes Element des Arrays durch 
04.
    if(is_array($val)) $newArray[$key]=stripslashesRecursive($val); // Überprüfe ob $val ein Array ist und für die Funktion ein weiteres mal aus (Rekursion) 
05.
    else $newArray[$key]=stripslashes($val); // Ist $val kein Array wird stripslashes() ausgeführt und unter $key im Array $newArray gespeichert. 
06.
07.
  return $newArray; // Gib den neuen Array zurück 
08.
}
Sollte nun "magic_quotes_gpc" auf "on" stehen, führe ich für z.B. "$_POST" den folgenden Code aus:
01.
if(get_magic_quotes_gpc() == 1 || get_magic_quotes_runtime() == 1) { 
02.
$_POST=stripslashesRecursive($_POST); 
03.
// das selbe für $_GET, $_REQUEST usw. 
04.
}
Das ganze mache ich bevor ich irgend wie die Werte aus diesen Variablen verwende. Somit haben die Werte immer das richtige Format.

Allerdings würde ich zusätzlich den Array noch mittles Base64 Codieren, um weiteren Problemen bei der Übertragung vorzubeugen.
Bitte warten ..
Mitglied: coltseavers
28.05.2010 um 02:51 Uhr
Hallo,

hm, warum denn so kompliziert?
Man kann auch einfach beim deserialisieren diese Zeile nehmen
01.
  
02.
<? 
03.
$neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));  
04.
?>
sind die "magic_quotes_gpc" auf "on" korrigiert stripslashes() den string, sodass wieder ein array daraus wird.
sind die "magic_quotes_gpc" auf "off" nimmt stripslashes() keine änderungen vor.

so, wie ich das sehe, kann man also stripslashes() einfach vorsichtshalber mit einbauen. schaden tuts nicht, und beide fälle sind abgedeckt...
Bitte warten ..
Mitglied: chr-fritz
28.05.2010 um 16:58 Uhr
Zitat von coltseavers:
Man kann auch einfach beim deserialisieren diese Zeile nehmen
01.
  
02.
> <? 
03.
> $neuesarray = unserialize(stripshlashes($_POST["arraydaten"]));  
04.
> ?> 
05.
> 
sind die "magic_quotes_gpc" auf "on" korrigiert stripslashes() den string, sodass wieder ein array daraus
wird.
sind die "magic_quotes_gpc" auf "off" nimmt stripslashes() keine änderungen vor.
Doch "stripslashes()" führt immer Änderungen durch egal wie "magic_quotes_gpc" eingestellt ist. Daher muss es abgefragt werden ob die Slashes entfernt werden müssen oder nicht.

Im folgenden Beispiel sieht man was passiert sollten in den Array-Werten eine der Folgenden zeichenfolgen auftreten: \' bzw. \"
01.
$a=array('asdf\"asdf',"asdf'\'asdf"); 
02.
$s=serialize($a); 
03.
echo $s
04.
var_dump(unserialize($s)); 
05.
var_dump(unserialize(stripslashes($s)));
Wie man sieht wird erst der Serialisierte String ausgegben. Beim zweiten die Ausgabe des Arrays. Die Dritte ausgabe wird mit einem Fehler quitiert. D.h. einfach Blind "stripslashes()" kann unter bestimmten umständen zu Fehlern führen, falls "magic_quotes_gpc" ausgeschaltet ist.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Leere Array-Werte aus einem Array entfernen
gelöst Frage von ToniHoBatch & Shell3 Kommentare

Hallo zusammen, ich bin dabei ein Powershell-Script zu schreiben, welches diverse Reports generieren kann. Für die Eingabe von SamAccountNames ...

Batch & Shell
Array oder Object oder wie soll ich das machen
gelöst Frage von Druide83Batch & Shell4 Kommentare

Hallo, mal wieder verzweifelt. Wahrscheinlich ist die Lösung einfach, aber ich habe gerade keinen Kopf mehr zum klar denken. ...

Batch & Shell
Wert aus Array ausschliessen PowerShell
gelöst Frage von ivaylo53Batch & Shell2 Kommentare

Guten Morgen Community, irgendiwe komme ich bei diesem Problem nicht weiter. Ich habe Zwei Objekte $alCSVUser und $alADUser. Diese ...

PHP
PHP Array SELECT möglich
gelöst Frage von rumbleDomPHP1 Kommentar

Hallo Gemeinde, warscheinlich sehe ich den Wald vor lauter Bäumen mal wieder nicht. Kurzer Tipp wäre daher hilfreich :) ...

Neue Wissensbeiträge
Batch & Shell

Open Object Rexx: Eine mittlerweile fast vergessene Skriptsprache aus dem Mainframebereich

Information von Penny.Cilin vor 14 StundenBatch & Shell8 Kommentare

Ich kann mich noch sehr gut an diese Skriptsprache erinnern und nutze diese auch heute ab und an noch. ...

Humor (lol)

"gimme gimme gimme": Automatischer Test stolpert über Easter Egg im man-Tool

Information von Penny.Cilin vor 16 StundenHumor (lol)6 Kommentare

Interessant, was man so alles als Easter Egg implementiert. Ist schon wieder Ostern? "gimme gimme gimme": Automatischer Test stolpert ...

MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 1 TagMikroTik RouterOS8 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 1 TagSicherheit1 Kommentar

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Heiß diskutierte Inhalte
Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server17 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...

Windows 10
Bitlocker nach Verschlüsselung nicht mehr aufrufbar!
gelöst Frage von alexlazaWindows 1013 Kommentare

Hallo, ich besitze ein HP ZBook 17 G4 mit einem Windows 10 Pro Betriebssystem. Bei diesem Problem handelt sich, ...

Batch & Shell
Neuste Datei via PowerShell kopieren
gelöst Frage von kaiuwe28Batch & Shell11 Kommentare

Hallo zusammen, ich hatte mir mit Hilfe der Suche im Forum einen kleinen Code von colinardo rausgesucht und versucht ...