2016-10-05 21 views
7

Bulduğum bazı garip davranışlar - ilgimi çeker - bu konuda herhangi bir ışık tutabilir mi ..?

boşaltmak için $_SESSION dizide sonuçlanan bir hatanın nedenini bulmak bu sabah biraz zaman geçirdi

Bakış. Sonunda bunun altına aldık ve $_SESSION değişkenlerden biri için bir dizin tanımlarken, bir & yerine . ait concatination için kullanılan edildiğini gördük. Yalnızca iki özel dizenin & ed olduğu zaman bozuldu, diğer dizeler anlamsız anahtarlarla sonuçlandı, ancak $_SESSION boş bırakılmadı.

Bu, PHP5.5.9-1ubuntu4.20 ve yerel olarak PHP5.6.15 üzerinde çalışıyor.

Kendiniz deneyin! Aşağıdaki örnek kodu kullanarak

,

  1. Run set session.php
  2. Run check-session.php - tüm iyi
  3. Run kırılma session.php - tekrar hala iyi şimdiye kadar ...
  4. Run check-session.php-$_SESSION şimdi boş!

örnek kod

ayar session.php

session_start(); 

$_SESSION = [ 
    'colour' => 'blue', 
    'shape' => 'round', 
    'size' => 'medium' 
]; 

ara session.php

session_start(); 

echo '<pre>'; 
print_r($_SESSION); 

kırılma session.php

session_start(); 

$killer_string = 'Admin_CH_1_' & '101_'; 
$_SESSION[$killer_string] = null; 

echo '<pre>'; 
print_r($_SESSION); 

Benim tahminim tahmin ediyorum

o $_SESSION depolamak çalıştığında sinirlenmeye PHP neden bu durumda $killer_string bir dizesinde bitsel işlem sonuçları, sonucu, sunucudaki dizi. $killer_string, $_SESSION içinde bir alt dizi için bir anahtar olarak kullanıldığında artık bir katil değildir.

Fikirler?

PHP ile hiçbir arıza yok yani kod aslında mantıklı değil biliyoruz. Ancak, sahnelerin ardında neler olup bittiğini merak ediyorum ve buna neyin sebep olduğu konusunda endişelerim var ...

Şerefe!

+1

Var_dump ($ killer_string); '? Vermeler '☺! Ben – AbraCadaver

+2

Hangi PHP sürümünü kullanıyorsunuz? Ben sadece 5.6.25 ile test ettim ve $ killer_string, @AbraCadaver –

+1

'a benzer bir dizgiye sahip bir dizi anahtar olarak ayarlandı Ben de php-7 – arkascha

cevap

5

İşte basitleştirilmiş test durumu (see it in action) var:

<?php 
header('Content-Type: text/plain'); 
ob_start(); 

session_start(); 
$_SESSION = [ 
    'colour'    => 'blue', 
    'shape'    => 'round', 
    'size'     => 'medium', 
    //'Admin_CH_1_' & '101_' => 'Gone', 
    chr(0x01) . chr(0x20) . chr(0x21) . chr(0x49) => 'Gone', 
]; 
var_dump($_SESSION); 
session_write_close(); 

session_start(); 
var_dump($_SESSION); 
ob_end_flush(); 

Eğer oturum dosyayı incelemesi Eğer sıfır bayt vardır görebilirsiniz.

En iyi tahminle şimdiye kadar (birisi daha akıllı hisselerin kadar belirli iç elemanlar PHP github repo bir bağlantı) yanlışlıkla oturumu seri kodu sınırlarını zorluyoruz olmasıdır. Bu kod, anahtarların ikili olmayan dizeler olduğunu varsayar. Belli bir doğrulama (saf sayısal tuşlar Sayısal anahtarını atla bildirimini tetikler) ancak tüm hatalı biçimlendirilmiş girdileri kapsamaz. Bir noktada sadece çöker. session.serialize_handler documentation yılında

ini_set('session.serialize_handler', 'php_serialize'); 

biz okuyabilir:

Bu

sorunu giderir seri yöntemini değiştirerek gerçeği tarafından desteklenen alır Yaşlı

işleyicileri sayısal indeksi ne de dize depolayamıyor serialize dizini, $_SESSION numaralı özel karakterleri (| ve!) içerir. komut dosyasında sayısal dizini veya özel karakter hatalarını önlemek için php_serialize kullanın. Varsayılan değerler php.

+0

Cevabınız için teşekkür ederiz. Bu davranış zaten SO üzerinde olduğunu ortaya çıkar, sadece aramak için zor bir şey! – Steve

İlgili konular