>  기사  >  백엔드 개발  >  PHP5 노트(COOKIE 및 SESSION)를 해결하는 한 가지 요령(공유)

PHP5 노트(COOKIE 및 SESSION)를 해결하는 한 가지 요령(공유)

慕斯
慕斯앞으로
2021-06-09 09:43:582333검색

이 기사는 PHP5 노트(COOKIE 및 SESSION)(공유) 애플리케이션에 대한 솔루션을 공유합니다. 이는 특정 참조 가치가 있으며 도움이 필요한 모든 사람에게 도움이 되기를 바랍니다.

PHP5 노트(COOKIE 및 SESSION)를 해결하는 한 가지 요령(공유)

1. HTTP 프로토콜 자체는 상태 비저장입니다.
우리 모두는 인터넷 서핑을 할 때 정보를 전송하기 위해 HTTP 프로토콜을 사용합니다. 예를 들어, 브라우저에 www.bokee.com이라는 URL을 입력하고 Enter를 누르면 URL은 http://www.bokee.com이 됩니다. 그 이유는 귀하가 탐색 중인 웹 페이지가 다음과 같기 때문입니다. http 프로토콜을 기반으로 합니다. http 프로토콜은 사용자가 어떤 웹사이트를 자주 방문하는지, 어떤 취미를 가지고 있는지 기록할 수 없으며, 사용자의 ID 계정과 비밀번호도 기록할 수 없습니다. 이것이 소위 HTTP 프로토콜의 무국적 상태입니다. HTTP 프로토콜 자체는 상태 비저장이며 이는 HTTP 프로토콜의 원래 목적과 일치합니다. 클라이언트는 서버에 특정 파일을 다운로드하도록 요청하기만 하면 됩니다. 클라이언트와 서버는 매번 서로의 과거 작업을 기록할 필요가 없습니다. 고객과 자판기, 일반(비회원) 대형마트와의 관계처럼 요청은 모두 독립적입니다.

2. 쿠키와 세션을 이해하는 방법은 무엇인가요?
쿠키와 세션은 밀접한 관련이 있으므로 여기서 함께 소개하겠습니다.
예를 들어, 저는 허난(河南)에 있을 때 대식가 오리를 사러 자주 갔습니다. 판매를 촉진하기 위해 가게 주인이 "오리 10개 구매 시 무료로 증정합니다"라는 특별 프로모션을 발표했습니다. . 집에서 하는 결혼식이나 장례식 외에는 오리구이 10개를 한꺼번에 사는 사람은 없겠죠? 그래서 사장님은 고객의 소비량을 기록할 수 있는 방법을 생각해야 합니다. 여기에는 세 가지 옵션이 있습니다.
Ⅰ. 사장님은 각 고객의 소비 수량을 기억하고, 고객이 10개를 소비하면 자동으로 1개를 줍니다. 이는 상태를 저장하고 고객의 활동행동을 기억할 수 있는 HTTP 프로토콜 자체와 같습니다. 그러나 불행히도 다양한 고려 사항으로 인해 http 프로토콜 자체는 상태 저장이 불가능하고 상사 자신도 이러한 특별한 메모리를 갖고 있지 않으므로 이 솔루션은 작동하지 않습니다!
Ⅱ. 사장님이 고객에게 포인트 카드를 발급해 주는데, 이 카드에는 소비량을 기록하고 보통 유효기간이 있습니다. 오리구이를 구매할 때마다 고객이 이 카드를 보여주면 사장님은 고객이 이전에 매장을 방문한 적이 있다는 것을 알게 됩니다. 이 접근 방식은 쿠키 기술과 같이 클라이언트 측에서 상태를 유지하는 것입니다. (Windows 시스템) C:문서 및 설정 사용자 이름 쿠키를 열면 *.txt 형식의 작은 파일 몇 개를 찾을 수 있습니다. 이는 일부 웹사이트를 탐색할 때 전송되는 "포인트 카드"(쿠키)입니다.
Ⅲ. 사장님이 고객에게 회원카드를 발급해 주시고, 오리구이 구매 시마다 고객이 카드를 보여주면 사장님이 매장 명단에서 나가서 카드번호를 찾아 안내해 드립니다. 1점을 추가합니다. 이 접근 방식은 서버 측에서 상태를 유지하는 것입니다.
세션 기술과 같습니다. ㅋㅋㅋ >                                                  쿠키. 세션은 고객에게 카드번호(세션ID)만으로 포인트카드를 발급하고, 고객의 모든 소비정보를 기록합니다. 쿠키는 클라이언트 측에 저장되며, 세션 ID는 클라이언트 측에 저장됩니다. 이 작은 파일에는 카드와 같은 정보가 없기 때문입니다. 번호), 쿠키보다 훨씬 안전합니다.

3. 쿠키와 세션은 무엇을 위해 사용되나요?

일부 웹사이트에서 물건을 다운로드하는 등의 일반적인 사용에는 먼저 회원 로그인이 필요합니다. http 프로토콜 자체는 상태 비저장이며 고객이 로그인했는지 여부를 알 수 있는 방법이 없습니다. 어떻게 해야 합니까? 쿠키, 세션 등을 통하여 알 수 있습니다. 또 다른 예는 온라인 쇼핑입니다. 장바구니는 고객이 어떤 제품을 선택했는지 어떻게 알 수 있습니까? 쿠키와 세션도 기록될 수 있습니다. 전체적으로 쿠키와 세션은 고객의 상태를 기록할 수 있는 기술입니다. 서로 다른 기술이지만 쿠키가 할 수 있는 한 세션도 할 수 있습니다!


