programing

PHP에서 HTTP에서 HTTPS로 전환할 때 세션 손실

subpage 2023. 7. 28. 22:07
반응형

PHP에서 HTTP에서 HTTPS로 전환할 때 세션 손실

페이지로 때, 는 체크아웃 페이지에서 됩니다.http://sitename.comhttps://sitename.com.

적으로결과로.$_SESSION변수가 손실됩니다.

사이트에 일부 사용하거나 사용하지 않을 수 있는 유효한 SSL 인증서가 있습니다.

동일한 서버에서 HTTP 서비스와 HTTPS 서비스를 전환할 때 HTTP 세션 ID가 HTTPS 세션으로 전달되지 않습니다.세션 ID를 HTTP 페이지에서 HTTPS 페이지로 전달하여 다음 세 가지 방법 중 하나로 설정할 수 있습니다.

PHP에서: session_start:

session_start()합니다.

으로 션세사때일로스으시를다니작합크트립적반용할을▁다▁your로 합니다.session_start() 쿠키셋이 경우, '아이디', '아이디', '아이디session_start()이 세션 ID를 사용합니다.되어 있지 경우, " " " " " " " " " " " " " " " " " " "session_start()새 파일을 만듭니다.

되어 있지 경우(들어 의 새 를 만들고 ),session_id()기능.session_id()또한 세션 ID를 문자열로 편리하게 반환합니다.

...

$currentSessionID = session_id();

...

설정합니다.$currentSessionID 세션 ID와 하며, variable은 " " " " " ID " 입니다.

...

session_id($aSessionID);

...

합니다.에서 라우저의키쿠 ID:$aSessionIDPHP: session_id에서

여기 두 개의 스크립트를 사용한 예가 있습니다.하나는 HTTP를 통해 액세스하고 다른 하나는 HTTPS를 통해 액세스합니다.세션 데이터를 유지 관리하려면 동일한 서버에 있어야 합니다.

스크립트 1(HTTP):

<?php

// This script will create a session and display a link to your secure server address
// to transfer your session ID. In this example, the secure page to receive the session
// ID is located at http://www.yoursite.com/safePages/securePage.php

// Start a session using the current session ID stored in a cookie, or create
// a new session if none is set.
session_start();

$currentSessionID = session_id();

// Set a variable that will be retrieved with the HTTPS script.
$_SESSION['testvariable'] = 'It worked';

// $secureServerDomain is the domain of your secure server
$secureServerDomain = 'www.yoursite.com';

// $securePagePath is the path to the page that will receive and set the session ID.
$securePagePath = '/safePages/securePage.php'

echo '<a href="https://' . $secureServerDomain . $securePagePath . '?session="' . $currentSessionID . '">Click here to transfer your session to the secure server</a>';

?>

스크립트 2(HTTPS):

<?php

// Retrieve the session ID as passed via the GET method.
$currentSessionID = $_GET['session'];

// Set a cookie for the session ID.
session_id($currentSessionID);

// Start a session.
session_start();

// Test retrieval of variable set when using HTTP.
if (!empty($_SESSION['testvariable'])) {
      echo $_SESSION['testvariable'];
} else {
      echo 'It did not work.';
}

?>

이렇게 하려면 HTTP 및 HTTPS 서버가 동일한 세션 데이터 저장 기질을 사용해야 합니다(즉, 기본 파일 처리기의 경우 동일한 php.ini를 사용하여 동일한 물리적 시스템에서 실행됨).여기에는 몇 가지 보안 결함이 있으므로 중요한 정보를 전송하는 데 이 코드를 사용하지 않습니다.그것은 단지 실행 가능한 예로서 의도된 것입니다.

전에 이 문제에 부딪혔을 때 빠른 해결책으로 위와 같은 것을 생각해 냈는데, 문제의 원래 원인이 생각났습니다.저는 http://www.example.com/page.php 에서 https://example.com/page.php 으로 가고 있었습니다("www"가 부족하다고 생각합니다).http://www.example.com/page.php https://www.example.com/page.php 에 연결되고 http://example.com https://example.com/page.php 에 연결되는지 확인합니다.

PS, 제가 실제로 이 스크립트들을 실행하지 않았기 때문에 오타가 한두 개 있을 수 있습니다.

