Benim $ _SESSION veri ile PHP __ PHP_Incomplete_Class Nesne

6 Cevap php

Ben sayfa yük, SafeString nesneler içine tüm kullanıcı sunulan dizeleri döner, bir site kurulum var. SafeString aşina olanlar için, bu temelde XSS ve etajer önlenmesi dezenfekte verileri yankı kullanıcıyı zorlar ..

Her neyse, bir sorun var. Benim $ _SESSION dizi __PHP_Incomplete_Class Object ile dolduruluyor. Okuduğum kadarıyla, bu oturumundan önce sınıf başlatılıyor ve sonra oturumunda sınıf nesneleri saklamak değil kaynaklanmaktadır.

İşte benim kod:

require_once __WEBROOT__ . '/includes/safestring.class.php'; 

$temp = array
(
   &$_SERVER, &$_GET, &$_POST, &$_COOKIE,
   &$_SESSION, &$_ENV, &$_REQUEST, &$_FILES,
   &$HTTP_SERVER_VARS, &$HTTP_GET_VARS,
   &$HTTP_POST_VARS, &$HTTP_COOKIE_VARS,
   &$HTTP_POST_FILES, &$HTTP_ENV_VARS
); 

function StringsToSafeString(&$array)
{
   foreach ($array as $key => $value)
   {
      if (is_string($array[$key]))
      {
         $array[$key] = new SafeString($value);
      } 

      if (is_array($array[$key]))
      {
         StringsToSafeString($array[$key]);
      }
   }
}

StringsToSafeString($temp);

unset($temp);

Ben sorunu çözmek hangi bu yeniden yazmak için bir yol düşünemiyorum :/

Herhangi bir fikir?

6 Cevap

Eğer $_SESSION, sadece oturumunda okunan verilerin geçerli betiğin kopyasını değiştirerek değil erişirken olduğunuzda, SafeString geri aktif oturum içine nesneleri yazıyoruz.

Ama oturumda özel nesneleri koyarak tehlikeli ve ben genellikle önlemek için deneyin bir şeydir. Eğer session_start çağırmadan önce söz sınıfı tanımladık var bunu yapmak mümkün; Eğer yoksa, PHP'nin oturum işleyicisi bu sınıfın örneklerini deserialise nasıl bilemezsiniz, ve __PHP_Incomplete_Class Object ile bitireceğiz.

Yani oturumu frobbing kaçının. Bu yaklaşım gerekiyorsa, yerel bir $mysession diziye $_SESSION gelen verilerin bir kopyasını yapmak. Ancak, ben bir SafeString fikrine tehlikeli ve kullanışsız olduğunu düşünüyorum söylemek gerekir; Bu yaklaşım hiç su geçirmez olacak sanmıyorum. Ham bir metin dizesi 'güvenli olup olmadığını nereden geldi ile ilgisi olduğunu, bu hedef bağlamında için kodlamak nasıl bir özelliğidir.

Bu tür veritabanı, ya da bir dosya veya komut dosyası kendi içinde hesaplanan gibi farklı bir kaynaktan başka bir metin dizesi alırsanız, bu kullanıcıdan gelen bir dize tam olarak aynı kullanım ihtiyacı var: olması gerekiyor {[(0) }] ed. Zaten o kaçış yazmak zorunda gidiyoruz; safestring Sana hiçbir şey kazanır. Eğer farklı bir hedef biçime dize göndermek gerekiyorsa, farklı bir kaçış gerekir.

Sen bir kullanışlı kutu içine tüm dize işleme sorunları saklanması değil ve onları tekrar düşünmek asla; bu dizeleri nasıl sadece değil.

Sen sadece aramadan önce safestring.class.php içermek zorunda session_start() Eğer $_SESSION değişkeni SafeString nesneleri okumak istediğinizde:

<?php

require_once __WEBROOT__ . '/includes/safestring.class.php';    
session_start();

print_r($_SESSION);

PHP framework kullanıyorsanız ve evet, (muhtemelen) çağrıları session_start() içten, emin olun ki require_once sınıf dosyası önceden (kullanım kanca veya ne olursa olsun çerçeve sağlar mekanizmaları).

Ben sadece böyle bir şey ele. Sonunda benim sipariş berbat nasıl bulmak için bana saat sürdü.

Ben uyumsuz çağrılan bir dosya vardı.

myFile.php

Bu dosya aşağıdaki içeriyordu ..

$result = include ("myOtherFile.php");
return $result;

Myotherfile.php böyle bir şey vardır

require_once "lib/myClassLibs.php";
require_once "webconfig.php";

webconfig.php içinde session_start () çağrısı vardı.

Lib / myClassLibs tüm sınıf bilgi init vardır. Eğer WebConfig çağrısından önce kontrol ederseniz, sınıf mevcut olduğunu görebilirsiniz.

Eğer WebConfig çağrısından önce kontrol ederseniz, aynı zamanda oturum zaten başlamış olduğunu göreceksiniz. Eğer lib / myClassLibs.php önce kontrol ederseniz, oturumu zaten başlamış olduğunu göreceksiniz.

Eğer MyOtherFile.php şunlardır önce myFile.php kontrol, oturum başlamamıştır bulabilirsiniz.

Bu beni onunla işe yaramaz olmadan son 8 yıl boyunca çalıştı eski kod temsil etti. Ben "MyOtherFile.php" dışında içerir çekti. Şimdi benim oturumları düzgün eşzamanlı vardır.

Lukman cevabı doğrudur. Ama zaten söz söz, yani görünüşte bir nedenle, oturum başlamadan önce sınıfını başlatamazsınız.

You may want to check if sessions start automatically in the php config: http://www.php.net/manual/en/session.configuration.php#ini.session.auto-start

If they are and yu cant help that, you may want to check if you can have your classes autoloaded prior to that: http://php.net/manual/en/language.oop5.autoload.php

If all else fails, you can still serialize the objects before you store them in a session, and unserialize them each them you retrieve them: http://php.net/manual/en/function.serialize.php

Ben size değişkenleri saklamak kodunuzu görmüyorum, ama bu gibi bir şey olurdu

$mystuff = unserialize($_SESSION["mystuff"]);
$mystuff->dostuff();
$_SESSION["mystuff"] = serialize($mystuff);

Eğer değişkenleri unserialize önce sınıf tanımı yüklemek için emin olun

$2c, *-pike

Benim php dosyasının üstündeki __autoload fonksiyonu da dahil olmak üzere bu sorunu çözdü. Yani bu gibi görünüyor:

<?php 
require_once("path/to/include.inc");

//Needed for serialization/deserialization
function __autoload($class_name) {
    include "path/to/". $class_name . '.php';
}

PHP 5, bu fonksiyon gerekli değil ama bu işlevi kullanılır kadar sıkışmış oldu. Bu başkası yardımcı olur umarım!

Sadece çağrı olabilir,

session_start();
session_start();

iki kez kodu. Kez diyoruz. Tekrarlar için gerekli php sınıfları kontrol edin. Bu benim için bir düzeltme oldu.