본문 바로가기

개발하자

Python PHP 세션 직렬화 해제

반응형

Python PHP 세션 직렬화 해제

나는 PHP 세션 데이터를 파이썬에서 와 모듈(에서 가져온 것)을 사용하여 비활성화하려고 노력해 왔지만, 나에게는 불가능해 보인다.

두 모듈 모두 PHP 세션 데이터가 다음과 같을 것으로 예상한다:

a:2:{s:3:"Usr";s:5:"AxL11";s:2:"Id";s:1:"2";}

그러나 세션 파일에 저장된 데이터는 다음과 같습니다:

Id|s:1:"2";Usr|s:5:"AxL11";

어떤 도움이든 대단히 감사합니다.




구글에서 3페이지에 도달한 후, 나는 내가 제공한 문자열과 함께 작동하는 원래 응용프로그램의 a를 발견했다:

>>> loads('Id|s:1:"2";Usr|s:5:"AxL11";')
{'Id': '2', 'Usr': 'AxL11'}



PHP 직렬화에 사용되는 기본 알고리즘은 에 의해 사용되는 알고리즘이지만, 내부 형식은 로 불린다

숫자 인덱스를 저장할 수 없거나 문자열 인덱스에 특수 문자( 및 )가 포함되어 있습니다


올바른 해결책은 Armin Ronacher의 원본 라이브러리가 지원하는 라이브러리로, 심지어 INI 설정을 변경하여 JSON으로 직렬화 및 역직렬화하는 것입니다.

나는 PHP 측면에서 최대한의 호환성을 위해 전자를 사용하기로 결정했다

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

따라서 새 세션이 표준과 호환됩니다.




내가 바보 같은 방법으로 하는 거야:

먼저 쿼리 문자열로 변환한 후 다음을 사용합니다:

import sys
import re

if sys.version_info >= (3, 0):
    from urllib.parse import parse_qs, quote
else:
    from urlparse import parse_qs
    from urllib import quote

def parse_php_session(path):
    with open(path, 'r') as sess:
        return parse_qs(
           re.sub(r'\|s:([0-9]+):"?(.*?)(?=[^;|]+\|s:[0-9]+:|$)',
                lambda m : '=' + quote(m.group(2)[:int(m.group(1))]) + '&',
                sess.read().rstrip().rstrip(';') + ';')
        )

print(parse_php_session('/session-save-path/sess_0123456789abcdef'))
# {'Id': ['2'], 'Usr': ['AxL11']}

이전에는 로 교체하지 않고 작동했습니다(둘 다 허용됨). 그러나 Python 3.10 이후의 기본 구분자는


반응형