이 기사에서는 PHP에서 직렬화 해제에 대한 Magic_quotes_gpc의 영향을 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 내용은 다음과 같습니다.
magic_quotes_gpc는 작은따옴표와 큰따옴표에 일부 보안 필터링을 추가하는 PHP의 함수입니다. 그러나 이 함수는 unserialize 함수를 사용할 때 어느 정도 영향을 미칩니다.
어제 친구가 자신의 웹사이트에 있는 장바구니 프로그램 문제를 해결하도록 도와달라고 했습니다. 해당 프로그램은 공간을 변경하기 전에는 괜찮았습니다. 구체적인 문제는 장바구니를 성공적으로 추가한 후입니다. 장바구니 페이지로 이동합니다. 장바구니가 비어 있습니다.
코드를 살펴보니 제품 ID와 수량을 배열에 저장한 다음 이를 직렬화하고 COOKIE에 저장합니다. 장바구니 페이지에서 이 배열을 가져와서 읽어보세요. 해당 상품정보 .
디버깅 후 unserialize에서 문제가 발생했음을 발견했습니다. 먼저 장바구니 원칙에 따라 코드를 작성했습니다.
header("콘텐츠 유형: 텍스트/html; charset=utf-8")
$magic = get_magic_quotes_gpc() ? "켜기" : "켜지 않음"
$str = array(array('goods_id'=>13,'number'=>1))
setcookie("장바구니", 직렬화($str))
echo "magic_quotes_gpc: ".$magic."
"
echo $_COOKIE['cart']."
";
Print_r(unserialize($_COOKIE['cart']));
?>
이 코드를 실행해 보면, Magic_quotes_gpc가 꺼진 상태에서는 이 프로그램이 문제 없이 실행되지만, Magic_quotes_gpc가 켜진 상태에서는 deserialization이 성공하지 못한 것을 알 수 있습니다. 문제 거짓말?
magic_quotes_gpc가 켜지면 시스템이 자동으로 이스케이프 처리되고 POST GET COOKIE 결과에 작은따옴표를 추가하므로 $_COOKIE['cart'] 값이 a:1:{i: 0;a:2:{s:8:"goods_id";i:13;s:6:"number";i:1;}}, 이 경우 unserialize가 성공적으로 deserialize할 수 없으며 문제가 발생합니다.
해결책은 단순히 unserialize($_COOKIE['cart'])를 unserialize(stripslashes($_COOKIE['cart']))로 변경하고 COOKIE 앞에 스트립슬래시를 추가하고 이스케이프 문자를 제거하는 것입니다. 문제 없습니다.
쿠키의 영향에 대해 또 다른 테스트를 해보겠습니다.
1. 질문:
프로젝트 데이터를 직렬화하여 쿠키에 저장한 다음 쿠키 데이터를 역직렬화하여 원본 데이터를 얻어야 합니다.
$a[1] = array("key"=>"하루")
$jsona = json_encode($a);
setcookie("testcookie","");
setcookie("testcookie",$jsona)
var_dump($jsona,true); //정상값
var_dump(json_decode($_COOKIE['testcookie'],true))); //값을 가져올 수 없습니다
쿠키 할당이 없으면 정상적으로 역직렬화하고, 쿠키를 전달한 후에는 얻은 값이 비어 있습니다.
2. 분석 코드는 다음과 같습니다
코드 복사
코드는 다음과 같습니다.$a[0] = array("key"=>" HA 로그" );
$a[1] = array("key"=>"하루")
$jsona = json_encode($a);
var_dump($jsona); //string(50) "[{"key":"u54c8 u903b"},{"key":"u54c8 u903b"}]"
setcookie("테스트쿠키","");
setcookie("testcookie",$jsona)
var_dump($_COOKIE['testcookie']); // string(62) "[{"key":"\u54c8 \u903b"},{"key":"\u54c8 \u903b"}]"
var_dump(json_decode($_COOKIE['testcookie'],true));
데이터를 비교해보니 //쿠키 처리 후 해결 방법은 다음과 같습니다.
코드 복사