세션 쿠키가 보안으로 설정된 것 같습니다.쿠키에는 true로 설정된 경우 쿠키가 비https 사이트로 전송되지 않음을 의미하는 "보안" 플래그가 있습니다.PHP는 세션 쿠키에 그것을 사용하고 있을 것입니다.session_set_cookie_params 함수 또는 php.ini의 session.cookie_secure 설정을 사용하여 이를 변경할 수 있습니다.

우리도 이 문제가 있었습니다.그것은 우리가 PHP 설치에서 soohosin 패치를 사용했기 때문인 것으로 밝혀졌습니다.설정하여 수정합니다.suhosin.session.cryptdocroot = Off/etc/php.d/suhosin.ini.

경의우얼뉴신에 대한 :suhosin.session.cryptdocroothttp://www.hardened-php.net/suhosin/configuration.html#suhosin.session.cryptdocroot 을 참조하십시오.

우리는 원래 블로그 게시물인 http://www.yireo.com/blog/general-news/315-switch-between-http-and-https-looses-php-session 에서 수정 사항을 찾았습니다.

다음 솔루션은 보안 서버와 비보안 서버가 동일한 백엔드 서비스(캐시, 데이터베이스 저장소 등)에 액세스할 수 있다고 가정합니다.

쇼핑을 마친 사용자를 체크아웃 흐름으로 보낼 때도 이와 같은 문제를 해결해야 했습니다.이를 해결하기 위해 캐슁 계층을 배치하고 모든 관련 데이터를 캐슁했습니다.예를 들어 세션 값에서 제품 ID와 사용자 ID를 수집하고, 이를 직렬화하여 해시를 생성한 다음, 마지막으로 해시를 키로 사용하여 세션 데이터를 캐시에 저장합니다.그런 다음 URL에 해시가 있는 보안 사이트로 사용자를 리디렉션합니다.

사용자가 보안 사이트에 도달하면 해시를 기반으로 캐시에서 데이터를 빼내려고 시도합니다.그런 다음 사용자 ID와 제품 ID를 사용하여 데이터베이스에서 모든 가격 및 설명 데이터를 로드하고 최종 체크아웃 검토를 위해 사용자에게 제시할 수 있습니다.

캐시 데이터가 불안정하다는 점에서 상속 위험이 있지만 리디렉션이 빠르게 발생하기 때문에 문제가 발생한 적은 없습니다.

세션 쿠키가 보안 플래그로 생성된 것처럼 보이지만, 체크아웃 페이지의 URL에 세션 쿠키가 전달되지 않는 문제가 있습니다.

또는 세션 쿠키가 안전하지 않을 수 있습니다. 체크아웃 페이지의 URL(http://mysite.com 대 http://www.mysite.com )이 브라우저가 쿠키를 보내지 않을 정도로 충분히 다르기 때문입니다.

만약 당신이 http에서 https로 뒤집거나 그 반대로 뒤집는 것에 대해 더 읽고 싶다면 - 선택적인 ssl에 대한 나의 글을 보세요 :-)

다른 도메인 간에 세션 값을 전달할 수 없습니다.값을 전달하려면 http post-get 또는 데이터베이스를 사용해야 합니다.보안을 위해 문자열의 모든 값을 일치시키고 다음을 사용할 수 있습니다.

sha1($string)

값과 함께 게시하고 다른 페이지에서 얻을 수 있는 값에 대한 sha1을 계산한 다음 해시를 비교합니다.

다른 도메인에 게시 방법을 사용하면 브라우저에 보안 메시지가 표시되므로 이 메시지를 사용하지 마십시오.

url for get method를 사용하는 것은 안전하지 않습니다. 리디렉션 페이지에서 시스템에서 get 매개 변수를 허용하는 암호를 요청해야 합니다.

보안이 필요한 경우 쿠키를 사용하지 마십시오.

제가 제안하는 방법은 데이터베이스에 값을 저장하고 키를 생성한 다음 키를 사용하여 리디렉션 링크를 만들고 키가 있는 get 매개 변수로 사용자 페이지를 전달한 다음 페이지 사용자가 리디렉션되어 해당 키를 가져오고 데이터를 가져와 키를 제거하는 것입니다.sha1로 키를 생성할 수 있습니다.

