programing

사용자가 HTTP가 아닌 HTTPS를 통해 내 페이지에 강제로 액세스하도록 하려면 어떻게 해야 합니까?

firstcheck 2022. 10. 8. 08:44
반응형

사용자가 HTTP가 아닌 HTTPS를 통해 내 페이지에 강제로 액세스하도록 하려면 어떻게 해야 합니까?

HTTPS 페이지(Apache의 경우 PHP)로 강제로 액세스하고 싶은 페이지는 1개뿐입니다.디렉토리 전체에 HTTPS를 필요로 하지 않고 어떻게 하면 좋을까요?또는 HTTP 페이지에서HTTPS 페이지로 폼을 송신하면 HTTP가 아닌HTTPS로 송신됩니까?

다음은 예를 제시하겠습니다.

http://www.example.com/some-page.php

다음 방법으로만 액세스 할 수 있도록 합니다.

https://www.example.com/some-page.php

물론 이 페이지의 모든 링크를 HTTPS 버전을 가리키도록 할 수는 있지만, 그렇다고 해서 어떤 바보가 일부러 HTTP를 통해 액세스 하는 것을 막을 수는 없습니다.

PHP 파일의 헤더에 리다이렉트를 넣어 HTTPS 버전에 액세스 하고 있는 것을 확인합니다.

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

하지만 그게 옳은 방법일 리가 없잖아, 안 그래?

이전에 제가 했던 방법은 기본적으로 당신이 쓴 것과 비슷하지만 하드코드화된 값은 없습니다.

if($_SERVER[")HTTPS"]!= "ON"){header("Location: https://" . $_SERVER [ " )HTTP_HOST". $_SERVER["REQUEST_URI"];exit();}

Apache에서 디렉티브와 mod_rewrite를 사용하여 수행할 수 있습니다.

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Location>

원하는 경우 정규 표현을 사용하여 시간이 지남에 따라 위치를 더 스마트하게 만들 수 있습니다.

HTTP Strict Transport Security(HSTS) 헤더를 사용하여 항상 HTTPS를 요구하도록 클라이언트에 강제해야 합니다.

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

HSTS는 대부분의 최신 브라우저에서 지원되지만 범용 브라우저에서는 지원되지 않습니다.따라서 위의 로직은 HTTP에 접속할 경우 지원에 관계없이 사용자를 수동으로 리다이렉트하고 가능하면 추가 클라이언트 요구가 브라우저에 의해 리다이렉트되도록 HSTS 헤더를 설정합니다.

방금 .htaccess 파일을 만들고 다음을 추가했습니다.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

심플!

PHP의 방법:

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
    exit(1);
}

Apache mod_rewrite 방법:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}

로드 밸런서 뒤에서 실행할 때 이와 같은 작업을 수행해야 했습니다.모자 힌트 https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}

http://www.besthostratings.com/articles/force-ssl-htaccess.html