쿠키



1. 쿠키란 무엇인가요?
0쿠키 기술은 처음부터 많은 논란의 여지가 있는 기술로 대다수의 network 사용자와 웹 개발자에게 논쟁의 초점이 되었습니다. 일부 고위 웹 전문가를 포함한 일부 인터넷 사용자는 쿠키 기술의 기능이 너무 약하거나 기타 기술적 성능상의 이유로 쿠키의 사용이 해를 끼친다고 느끼기 때문에 쿠키의 생성 및 홍보에 불만족합니다. 네트워크 사용자의 개인정보 보호를 위해. 쿠키란 웹서버가 이용자의 브라우저에 저장하는 아주 작은 텍스트 파일이므로 이용자에 관한 정보(식별번호, 비밀번호, 이용자가 웹사이트에서 구매하는 방식, 이용자의 방문횟수 등)를 담고 있습니다. 사이트를 방문합니다).
그렇다면 쿠키 기술이란 정확히 무엇입니까? 실제로 인터넷 사용자의 개인 정보 보호에 해를 끼치나요? 답변하기 전에 다음 내용을 읽어보겠습니다.
WEB 기술 발전의 역사에서 쿠키 기술의 등장은 큰 변화입니다. 첫째, Netscape는 Netscape Navigator 브라우저에 쿠키 기술을 도입한 이후 World Wide Web 협회가 쿠키 표준을 지원하기 시작했습니다. 이후 Microsoft에서 적극적으로 홍보한 후(Microsoft의 IIS 웹 서버에서 사용하는 ASP 기술은 쿠키 기술을 상당 부분 사용하기 때문에) Microsoft의 Internet Explorer 브라우저에서 쿠키 기술을 완벽하게 지원합니다. 현재까지 대부분의 브라우저는 쿠키 기술을 지원하거나 적어도 쿠키 기술 사용과 호환됩니다.
Netscape 공식 문서의 정의에 따르면 쿠키는 서버나 스크립트가 HTTP 프로토콜에 따라 클라이언트 워크스테이션의 정보를 유지하는 방법입니다. 쿠키란 웹서버가 이용자의 브라우저에 저장하는 작은 파일로서, 여기에는 이용자에 관한 정보(식별번호, 비밀번호, 이용자의 웹사이트에서의 구매방법, 이용자의 사이트 방문횟수 등)가 포함될 수 있습니다. 사용자가 서버에 연결할 때마다 웹 사이트는 쿠키 정보에 액세스할 수 있습니다.
Windows 시스템을 사용하는 경우 C:문서 및 설정 사용자 이름 쿠키를 열면 이 디렉터리에 *.txt 형식의 작은 파일이 많이 있다는 것을 알 수 있습니다. 그것이 쿠키 파일입니다. 물론, 귀하가 시스템을 새로 설치했거나 인터넷을 검색한 적이 없거나 브라우저가 쿠키를 비활성화했기 때문에 이 디렉토리에서 아무 것도 찾을 수 없을 수도 있습니다. 그렇지 않으면 이 디렉토리에는 항상 뭔가가 있을 것입니다.
일반 용어로 말하면 브라우저는 쿠키를 지원하기 위해 하나 이상의 제한된 파일을 사용합니다. 이러한 파일은 Windows 운영 체제를 사용하는 컴퓨터에서는 쿠키 파일이라고 하며 Macintosh 컴퓨터에서는 매직 쿠키 파일이라고 합니다. 이러한 파일은 웹사이트에서 쿠키 데이터를 저장하는 데 사용됩니다. 웹사이트는 이러한 쿠키 파일에 정보를 삽입할 수 있으며, 이는 일부 인터넷 사용자에게 부작용을 일으킬 수 있습니다. 일부 사용자는 이것이 개인 정보 침해를 초래한다고 생각합니다. 더 나쁜 것은 일부 사람들은 쿠키가 개인 공간을 침해하고 사용자 컴퓨터에 보안 위험을 초래할 수 있다고 생각한다는 것입니다.
현재 일부 쿠키는 일시적이고 다른 쿠키는 영구적입니다. 임시 쿠키는 지정된 기간 동안만 브라우저에 저장됩니다. 지정된 기간이 만료되면 쿠키는 시스템에 의해 삭제됩니다. 예를 들어, PHP에서 쿠키는 사용자가 웹사이트를 떠날 때까지 사용자 진행 상황을 추적하는 데 사용됩니다. 영구 쿠키는 사용자의 쿠키 파일에 저장되며 다음에 사용자가 돌아올 때 계속 호출될 수 있습니다.
쿠키를 쿠키 파일에 저장하면 큰 문제가 발생할 것이라고 지나치게 생각하는 사용자도 있습니다. 주된 이유는 일부 사용자가 쿠키가 사용자가 방문하기를 좋아하는 사이트 유형, 참여하기를 좋아하는 활동 등 사용자의 온라인 서핑 습관을 추적할 것이라고 우려하기 때문입니다. 이러한 개인정보가 불순한 의도를 가진 누군가의 손에 넘어갈 경우 해당 개인은 수많은 광고 쓰레기의 대상이 되거나 심지어 예상치 못한 피해를 입을 수도 있다는 우려가 있습니다. 그러나 웹사이트 외부의 사용자는 웹사이트 전체에서 쿠키 정보를 얻을 수 없기 때문에 이러한 걱정은 전혀 발생하지 않습니다. 따라서 이러한 목적으로 쿠키를 사용하는 것은 불가능합니다. 그러나 일부 사용자의 오해와 "거짓 소문"으로 인해 일부 브라우저 개발자는 적절하게 대응할 수밖에 없습니다(예: Netscape Navigator 4.0 및 Internet Explorer 3.0 모두 쿠키 차단 옵션을 제공합니다). 개인적으로 불이 없으면 연기도 없다고 생각합니다.웹사이트 프로그래머가 엄격한 사고를 하지 않는다면 쿠키에는 보안상의 문제가 있을 수 있습니다. 그러나 이러한 결함은 쿠키의 우수한 품질을 가리기에 충분하지 않습니다. 그들을 사용하십시오. 오랫동안 쿠키 기술을 기다려온 결과로 많은 브라우저 개발자는 브라우저에서 쿠키에 대한 유연한 제어 기능을 제공해야 했습니다. 예를 들어, 현재 두 가지 주류 브라우저인 Netscape Navigator와 Internet Explorer는 다음과 같은 방식으로 쿠키를 처리합니다. Netscape Navigator 4.0은 경고를 위해 쿠키를 허용할 뿐만 아니라 Internet Explorer 3.0도 쿠키를 차단할 수 있지만 Internet Explorer 4에서는 . 0에서는 차단 옵션을 제공하지 않고 경고만 허용할 수 있습니다. 그러나 Internet Explorer 4.0 이후 업데이트 버전에서는 쿠키 차단 옵션이 추가되었습니다.
또한 최신 기술 중 상당수는 쿠키를 차단할 수 없는 브라우저에서도 쿠키를 차단할 수 있습니다. 예를 들어 쿠키 파일을 다른 유형으로 설정하여 쿠키 사용을 제한할 수 있습니다. 그러나 불행하게도 쿠키를 완전히 차단하려면 많은 사이트 페이지를 거부하게 됩니다. 예를 들어, 오늘날 많은 웹 사이트 개발자가 쿠키 기술의 강력한 기능에 푹 빠져 있기 때문에 세션 개체의 사용은 쿠키 지원과 분리될 수 없습니다.


