PHP 직렬화 데이터가 mysql db 오류에 저장되었습니다.
데이터베이스 기반 세션 스토리지 솔루션을 사용하고 있습니다.효과가 좋다!그러나 특정 유형의 데이터를 저장하는 데 문제가 있습니다.
CSRF 토큰을 사용하는 어플리케이션이 있습니다.폼이 생성되면 해당 폼에 대한 토큰이 생성됩니다.토큰은 다양한 유형의 값을 가진 해시(sha256) 값입니다.한 복사본은 양식으로 이동하고 다른 복사본은 세션에 저장됩니다.폼을 송신하면, 토큰이 일치하고 있는 것을 확인합니다.
아래는 db를 새로운 데이터로 업데이트하는 파괴 함수의 예입니다.
UPDATE session_manager SET variables= :variables WHERE 1=1 AND id = :id
array(2) {
[":variables"]=>
string(152) "a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"e749603241dec1911ef3a40d98b2f5185d389434060483297394b504cc904ede";s:4:"time";i:1443456816;}}}"
[":id"]=>
string(2) "49"
}
업데이트 스테이트먼트는 정상적으로 동작합니다.데이터는 갱신되지만 위의 데이터에서 볼 수 있는 '토큰' 값이 아래 db의 값과 다릅니다(데이터의 바이너리 다운로드입니다).
a:1:{s:4:"CSRF";a:1:{s:8:"register";a:2:{s:5:"token";s:64:"b48fc79fc2f51eff765c05476895238a42d9d45b2c1aeb7c6e4582d0381b7f4f";s:4:"time";i:1443456817;}}}
mysql이 값을 바꾸고 있는 것 같아서 아무리 생각해도 알 수 없습니다.시도해 본 솔루션은 다음과 같습니다.
- 연재하다
- json_module
- 베이스64
DB 문자 집합 변경 등TEXT, Longtext, BLOB 등 DB에서 다른 필드 유형을 시도했다.그것은 나에게 효과가 없는 것 같다:(
다음은 db의 sql입니다.
CREATE TABLE session_manager(
id BIGINT(11) PRIMARY KEY AUTO_INCREMENT NOT NULL,
session_id VARCHAR(200),
user_agent TINYTEXT NOT NULL,
variables BLOB NOT NULL,
initial_time DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
regenerate_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
);
생각나는 이유라도 있나요?
본 적 있니?time
사용하시는 어레이의 인덱스그것도 변한 것 같아요.이로 인해 세션 저장 방법이 적어도 두 번 실행된다고 생각하게 됩니다.세션이 두 번째로 갱신되고 이전 값이 덮어쓰게 됩니다.
디버거가 연결된 상태에서 이 코드를 실행하거나 함수를 호출할 때마다 스택 트레이스를 인쇄/로그합니다.그러면 값이 다시 업데이트될 때 매우 좋은 정보를 얻을 수 있습니다.
PS: 값을 취득하기 전에 다음 요청 시 업데이트 쿼리가 다시 호출됩니까?
네, 그래서 더 조사해보고 모두의 의견을 받아들인 후에 (그런데 힘내세요)나는 내 문제를 해결했다.
알고 보니 mysql과는 전혀 관련이 없더군요사실 "favicon.ico"와 관련이 있어요.나는 당신이 하는 것처럼 화려한 URL을 사용하고 있고, 나는 개발 중이기 때문에 favicon에 신경 쓰지 않습니다.디폴트로는 페이지 로드 시 favicon(http://localhost/favicon.ico)을 검색합니다.시스템은 사용자가 컨트롤러에 액세스하려고 하고 있으며(나는 mvc를 사용), 컨트롤러가 존재하지 않기 때문에 홈 페이지로 리다이렉트한다고 가정합니다.홈 페이지에는 양식이 있기 때문에 생성된 토큰이 필요하며, 그 결과 원래 토큰이 두 번째로 무효가 됩니다.개발자 콘솔을 통해 모든 네트워크 연결을 보고 깨달은 것입니다.
언급URL : https://stackoverflow.com/questions/32827594/php-serialized-data-stored-in-mysql-db-error
'programing' 카테고리의 다른 글
이 preg_match 대소문자를 구분하지 않도록 하려면 어떻게 해야 합니까? (0) | 2022.11.06 |
---|---|
$(표준)즉석 속기 (0) | 2022.11.06 |
Javascript에 var_dump(PHP)와 동등한 것이 있습니까? (0) | 2022.11.06 |
SQL에서 열의 최대값이 있는 행만 선택 (0) | 2022.11.06 |
MySQL에서 '존재하지 않는 경우 삽입'을 하려면 어떻게 해야 합니까? (0) | 2022.11.06 |