파일로 압축하고 fun.php라고 부릅니다.
<?php function passport_encrypt($txt, $key) { srand((double)microtime() * 1000000); $encrypt_key = md5(rand(0, 32000)); $ctr = 0; $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]); } return base64_encode(passport_key($tmp, $key)); } function passport_decrypt($txt, $key) { $txt = passport_key(base64_decode($txt), $key); $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { $md5 = $txt[$i]; $tmp .= $txt[++$i] ^ $md5; } return $tmp; } function passport_key($txt, $encrypt_key) { $encrypt_key = md5($encrypt_key); $ctr = 0; $tmp = ''; for($i = 0; $i < strlen($txt); $i++) { $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; $tmp .= $txt[$i] ^ $encrypt_key[$ctr++]; } return $tmp; } ?>
다음은 세 가지 암호화 및 복호화 기능에 대한 이해를 돕기 위한 몇 가지 예입니다.
//string.php <?php include “fun.php”; $txt = “This is a test”; $key = “testkey”; $encrypt = passport_encrypt($txt,$key); $decrypt = passport_decrypt($encrypt,$key); echo $txt.”<br><hr>”; echo $encrypt.”<br><hr>”; echo $decrypt.”<br><hr>”; ?> //array.php <?php include “fun.php”; $array = array( "a" => "1", "b" => "2", "c" => "3", "d" => "4" ); //serialize产生一个可存储的值,返回一个字符串,unserialize还原 $txt = serialize($array); $key = “testkey”; $encrypt = passport_encrypt($txt,$key); $decrypt = passport_decrypt($encrypt,$key); $decryptArray = unserialize($decrypt); echo $txt.”<br><hr>”; echo $encrypt.”<br><hr>”; echo $decrypt.”<br><hr>”; echo $decryptArray.”<br><hr>”; ?>
핵심 포인트 여기에서 다른 웹사이트로 이동하고 싶지만 세션이 올바른지 확인하려면 회사에 웹사이트와 포럼이 있고 두 곳 모두 등록과 로그인이 있는 것 같습니다. 홈페이지 로그인 후 포럼에 접속했을 때, 즉 한 번 로그인하여 회사 전체를 운영할 때 사용자의 세션이 무효화되는 것을 원하지 않습니다
그럼 사용자 세션을 어떻게 처리해야 할까요? 🎜>
웹 페이지는 모두 Stateless입니다. 새 웹 페이지에서 세션을 계속 사용하려면 세션을 한 곳에서 다른 곳으로 옮겨야 한다고 생각한 사람도 있을 것입니다. 그리고 PHP에는 $_SESSION이라는 세션을 처리하는 변수가 있으므로 등록해야 하는 세션을 배열로 변환하면 다음과 같이 작성할 수 있습니다. 🎜>위의 예에서는 먼저 serialize를 사용하여 $_SESSION을 다음으로 변경합니다. 저장할 수 있는 데이터는 Passport_encrypt를 통해 암호화됩니다. urlencode를 추가하는 이유는 $_SESSION을 암호화할 때 예상치 못한 인코딩이 생성될 수 있기 때문입니다. (매우 효과적인 것으로 밝혀졌습니다)
//login.php <?php session_start(); include “fun.php”; $_SESSION[“userid”]; $_SESSION[“username”]; $_SESSION[“userpwd”]; header("Location: http://$domain/process.php?s=".urlencode(passport_encrypt(serialize($_SESSION),"sessionkey"))); ?>
$_GET["s"]를 사용하여 URL의 매개변수를 가져온 다음 Passport_decrypt를 사용하여 암호를 해독합니다. , 직렬화 해제를 사용하여 데이터를 원래 데이터로 복원합니다. 이 처리 단계에서 웹페이지는 헤더를 자유롭게 이동할 수 있습니다.
//process.php <?php session_start(); include “fun.php”; $_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); header("Location: http://$domain/index.php"); ?>
다음은 process.php의 향상된 버전입니다
이 파일을 작성하기 전에 로그인 측을 설정해야 합니다.
<?php session_start(); include_once "fun.php"; $_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); if((time()-$_SESSION["TIME"])>30){ header("Location: http://$domain/ login.php"); unset($_SESSION["USERNAME"]); unset($_SESSION["PASSWORD"]); } else header("Location: http://$domain/ index.php"); ?>
이렇게 설정하는 주된 이유는 점프 시간이 30초를 초과하는 경우, login.php 로그인 페이지는 네트워크 속도가 느린 고객에게 당황스러울 뿐만 아니라 누군가가 이 URL을 획득하고 30초 이내에 로그인하지 않는 경우에도 방지하므로 당황스럽고 사용자는 시간 초과 후 다시 로그인해야 합니다.
$_SESSION["USERNAME"] 및 $_SESSION["PASSWORD"]는 사용자가 로그인할 때 입력해야 하는 사용자 이름과 비밀번호입니다. 이 두 세션을 취소하는 것은 누군가가 귀하의 URL을 획득한 경우 해당 사람이 30초 이내에 login.php 페이지로 이동하더라도 URL 접미사 login.php가 변경되는 한 전달된 세션은 여전히 유효하기 때문입니다. index.php에 로그인해도 여전히 성공적으로 로그인할 수 있습니다.