2. 쿠키는 어떻게 작동하나요?
고객이 PHP 기술을 기반으로 하는 웹사이트를 방문하면 PHP의 setcookie 함수를 사용하여 쿠키를 생성할 수 있습니다. 처리 후 시스템은 쿠키를 클라이언트에 보내고 이를 C:Documents and Settings 사용자 이름 쿠키 디렉토리에 저장합니다. . 쿠키는 HTTP 헤더의 일부이므로 브라우저에 무언가를 보내기 전에 setcookie 함수를 호출해야 합니다. 이 제한 사항은 header() 함수와 동일합니다(head() 함수를 이해해야 하는 경우 직접 확인하세요). 고객이 해당 웹사이트를 다시 방문하면 브라우저는 자동으로 C:Documents and Settings 사용자 이름 쿠키 디렉토리에 있는 사이트에 해당하는 쿠키를 서버로 보내고, 서버는 클라이언트에서 전달된 쿠키를 자동으로 PHP 변수로 변환합니다. PHP5에서는 클라이언트가 보낸 쿠키가 전역 변수로 변환됩니다. $_COOKIE['xxx']를 통해 읽을 수 있습니다.

오늘날에도 여전히 쿠키에 대해 논쟁을 벌이는 일부 인터넷 사용자가 있지만, 대다수의 인터넷 사용자는 여전히 쿠키를 받아들이는 경향이 있습니다. 따라서 당사는 쿠키 기술을 사용하여 웹 페이지를 안전하게 개발할 수 있습니다.

3. 쿠키 공통 함수
● SetCookie 이 함수는 쿠키를 생성하여 HTTP 헤더 끝에 추가합니다. 한 가지 주목해야 할 점은 쿠키가 HTTP 프로토콜 헤더의 일부이며 브라우저와 서버 간에 정보를 전송하는 데 사용된다는 것입니다. 따라서 HTML 파일 자체에 속한 콘텐츠보다 먼저 SetCookie 함수를 호출해야 합니다. 이 함수를 호출하기 전에도 공백이나 빈 줄이 있으면 작동하지 않습니다. setCookie()가 두 번째 요소를 인식하면 어떤 요소도 첫 번째 요소를 감히 인식하지 못합니다. setcookie() 함수를 사용하기 위한 전제 조건은 클라이언트의 브라우저가 쿠키를 지원하지 않도록 설정하면 setcookie()가 쓸모 없게 된다는 것입니다.
int SetCookie(문자열 이름, 문자열 값, int 만료, 문자열 경로, 문자열 도메인, int secure, bool httponly)
매개변수 설명:
쿠키 변수의 이름을 설정합니다.
값;쿠키 값을 설정합니다.
만료;쿠키 만료 시간을 설정합니다. 쿠키를 브라우저 프로세스로 저장하려는 경우 브라우저를 닫은 후에는 쿠키가 무효화됩니다. 그런 다음 만료 시간을 0으로 직접 설정할 수 있습니다. 예:setcookie("이름","값",0). 이 매개변수가 설정되지 않은 경우 브라우저를 닫으면 쿠키도 종료될 수 있습니다.
경로: 호출된 페이지가 있는 디렉토리를 기본값으로 하는 웹 서버의 디렉토리를 나타냅니다. 예를 들어, 사이트에는 여러 다른 디렉토리(예: 쇼핑 디렉토리, )가 있습니다. Forum 디렉터리) , 경로 없이 쿠키만 사용하는 경우 한 디렉터리의 페이지에 설정된 쿠키는 다른 디렉터리의 페이지에서 볼 수 없습니다. 즉, 쿠키는 경로 지향적입니다. 실제로 경로를 지정하지 않더라도 웹 서버는 자동으로 현재 경로를 브라우저에 전달하며, 경로를 지정하면 서버는 강제로 설정된 경로를 사용하게 됩니다. 이 문제를 해결하는 방법은 SetCookie를 호출할 때 경로와 도메인 이름을 추가하는 것입니다. 도메인 이름 형식은 "http://www.phpuser.com/" 또는 ".phpuser.com"이 될 수 있습니다. SetCookie 함수에서 value를 나타내는 부분은 전달되면 자동으로 인코딩됩니다. 즉, 전달 시 value의 값이 "test value"이면 "test%20value"가 됩니다. URL 방식과 동일합니다. 물론, PHP는 쿠키 값을 수신할 때 자동으로 디코딩하기 때문에 이는 프로그램에 투명합니다.

