2016-07-18 2 views
1

PHP에서 Zend Framework 2의 세션 관리자로 작업 중이며 세션 데이터를 직렬화 해제하여 데이터 저장 방법을 변경할 수 있습니다. 나는 정규식이 그것을 할 수있는 방법이라고 생각했지만 정규 표현식이이 유형의 문자열에 적합한 지 확인하는 방법을 알 수 없다.문자열 내에서 PHP 직렬 데이터를 일치시키는 Regex

샘플 입력 :

__ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxxxxxxxxxxxxxxx";}}initialized|C:23:"Zend\Stdlib\ArrayObject":403:{a:4:{s:7:"storage";a:3:{s:4:"init";i:1;s:10:"remoteAddr";s:13:"127.000.00.01";s:13:"httpUserAgent";s:114:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";}s:4:"flag";i:2;s:13:"iteratorClass";s:13:"ArrayIterator";s:19:"protectedProperties";a:4:{i:0;s:7:"storage";i:1;s:4:"flag";i:2;s:13:"iteratorClass";i:3;s:19:"protectedProperties";}}} 

예상 출력 :

'__ZF|a:2:{s:20:"_REQUEST_ACCESS_TIME";d:1099999999.9999999999999999999999;s:6:"_VALID";a:1:{s:25:"Zend\Session\Validator\Id";s:26:"xxxxxxxxxxxxxxxxxxxxxxxxxx";}}' 
'initialized|C:23:"Zend\Stdlib\ArrayObject":403:{a:4:{s:7:"storage";a:3:{s:4:"init";i:1;s:10:"remoteAddr";s:13:"127.000.00.01";s:13:"httpUserAgent";s:114:"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";}s:4:"flag";i:2;s:13:"iteratorClass";s:13:"ArrayIterator";s:19:"protectedProperties";a:4:{i:0;s:7:"storage";i:1;s:4:"flag";i:2;s:13:"iteratorClass";i:3;s:19:"protectedProperties";}}}' 

내가 뭘하려 :

내가 붙어
$pattern = '/\w+\|.*?}}+/'; // this works for the sample input, but may be too general and certainly won't work for serialized data without a nested array 
$pattern = '/\w+\|(a:\d+:{.*?}|o:\d+:\"[a-z0-9_]+\":\d+:{.*?})/'; // doesn't capture the `initialized` data 

:

은 일반적으로 말하면, 내가 수 ' 가장 좋은 길을 찾아 내라. initialized 데이터의 __ZF 데이터를 분리합니다 (특히 세션에 다른 비 Zend 변수가있는 경우). 특히, 직렬화 된 데이터를 가져 오기 위해 사용할 정규식을 파악할 수 없습니다.

RegexPlanet에 예제를 넣으려고했으나 인터페이스를 알아 내지 못했으며 기괴한 결과 만 나타났습니다.

$text = ""; 
foreach ($_SESSION as $key => $value) { 
    $text .= $key . "|" . serialize($value); 
} 

을 ...하지만 그 소스 코드를 발견하지 않았습니다 : 도움이된다면, 나는 꽤 확실 ZF PHP는 다음과 같이 직렬화 된 세션 데이터를 생성입니다.

+0

직렬화시 JSON 형식으로 작업하는 것처럼 보입니다. Regex의 문제를 공격하는 대신 JSON을 사용하려고 시도 했습니까?! –

+0

@RodrigoGomes 이것이 JSON이라는 것을 알지 못했습니다. 하지만 JSON은 특정 형식 지정 스타일에 대한 단어 일뿐입니다. 특히, 올바르게 이해한다면 분리하려는 데이터 부분은 JSON이 아닙니다. JSON은 어떻게 사용합니까? – Miryafa

+0

가장 좋은 방법은 [session_decode] (http://php.net/manual/en/function.session-decode.php#113523)와 관련된 것일 수 있습니다. – melpomene

답변

1

ini_set ('session.serialize_handler', 'php_serialize')에 대해 알아 냈습니다. 그것은 대체 대신 PHP의 일반적인 serialize 메서드를 사용하여 직렬화를 변경하여 문제를 해결합니다. - Miryafa

관련 문제