사용자가 보안 연결을 통해 사이트를 참조하고 있는지 확인해야 할 수 있습니다.사용자를 항상 안전한 연결(https://)로 리다이렉트하는 간단한 방법은 다음 행이 포함된 .htaccess 파일을 사용하여 실행할 수 있습니다.

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

.htaccess는 웹 사이트의 메인 폴더에 있어야 합니다.

특정 폴더에 대해 HTTPS를 강제로 사용하려는 경우 다음을 사용할 수 있습니다.

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

.htaccess 파일은 HTTPS를 강제 적용해야 하는 폴더에 저장해야 합니다.

좋습니다. 지금 이 문제에 대한 많은 정보가 있지만 "보안" 질문에 답을 하는 사람은 아무도 없습니다.내게는 안전하지 않은 것을 사용하는 것이 바람직하지 않다.

미끼로 삼지 않는 한.

$_SERVER 전파는 방법을 아는 사람의 의지로 변경할 수 있습니다.

또한 Sazzad Tushar Khan과 the bigjc가 언급했듯이 httaccess를 사용하여 이 작업을 수행할 수도 있으며 여기에는 많은 답변이 포함되어 있습니다.

★★★★

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

「 . usage 」는, 「 」를 참조해 주세요.

하지만 이 두 가지 툴로 가능한 한 안전하지 않습니다.

나머지는 간단하다.누락된 특성이 있는 경우(예:

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_HOST'],"mywebsite.com") === FALSE){// Something is FISHY
}


httaccess를 사용하다

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

확인할 수 있는 변수가 더 많습니다.

HOST_URI (확인해야 할 정적 속성이 있는 경우)

HTTP_USER_AGENT (같은 세션이 다른 값)

그래서 내가 말하는 모든 것은 답이 조합에 있을 때 둘 중 하나에 만족하지 말라는 것이다.

httaccess 개서 정보에 대한 자세한 내용은 docs-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html 를 참조하십시오.

여기에 있는 일부 스택 -> .htaccessmod_rewrite를 사용하여 SSL/https를 강제 적용합니다.
...
풀 가져오기(PHP URL (PHP)
몇 가지 예를 들면요.

$_SERVER['HTTPS']SSL인지 확인하고 SSL이 아닌 경우 올바른 위치로 리디렉션합니다.

또한 양식을 표시하는 페이지는 HTTPS를 통해 공급될 필요가 없습니다. 가장 필요한 것은 포스트백 URL입니다.

편집: 예, 아래에 설명되어 있듯이 프로세스 전체를 HTTPS로 설정하는 것이 가장 좋습니다.그것은 훨씬 더 안심이 된다 - 나는 그 게시물이 가장 중요한 부분이라고 지적하고 있었다.또한 모든 쿠키가 SSL을 통해서만 전송되도록 안전하게 설정되어 있는지 확인해야 합니다.mod_rewrite 솔루션도 매우 유용하며, 제 웹사이트에서 많은 애플리케이션을 보호하는데 사용하고 있습니다.

PHP를 사용하여 이 작업을 수행하고자 한다면 다음과 같은 방법으로 작업을 수행할 수 있습니다.


<?php

if(!isset($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != "on") {
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"], true, 301);
    //Prevent the rest of the script from executing.
    exit;
}
?>

$_SERVER superglobal 배열의 HTTPS 변수가 "on"과 동일한지 여부를 확인합니다.변수가 on과 같지 않은 경우.

HTTP 와 HTTPS 를 같은 페이지에 혼재시키지 말아 주세요.HTTP를 통해 제공되는 폼 페이지가 있는 경우 데이터 전송이 불안합니다. View Source를 실행하여 검색하지 않고는 전송이 HTTPS 또는 HTTP를 통해 전송되는지 확인할 수 없습니다.

HTTPS 상에서 폼을 서브미트 링크와 함께 제공하는 것은 이점에 있어서 큰 변화는 없습니다.

Apache 또는 .htaccess 파일을 지원하는 LiteSpeed와 같은 기능을 사용하는 경우 다음을 수행할 수 있습니다.아직 .htaccess 파일이 없는 경우 루트 디렉토리(일반적으로 index.php가 있는 위치)에 새로운 .htaccess 파일을 작성해야 합니다.다음 행을 .htaccess의 첫 번째 개서 규칙으로 추가합니다.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

모든 개서 규칙에 대해 .htaccess에 "Rewrite Engine On" 명령이 한 번만 필요하므로 이미 있는 경우 두 번째 줄과 세 번째 줄을 복사하십시오.

이게 도움이 됐으면 좋겠어요.

이것을 사용하는 것만으로는 불충분합니다.

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}

외부 http 이미지 소스 등의 http 콘텐츠가 있는 경우 브라우저는 가능한 위협을 검출합니다.따라서 코드 내의 모든 ref와 src는 https여야 합니다.

$_SERVER의 상태를 체크하기 위해 많은 솔루션을 경험해 왔습니다.HTTPS] 단, 스크립트가 설정 또는 on, off 등으로 설정되지 않는 경우가 있기 때문에 스크립트의 내부 루프 리다이렉트가 발생할 수 있기 때문에 신뢰할 수 없는 것 같습니다.

서버가 $_SERVER[SCRIPT_URI]를 지원하는 경우 가장 신뢰할 수 있는 솔루션을 다음에 제시하겠습니다.

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]'>";
    exit;
}

설치 환경에 따라서는 서버가 $_SERVER[SCRIPT_URI]를 지원하지 않을 수 있지만 지원한다면 이 스크립트를 사용하는 것이 좋습니다.

여기서 확인할 수 있습니다.일부 PHP 설치에는 $_SERVER['SCRIPT_URI']가 있고 다른 설치에는 없는 이유가 무엇입니까?

IIS 를 사용하고 있는 유저의 경우, web.config 에 이 행을 추가하는 것으로, 다음과 같은 이점이 있습니다.

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
         </rule>
    </rules>
</rewrite>

완전한 샘플 파일

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>
if(location.protocol!=='https:'){location.replace(`https:${location.href.substring(location.protocol.length)}`);}

보안상의 이유로 그러시면 안 됩니다.특히 여기에 쿠키가 있다면.쿠키 기반 리플레이 공격에 대해 폭넓은 관심을 가질 수 있습니다.

어느 쪽이든 Apache 제어 규칙을 사용하여 조정해야 합니다.

그런 다음 HTTPS가 네이블인지 테스트하고 필요에 따라 리다이렉트할 수 있습니다.

FORM POST(No Get)만 사용하여 유료 페이지로 리다이렉트하고 POST가 없는 페이지에 대한 액세스는 다른 페이지로 리다이렉트해야 합니다.(이것은 사람들이 핫점프를 하는 것을 잡아낼 것이다.)

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

시작하기에 좋은 장소입니다. 더 많이 제공하지 못한 것에 대해 사과드립니다.하지만 SSL을 통해 모든 것을 푸시해야 합니다.

과잉보호이지만, 최소한 걱정은 덜 합니다.

아마 이게 도움이 될 거야, 내 웹사이트에서 그렇게 했어, 마법처럼 작동했어:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    exit();
}

'먹다', '먹다', '먹다', '먹다'를 사용할 .X-Forwarded-Proto를 사용하여 HTTPSheader로 합니다.

.htaccess 파일에 다음 행을 추가합니다.

### Force HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

이 대본을 사용해 봤는데 사이트 전체에서 잘 작동합니다.

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    enter code hereheader('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}
<?php 
// Require https
if ($_SERVER['HTTPS'] != "on") {
    $url = "https://". $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
    header("Location: $url");
    exit;
}
?>

그렇게 쉬워요.

언급URL : https://stackoverflow.com/questions/85816/how-can-i-force-users-to-access-my-page-over-https-instead-of-http

반응형