도메인: 쿠키가 사용할 수 있는 도메인 이름. 기본값은 호출된 페이지의 도메인 이름입니다. 도메인 이름에는 "." 2개가 포함되어야 하므로 최상위 도메인 이름을 지정할 경우에는 ".mydomain.com"을 사용해야 합니다. 도메인 이름을 설정한 후 해당 도메인 이름을 사용하여 웹사이트에 접속해야 쿠키가 유효합니다. 여러 도메인 이름을 사용하여 이 페이지에 액세스하는 경우 이 필드가 비어 있거나 이 쿠키에 액세스하는 도메인 이름이 모두 동일한 도메인에 속할 수 있습니다.
secure: "1"로 설정되면 사용자의 브라우저가 안전하다고 간주하는 서버에서만 쿠키를 기억할 수 있음을 의미합니다.
이름을 제외한 모든 매개변수는 선택사항입니다. 세 가지 매개변수 값, 경로 및 도메인은 빈 문자열 ""로 대체될 수 있으며 이는 만료 및 보안 매개변수가 숫자이며 0으로 표시될 수 있음을 나타냅니다. 만료 매개변수는 time() 또는 mktime() 함수를 사용하여 초 단위로 얻을 수 있는 표준 Unix 타임스탬프입니다. secure 매개변수는 이 쿠키가 암호화된 HTTPS 프로토콜을 통해 네트워크를 통해 전송되는지 여부를 나타냅니다.
httponly: 1로 설정하면 쿠키는 http 프로토콜에서만 사용할 수 있음을 의미합니다. javascript와 같은 모든 스크립트 언어는 PHP에서 생성된 쿠키를 얻을 수 없으므로 XSS의 공격을 효과적으로 약화시킵니다. (참고: PHP5에서만 가능한 옵션으로 저는 한번도 사용해본 적이 없습니다. 공식 매뉴얼을 읽고 번역해 보았습니다. 궁금하신 사항은 공식 매뉴얼을 참고해주세요.) 현재 설정된 쿠키는 즉시 적용되지는 않지만, 다음 페이지까지 기다리거나 새로 고쳐야 볼 수 있습니다. 이는 설정된 페이지에서 쿠키가 서버에서 클라이언트의 브라우저로 전달되고, 브라우저가 해당 쿠키를 외부로 가져올 수 있기 때문입니다. 다음 페이지 또는 새로 고침 후에만 클라이언트 컴퓨터에 이유가 서버로 다시 전달됩니다. 포도나무

16세 독일 학생이 쿠키를 통해 Hotmail을 크랙했습니다
16세 독일 학생 Adriaan Graas는 네트워크 보안과 웹 개발에도 관심이 많습니다. 그는 Hotmail을 크랙하는 방법도 발견했습니다. 일주일이 지난 오늘, Microsoft는 아직 취약점을 수정하지 못했습니다.
이 작은 해커의 아이디어는 매우 간단합니다. 사용자가 Hotmail에 로그인하면 시스템은 다음 로그인을 용이하게 하기 위해 쿠키를 생성합니다. 쿠키는 IP에 바인딩되어 있지 않기 때문에 해커는 피해자의 비밀번호나 이메일 주소를 알지 못한 채 이러한 쿠키를 위조하여 로그인에 사용할 수 있습니다. XSS를 통해 해커는 javascrīpt 코드 조각을 삽입하고 로그 스크립트를 사용하여 웹 서버에 쿠키를 보낼 수 있습니다. 스크립트는 PHP, ASP, CGI 및 기타 언어로 작성될 수 있습니다.

쿠키 적용 사례:
●쿠키 생성:
SetCookie()
●쿠키 배열 생성:
하나:
SetCookie("CookieArray[]", "Value 1");
SetCookie("CookieArray[] ", "Value 2");
두 번째:
SetCookie("CookieArray[0]", "Value 1");
SetCookie("CookieArray[1]", "Value 2");
● 쿠키 수신 및 처리

PHP는 쿠키 수신 및 처리를 매우 훌륭하게 지원하며 완전히 자동이며 GET 및 POST 변수와 동일한 원리를 가지고 있습니다.
예를 들어 MyCookier라는 쿠키를 설정하면 PHP는 웹 서버에서 수신한 HTTP 헤더에서 이를 자동으로 분석하여 $_COOKIE['MyCookie']라는 이름으로 직접 사용할 수 있는 전역 변수를 형성합니다. 쿠키의 가치. 배열에도 동일하게 적용됩니다.
예는 다음과 같습니다: (이전 페이지에서 설정되었으며 여전히 유효하다고 가정)
echo $_COOKIE['MyCookie'];
쿠키 배열 꺼내기 예:

