Oturumları el ile çözmek için gönderilen çözümlerin (php.net) mükemmel olmadığını fark ettim, bu yüzden daha sağlam bir çözüm sağladım.
Preg_match çözümü asla çalışmaz. Sıra dışıleşmeyi kıracak bir dava bulmak o kadar da zor değil. Benim çözüm bulabilirsiniz
$_SESSION["test"] = ";oops|";
: jason-joeymail durumunda üzerine kırılır. Düzenli bir ifade kullanmaz, serileştirme işleminin tersine çevrilebilirliği ve serileştirilen 'özellik', tamamlandığını düşündüğünde tüm diğer girdileri yok sayar. Bu hiçbir şekilde güzel ya da özellikle hızlı bir çözüm değildir, ancak daha sağlam bir çözümdür. "php" ve "php_binary" için bir desperizer ekledim. "Wddx" için bir tane eklemek önemsiz olmalı.
class Session {
public static function unserialize($session_data) {
$method = ini_get("session.serialize_handler");
switch ($method) {
case "php":
return self::unserialize_php($session_data);
break;
case "php_binary":
return self::unserialize_phpbinary($session_data);
break;
default:
throw new Exception("Unsupported session.serialize_handler: " . $method . ". Supported: php, php_binary");
}
}
private static function unserialize_php($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
if (!strstr(substr($session_data, $offset), "|")) {
throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
}
$pos = strpos($session_data, "|", $offset);
$num = $pos - $offset;
$varname = substr($session_data, $offset, $num);
$offset += $num + 1;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
private static function unserialize_phpbinary($session_data) {
$return_data = array();
$offset = 0;
while ($offset < strlen($session_data)) {
$num = ord($session_data[$offset]);
$offset += 1;
$varname = substr($session_data, $offset, $num);
$offset += $num;
$data = unserialize(substr($session_data, $offset));
$return_data[$varname] = $data;
$offset += strlen(serialize($data));
}
return $return_data;
}
}
Kullanımı:
Session::unserialize(session_encode());
Bu el kitabında ilk yanıtı kullandım. Bu cevaba doğrudan bir bağlantı eklemek için gönderimi düzenledim. –
Gönderilen çözümler php.net'in ciddi bir kusuru olduğunu fark ettim. Düzenli bir ifadenin kullanılmasını engelleyen kendi çözümüme katkıda bulundum. Ben de burada yayınlayacağım. – Halcyon