PAGE 1---
$key=sha1($allvalsconcat);
//insert your session values to a database also the key in a column
header("Location: page2.php?key=".$key);

PAGE 2---
// select from database where key=$_GET["key"];
// delete from table where key=$key

이것은 꽤 안전합니다.

발생할 수 있는 일: 웹 사이트가 데이터를 메모리에 로드하도록 하기 위해 매개 변수 "키"에 대한 임의의 값을 입력하는 스크립트?

항목을 사용한 후 삭제하기 때문에 이러한 현상은 발생하지 않습니다.일부 일반적인 오해는 get 값이 안전하지 않으므로 항상 피해야 한다는 것입니다.

성능을 완벽하게 하려면 mysql에서 테이블 엔진 유형을 "memory"로 설정할 수 있습니다.

여기서 암호화된 정보 전송에 대해 대부분 언급한 내용 외에도 중요한 정보를 타사 API를 통해 전송하는 것과 동일하게 볼 것을 권장합니다.누군가가 요청을 스푸핑하지 않는지 어떻게 압니까?설정의 민감도에 따라 요청의 진정성을 확인하기 위한 많은 프로토콜이 있습니다.조심하지 않으면 계정이 손상될 수 있습니다.

같은 서버에 있더라도 다음 사항을 고려하십시오.

다른 사용자가 암호화된 키를 통과하는 링크, 양식 작업 등을 추적하는 경우, 다른 사용자가 사이트의 보안 버전에 도달하기 전에 이를 탐지하지 못하도록 하는 것은 무엇입니까?만약 제가 공공 와이파이 장소에 있었다면, 그것은 너무 무리하지 않았을 것입니다.당신의 사이트인 척하고, 제 노트북으로 요청을 재전송하고, 토큰을 가져와서 방문자를 그들이 온 곳으로 다시 보낼 수 있습니다.그들은 그것이 결함이라고 생각할 것이고, 전혀 알지 못할 것입니다.이제 저는 그들로 로그인할 수 있고, 아마도 그들의 신용카드 파일로 10,000달러 상당의 물건을 사서 다른 곳으로 배송할 수 있습니다.여기서 주의하는 정도는 민감도와 일치해야 합니다.

또한 토큰이 만료되는지 확인하십시오(한 번만 사용, X초 후 등). 하지만 양 끝에 Post-Redirect-Get 패턴을 사용하는 것도 고려해 보겠습니다. 예:

페이지나 보안되지 않은 사이트의 형태로 직접 링크를 표시하지 않고 백엔드에서 리디렉션되는 링크를 표시합니다(그리고 모든 토큰/암호화 작업을 처리합니다).보안 버전에 도달하면 동일한 작업을 수행합니다(URL에 "?skdf=asdfjalksfjla" 매개 변수만 남겨두지 말고 리디렉션하십시오).

따라서 공식 토큰 기반 시스템은 바로 이 문제를 해결하기 위해 설계되었지만, 이를 위해 OAuth를 구현하는 것은 과도한 작업일 수 있습니다.실행하기 전에 잠재적인 취약성을 계획하는 데 시간을 할애합니다.토큰을 추측하기가 정말 어려울 것이라고 해서 불가능(또는 충돌 등이 있을 수 없음)한 것은 아니므로 그에 따라 계획을 세우십시오.

또한 PHP의 기본 제공 핸들러보다 더 정교한 세션 관리 시스템이 필요할 수 있습니다.PHP가 여러 번 방문하여 세션을 계속하도록 강제할 수 있는지 모르겠습니다(프로토콜 전환은 그렇게 취급됨).

모든 페이지에 HTTPS를 사용하는 것이 이 문제를 방지하는 가장 쉬운 방법이며 사이트의 보안을 향상시킬 것입니다.

모든 페이지에 대한 SSL이 선택사항이 아닌 경우, 보안 세션 쿠키를 사용하여 HTTP 및 HTTPS 페이지 전환 방법을 사용할 수 있습니다.세션 쿠키를 안전하지 않은 상태로 유지하고(따라서 HTTP 및 HTTPS 페이지에서 사용할 수 있음) 인증을 처리할 두 번째 보안 쿠키가 있어야 합니다.이는 "세션 유지"와 "인증"을 분리하는 좋은 방법입니다.