// 创建一个cookie数组
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");
// 页面刷新之后,用foreach提取cookie数组。
if (isset($_COOKIE['cookie'])) {
   foreach ($_COOKIE['cookie'] as $name => $value) {
       echo "$name : $value <br />\n";
   }
}

매우 간단합니다.
쿠키 삭제
기존 쿠키를 삭제하는 방법은 두 가지가 있습니다.
1. name 매개변수만 사용하여 SetCookie를 호출하면 이 이름의 쿠키가 관련 컴퓨터에서 삭제됩니다.
setcookie("MyCookie") ; //마이쿠키를 삭제합니다.
2. 쿠키 만료 시간을 time() 또는 time()-1로 설정합니다//time()이 얼마나 줄어들든 관계없이 만료 시간이면 // 쿠키가 삭제됩니다 이 페이지를 탐색한 후(실제로는 실패했습니다). 예:
setcookie("MyCookie","Value",time()-1); //MyCookie를 삭제합니다.
쿠키가 삭제되더라도 해당 값은 현재 페이지에서 여전히 유효하다는 점에 유의하세요.
쿠키를 브라우저 프로세스로 저장하려는 경우 브라우저를 닫은 후에는 쿠키가 무효화됩니다. 그런 다음 만료 시간을 0으로 직접 설정할 수 있습니다. 예: setcookie("이름","값",0). 이 매개변수가 설정되지 않은 경우 브라우저를 닫으면 쿠키도 종료될 수 있습니다.

Cookie Notes
1. SetCookie() 이전에는 HTML 출력이 있을 수 없습니다. 두 번째 항목을 인식합니다. 공백과 빈 줄이라도 첫 번째 항목을 인식할 수 있는 요소는 없습니다.
2. SetCookie() 이후 현재 페이지에서 echo $_COOKIE["name"]을 호출하면 출력이 없습니다. 쿠키 값을 보려면 새로 고치거나 다음 페이지로 이동해야 합니다. 이유는 간단합니다. SetCookie()가 실행된 후 쿠키가 클라이언트로 전송됩니다. 새로 고치거나 다음 페이지를 탐색하지 않으면 클라이언트가 어떻게 쿠키를 다시 보낼 수 있습니까? 브라우저가 쿠키를 생성한 후 웹사이트에 대한 모든 요청은 헤더에 쿠키를 포함하지만 다른 웹사이트의 요청에는 쿠키가 전송되지 않습니다. 그리고 브라우저는 쿠키가 만료될 때까지 계속해서 쿠키를 보냅니다.
3. 쿠키 사용 제한. 브라우저에서 생성할 수 있는 최대 쿠키 수는 30개이며, 각 쿠키는 4KB를 초과할 수 없습니다. 각 웹 사이트에서 설정할 수 있는 총 쿠키 수는 20개를 초과할 수 없습니다. (책에서 읽은 내용입니다. 웹사이트는 30개 이하의 쿠키를 생성할 수 있어야 합니다. 그렇지 않으면 내 컴퓨터에는 수백 개의 쿠키가 있을 것입니다. 조언 부탁드립니다!)
4. 쿠키 저장됩니다. 클라이언트에서 사용자가 쿠키를 비활성화하면 쿠키는 당연히 아무런 영향을 미치지 않습니다! 오늘날의 브라우저는 클라이언트에 쿠키를 보낼 때마다 감시자처럼 이를 가로채서 사용자에게 쿠키 입력을 허용할지 여부를 묻습니다. 맙소사, 사용자는 전문가가 아닙니다. 쿠키가 무엇인지 아는 사람이 얼마나 됩니까? 어쩌면 바이러스로 처리되어 차단될 수도 있습니다.


SESSION

1. 세션이란 무엇인가요?
 Session의 중국어 번역은 "대화"라고 합니다. 원래 의미는 시작과 끝이 있는 일련의 작업/메시지를 의미합니다. 예를 들어 전화를 걸 때부터 전화를 받는 일련의 과정을 의미합니다. 전화 걸기부터 전화 끊기까지 세션을 호출할 수 있습니다. 현재 사회에서 세션에 대한 이해는 매우 혼란스럽습니다. 때때로 "브라우저 세션 중..."이라는 단어를 볼 수 있습니다. 여기서 세션은 브라우저 창이 열리는 시점부터 닫힐 때까지의 기간을 의미합니다. "세션 중 사용자(클라이언트)"라는 문장을 참조하면, 사용자의 일련의 행위(보통 로그인부터 상품 구매, 결제까지 특정 목적과 관련된 일련의 행위)를 의미할 수 있습니다. 그러나 이러한 온라인 쇼핑 프로세스는 때로는 연결만을 의미할 수도 있습니다. 그러나 세션이라는 단어가
network 프로토콜과 연관되는 경우가 많습니다. '연결 지향' 및/또는 '상태 유지'라는 두 가지 의미를 내포하고 있습니다. '연결 지향'이란 통화를 하기 전에 상대방이 응답할 때까지 먼저 통신 채널을 구축해야 한다는 의미입니다. "상태 유지"는 통신 당사자가 메시지가 서로 의존할 수 있도록 일련의 메시지를 연결할 수 있음을 의미합니다. 예를 들어 웨이터는 다시 오는 오래된 고객을 인식하고 고객이 그에게 돈을 빚졌다는 것을 기억할 수 있습니다. 지난번에 1달러를 저장했습니다. 이 범주의 예로는 "TCP 세션" 또는 "POP3 세션"이 있습니다. 이러한 혼란을 고려하여 정보를 읽을 때 세션을 정의하는 통일된 표준을 갖는 것은 어렵습니다. 그러나 우리는 다음과 같이 이해할 수 있습니다. 예를 들어 전화를 걸 때, 전화를 끊는 순간부터 전화는 계속 연결되어 있습니다.
그래서 우리는 연결된 상태를 세션이라고 합니다. 클라이언트가 쿠키를 지원하지 않는 경우 데이터의 정확성과 보안을 보장하기 위해 방문자와 전체 웹사이트 간의 상호 작용 중에 항상 존재하는 공개 변수입니다. 웹사이트 방문자에게 세션 ID라는 고유 식별자가 할당됩니다. 이는 클라이언트의 쿠키에 저장되거나 URL을 통해 전달됩니다. SESSION의 발명은 HTTP 프로토콜의 한계를 보완합니다. 프로토콜은 상태 비저장 프로토콜로 간주되며 서버에서 응답이 완료된 후 서버와 브라우저의 연결이 끊어집니다. 이는 클라이언트가 서버에 요청하기만 하면 됩니다. 특정 파일을 다운로드하면 클라이언트나 서버 모두 서로의 과거 행동을 기록할 필요가 없습니다. 각 요청은 고객과 자동판매기 또는 일반(비회원) 대형마트 간의 관계처럼 독립적입니다. 사용자가 웹 서버에 다시 요청할 때 확인하기 위해 사용자의 관련 정보가 SESSION(쿠키는 또 다른 솔루션)을 통해 기록됩니다. 세션의 발명을 통해 사용자는 자신의 정보를 여러 페이지 간에 전환할 수 있습니다. 웹사이트 프로그래머라면 누구나 이런 경험이 있을 것입니다. 각 페이지의 변수는 다음 페이지에서 사용할 수 없는 반면(form과 url도 구현할 수 있지만 이는 매우 만족스럽지 못한 방법입니다), SESSION에 등록된 변수는 전역 변수로 사용할 수 있습니다. 변하기 쉬운.
그러면 SESSION의 용도는 무엇인가요? 누구나 온라인 쇼핑을 할 때 장바구니를 사용해 본 적이 있을 것입니다. 언제든지 선택한 제품을 장바구니에 추가하고 마지막으로 결제 카운터로 가서 결제할 수 있습니다. 전체 과정에서 장바구니는 선택한 제품을 임시로 저장하는 역할을 담당해 왔습니다. 이는 웹사이트에서 사용자의

활동을 추적하는 데 사용됩니다. 이는 사용자 신원을 확인하는 데 사용될 수 있습니다. 인증 및 프로그램 상태 기록, 페이지 간 매개변수 전달 등 SESSION의 구현은 COOKIE 기술을 사용합니다. SESSION은 클라이언트 측에 session_id(SESSION 번호)를 포함하는 COOKIE를 저장하고, session_name 등과 같은 다른 세션 변수는 서버 측에 저장됩니다. 사용자가 서버에 요청하면 session_id도 서버로 전송됩니다. session_id를 통해 서버측에 저장된 변수를 추출하면 사용자가 누구인지 식별할 수 있습니다. 동시에 SESSION이 때때로 실패하는 이유를 이해하는 것은 어렵지 않습니다.      当客户端禁用COOKIE时(点击IE中的“工具”—“Internet选项”,在弹出的对话框里点击“安全”—“自定义级别”项,将“允许每个对话COOKIE”设为禁用),session_id将无法传递,此时SESSION失效。不过php5在linux/unix平台可以自动检查cookie状态,如果客户端设置了禁用,则系统自动把session_id附加到url上传递。windows主机则无此功能。
     


2、Session常见函数及用法?
Session_start()开始一个会话或者返回已经存在的会话。
   说明:这个函数没有参数,且返回值均为true。如果你使用基于cookie的session(cookie-based sessions),那么在使用Session_start()之前浏览器不能有任何输出,否则会发生以下错误:
Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………
你可以在php.ini里启动session.auto_start=1,这样就无需每次使用session之前都要调用session_start()。但启用该选项也有一些限制,如果确实启用了 session.auto_start,则不能将对象放入会话中,因为类定义必须在启动会话之前加载以在会话中重建对象。
请求结束后所有注册的变量都会被序列化。已注册但未定义的变量被标记为未定义。在之后的访问中这些变量也未被会话模块定义,除非用户以后定义它们。
警告: 有些类型的数据不能被序列化因此也就不能保存在会话中。包括 resource 变量或者有循环引用的对象(即某对象将一个指向自己的引用传递给另一个对象)。
注册SESSION变量 :
PHP5使用$_SESSION[‘xxx’]=xxx注册SESSION全局变量。和GET,POST,COOKIE的使用方法相似。
   注意:session_register(),session_unregister ,session_is_registered在php5下不再使用,除非在php.ini里把register_globle设为on,不过出于安全考虑,强烈建议关闭register_globle。HTTP_SESSION_VARS也不提倡使用了,官方建议用$_SESSION代替之。例如:
Page1.php