HTTP에서 HTTPS로 또는 HTTPS에서 HTTP로 세션을 관리할 수 있습니다.

  1. GET를 사용하여 페이지 간에 세션 ID 전송

  2. POST별 POST 세션 ID

  3. 파일을 사용하여 세션 저장

  4. 세션에 쿠키 사용

  5. 데이터베이스를 사용하여 세션 저장

아래 예제는 GET를 사용하여 전송하는 데 사용할 수 있습니다.

파일: http.php …………

<?php

session_start();

$sessionID = session_id();

$_SESSION['demo'] = ‘Demo session between HTTP HTTPS’;

echo ‘<a href=”https://www.svnlabs.com/https.php?session=’.$sessionID.’”>Demo session from HTTP to HTTPS</a>’;

?>

파일: https.php ……………

<?php

$sessionID = $_GET['session'];

session_id($sessionID);

session_start();

if (!empty($_SESSION['demo'])) {
echo $_SESSION['svnlabs'];
} else {
echo ‘Demo session failed’;
}

?>

IE7 : 이 페이지에는 보안 항목과 비보안 항목이 모두 포함되어 있습니다.

IE 메시지 보안 및 비보안 항목을 방지하려면 CSS, Js, 이미지, 플래시 등과 같은 페이지의 모든 정적 리소스에 대해 상대 경로를 사용해야 합니다.

IE MessageIE 메시지

쿠키가 손실되는 것 같기 때문에 불가능할 수 있습니다.사용 중인 브라우저는 완전히 다른 도메인을 위한 것이라고 생각해야 합니다.

구체적으로 어떤 브라우저를 사용하고 있습니까?

기본적으로 브라우저가 http 및 https에 대한 연결을 완전히 다른 세션으로 처리할 것으로 예상합니다.일반적으로 http://someUrl/https://someUrl/은 동일한 페이지를 가리키지만 보장되지 않습니다.포트 80(http)과 포트 443(https)에서 실행되는 사이트가 완전히 다를 수 있습니다.

저는 PHP를 모르지만, 일반적으로 세션 변수가 보안 세션과 비보안 세션 사이에서 자유롭게 사용 가능할 것으로 예상하지 않습니다.제가 방문하는 이후의 모든 안전하지 않은 페이지에서 제 마지막 체크아웃의 신용카드 번호를 사용할 수 있으리라고는 예상하지 못합니다.

권위 없는 답변은 죄송하지만 답변이 많지 않아 2c는 집어넣어야겠다고 생각했습니다.

일부 공유 환경에 전용 IP가 있습니까? https와 http는 서로 다른 서버를 통해 라우팅되므로 전환 시 서로 다른 도메인에 있기 때문에 쿠키에 대한 액세스가 손실됩니다.

솔루션은 다음과 같습니다. 전용 IP

모든 페이지에서 항상 https 강제 실행

저도 비슷한 문제가 있었지만, 이 해결책은 저에게 좋았습니다. 아마도 미래에 다른 사람들에게 도움이 될 것입니다.

이것을 당신의 php.ini에 추가합니다.

수호신session.sessiondocroot = 해제

sohosin.suhosin.suhdocroot = 해제

나는 이것으로 해결책을 얻었습니다.먹어봐.

$_SESSION['test'] = 'test';
session_regenerate_id(true);

header("Location: /");// the header must be sent before session close
session_write_close(); // here you could also use exit();

저는 http에서 https로 이동하는 문제를 겪었고 웹사이트 URL을 http://example.com 에서 https://www.example.com 로 변경하여 이 문제를 해결할 수 있었습니다.

URL에 www를 추가하면 이 문제가 해결되었습니다.

감사해요.

HTTPS는 보안을 위한 것이고 그의 역할을 수행하기 때문에 걱정하지 마십시오.

다음은 HTTP에서 HTTPS로 전환하는 동안 세션을 유지할 수 있는 몇 가지 방법입니다.

  1. GET를 사용하여 페이지 간에 세션 ID 전송

  2. POST별 POST 세션 ID

  3. 파일을 사용하여 세션 저장

  4. 세션에 쿠키 사용

  5. 데이터베이스를 사용하여 세션 저장

당신이 제 답장을 통해 뭔가를 얻기를 바랍니다.

언급URL : https://stackoverflow.com/questions/441496/session-lost-when-switching-from-http-to-https-in-php

반응형