Session_start();       //使用SESSION前必须调用该函数。
$_SESSION[‘name’]=”我是黑旋风李逵!”;   //注册一个SESSION变量
$_SESSION[‘passwd’]=”mynameislikui”;
$_SESSION[‘time’]=time();
echo &#39;<br /><a href="page2.php">通过COOKIE传递SESSION</a>&#39;;   //如果客户端支持cookie,可通过该链接传递session到下一页。
echo &#39;<br /><a href="page2.php?&#39; . SID . &#39;">通过URL传递SESSION</a>&#39;;//客户端不支持cookie时,使用该办法传递session.
?>
Page2.php
<?php
session_start();
echo $_SESSION[&#39;name&#39;]; //
echo $_SESSION[&#39;passwd&#39;];   //
echo date(&#39;Y m d H:i:s&#39;, $_SESSION[&#39;time&#39;]);
echo &#39;<br /><a href="page1.php">返回山一页</a>&#39;;

有两种方法传递一个会话 ID:
cookie
URL 参数
会话模块支持这两种方法。cookie 更优化,但由于不总是可用,也提供替代的方法。第二种方法直接将会话 ID 嵌入到 URL 中间去。
PHP 可以透明地转换连接。除非是使用 PHP 4.2 或更新版本,需要手工在编译 PHP 时激活。在 Unix 下,用 --enable-trans-sid 配置选项。如果此配置选项和运行时选项 session.use_trans_sid 都被激活(修改php.ini),相对 URI 将被自动修改为包含会话 ID。
session_id
    session_id() 用于设定或取得当前session_id。php5中既可以使用session_id(),也可以通过附加在url上的SID取得当前会话的session_id和session_name。
    如果session_id()有具体指定值的话,将取代当前的session_id值。使用该函数前必须启动会话:session_start();
    当我们使用session cookies时,如果指定了一个session_id()值,每次启动session_start()都会往客户端发送一个cookie值。不论当前session_id是否与指定值相等。
session_id()如果没有指定值,则返回当前session_id();当前会话没有启动的话,则返回空字符串。
 ●检查session是否存在?
    在以往的php版本中通常使用session_is_register()检查session是否存在,如果您使用$_SESSION[‘XXX’]=XXX来注册会话变量,则session_is_register()函数不再起作用。你可以使用
isset($_SESSION[‘xxx’])来替代。
● 更改session_id  session_regenerate_id() 更改成功则返回true,失败则返回false。
使用该函数可以为当前session更改session_id,但不改变当前session的其他信息。例如:

<?php
 session_start();
 $old_sessionid = session_id();
 session_regenerate_id();
 $new_sessionid = session_id();
 echo "原始 SessionID: $old_sessionid<br />";
 echo "新的 SessionID: $new_sessionid<br />";
 echo"<pre class="brush:php;toolbar:false">";
 print_r($_SESSION);
 echo"
"; ?>


session_name()返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start()之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
session改名示例:

<?php
 $previous_name = session_name("WebsiteID");
 echo "新的session名为: $previous_name<br />";
 ?>

如何删除session?
1、unset ($_SESSION['xxx'])删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。 session_unregister()在PHP5中不再使用,可将之打入冷宫。
unset($_SESSION)  此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。
2、$_SESSION=array()删除多个session
3、session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量(globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
    返回值:布尔值。
    功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true

   session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。

下面是PHP官方关于删除session的案例:

<?php
 // 初始化session.
 session_start();
 /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/
 $_SESSION = array();
 /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/
 if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), &#39;&#39;, time()-42000, &#39;/&#39;);
 }
 // 最后彻底销毁session.
 session_destroy();
 ?>

由此我们可以得出删除Session的步骤:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()

● 세션 보안:
세션 모듈은 세션에 저장된 정보가 세션을 생성한 사용자만 볼 수 있다고 보장할 수 없습니다. 저장된 데이터에 따라 세션 무결성을 사전에 보호하기 위해 더 많은 조치를 취해야 합니다.
세션 내에서 전달되는 데이터를 평가하고 추가 보호 조치를 구현하는 데는 비용이 많이 들고 사용자 편의성이 떨어지는 경우가 많습니다. 예를 들어, 단순한 소셜 정책(참고: URL에 표시된 세션 ID는 다른 사람이 컴퓨터 화면에서 보거나 HTTP Referer 등을 통해 다른 웹사이트에서 얻을 수 있음)으로부터 사용자를 보호하려면 이를 활성화해야 합니다. .session.use_only_cookies. 이 경우 클라이언트는 무조건 쿠키를 활성화해야 하며, 그렇지 않으면 세션이 작동하지 않습니다.
기존 세션 ID가 제3자에게 유출될 수 있는 방법에는 여러 가지가 있습니다. 유출된 세션 ID를 통해 제3자가 지정된 ID와 연결된 모든 리소스에 액세스할 수 있습니다. 첫째, URL은 세션 ID를 전달합니다. 외부 사이트에 연결하는 경우 세션 ID가 포함된 URL이 외부 사이트의 리퍼러 로그에 저장될 수 있습니다. 둘째, 보다 활동적인 공격자가 네트워크 세그먼트에서 패킷을 수신할 수 있습니다. 암호화되지 않은 경우 세션 ID는 일반 텍스트로 네트워크를 통해 흐릅니다. 이에 대한 해결책은 서버에 SSL을 구현하고 사용자가 이를 사용하도록 하는 것입니다.
기본적으로 특정 세션과 관련된 모든 데이터는 INI 옵션 session.save_path에 지정된 디렉터리의 파일에 저장됩니다. 해당 세션과 연결된 데이터가 있는지 여부에 관계없이 각 세션마다 하나의 파일이 생성됩니다. 파일에 데이터를 쓰는지 여부에 관계없이 세션이 열릴 때마다 파일이 생성되기 때문입니다. 파일 시스템 작업의 제한으로 인해 이 동작에는 사용자 정의 세션 핸들러(예: database 사용)가 저장된 데이터 없이 세션을 잃을 수 있는 부작용이 있습니다.
위에 소개된 함수는 아래에서 사용될 예정이지만 세션과 관련된 함수도 소개되어 있습니다.
session_encode
함수 함수: 세션 정보 인코딩
함수 프로토타입: 문자열 session_encode(void);
반환 값: 문자열
함수 설명 : 반환된 문자열에는 전역 변수에 있는 각 변수의 이름과 값이 다음 형식으로 포함됩니다. a|s:12:"it is a test";c|s:4:"lala"; 은 변수입니다. 이름 s: 12는 변수 a의 값을 나타냅니다. "it is a test. 길이는 12입니다. 변수는 세미콜론 ";"으로 구분됩니다.
session_decode
함수 함수: 세션 정보 디코딩
함수 프로토타입: boolean session_decode (문자열 데이터)
반환 값 : 부울 값
함수 설명: 이 함수는 세션 정보를 디코딩하고 성공하면 논리값 true를 반환할 수 있습니다.
Php5는 더 이상 session_id를 사용하지 않지만, 다음과 같은 경우 상수 SID로 변환하여 쿠키에 저장합니다. 클라이언트는 쿠키를 비활성화합니다. PHP는 자동으로 URL을 통해 SID를 전달하며, 조건은 php.ini에서 session.use_trans_sid = 1로 설정하는 것입니다. 이때 클라이언트가 쿠키를 비활성화하더라도 문제가 되지 않습니다.
() 관련 공격을 피하기 위해 SID를 출력합니다.

Session跨页传递问题:
session跨页传递需要考虑三种情况:
①客户端禁用了cookie。
②浏览器出现问题,暂时无法存取cookie
③php.ini中的session.use_trans_sid = 0或者编译时没有打开--enable-trans-sid选项
为什么会这样呢?下面解释一下原因:
Session文件分为两部分:session变量保存在服务器端(默认以文件方式存储session);而session id则以cookie形式保存在客户端。(注意:session默认是基于cookie的)。
    当用户的浏览器向服务器提出请求时,同时发送包含session id的cookie(默认情况下)。服务器根据客户端提供的session id来得到用户的文件,即保存在服务器端的session变量值。事实上,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。
    PHP中的session在默认情况下是使用客户端的Cookie来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。必须注意的是:session不一定必须依赖cookie,这也是 session相比cookie的高明之处。当客户端的Cookie被禁用或出现问题时,PHP会自动把session id附着在URL中,这样再通过session id就能跨页使用session变量了。但这种附着也是有一定条件的,其一:“php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”;其二:运行PHP的服务器必须是unix/linux系统,windows不具备此项功能。
     明白了以上的道理,我们就可以得出解决session跨页传递问题的三条途径:
1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。
下面举例说明:
第一种情况:
page1.php

<?php
 session_start();
 $_SESSION[&#39;var1&#39;]="中华人民共和国";
 $url="<a href="."\"s2.php\">下一页</a>";
 echo $url;
 ?>
 page2.php
 <?php
 session_start();
 echo "传递的session变量var1的值为:".$_SESSION[&#39;var1&#39;];
 ?>

运行以上代码,在客户端cookie正常的情况下,应该可以在得到结果“中华人民共和国”。
现在你手动关闭客户端的cookie,再运行,可能得不到结果了吧。如果得不到结果,再“设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项”,又得到结果“中华人民共和国”

第二种途径:
s1.php

<?php
 session_start();
 $_SESSION[&#39;var1&#39;]="中华人民共和国";
 $sn = session_id();
 $url="<a href="."\"s2.php?s=".$sn."\">下一页</a>";    //PHP5定义了一个常量SID来表示session_id(),$url还可以写成$url=&#39;<a href="page2.php?&#39; . SID . &#39;">下一页</a>&#39;;
 echo $url;
 ?>
 s2.php
 <?php
 session_id($_GET[&#39;s&#39;]);
 session_start();
 echo "传递的session变量var1的值为:".$_SESSION[&#39;var1&#39;];
 ?>


第三种途径:

login.html 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
 <head> 
 <title>Login</title> 
 <meta http-equiv="Content-Type" content="text/html; charset=??????"> 
 </head> 
 <body> 
 请登录: 
 <form name="login" method="post" action="mylogin1.php"> 
 用户名:<input type="text" name="name"><br> 
 口 令:<input type="password" name="pass"><br> <input type="submit" value="登录">
  </form> 
  </body> 
  </html> mylogin1.php <?php $name=$_POST[&#39;name&#39;]; 
  $pass=$_POST[&#39;pass&#39;]; if(!$name || !$pass) {     
  echo "用户名或密码为空,请<a href=\"login.html\">重新登录</a>";     
  die(); } if (!($name=="laogong" && $pass=="123")) 
  {     echo "用户名或密码不正确,请<a href=\"login.html\">重新登录</a>";     
  die(); } //注册用户 ob_start(); 
  session_start(); 
  $_SESSION[&#39;user&#39;]= $name; $psid=session_id(); 
  $fp=fopen("e:\\tmp\\phpsid.txt","w+"); 
  fwrite($fp,$psid); 
  fclose($fp); //身份验证成功,进行相关操作 echo "已登录<br>"; 
  echo "<a href=\"mylogin2.php\">下一页</a>"; ?> mylogin2.php <?php $fp=fopen("e:\\tmp\\phpsid.txt","r"); 
  $sid=fread($fp,1024); fclose($fp); session_id($sid); 
  session_start(); if(isset($_SESSION[&#39;user&#39;]) && $_SESSION[&#39;user&#39;]="laogong" ) {      
  echo "已登录!"; } else {     //成功登录进行相关操作     echo "未登录,无权访问";

推荐学习:《PHP视频教程

위 내용은 PHP5 노트(COOKIE 및 SESSION)를 해결하는 한 가지 요령(공유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제