사용자가 HTTP 대신 HTTPS를 통해 내 페이지에 액세스하도록하려면 어떻게해야합니까?
HTTPS 페이지 (Apache의 PHP)로 강제 액세스 할 페이지가 하나 있습니다. 전체 디렉토리에 HTTPS가 필요하지 않도록하려면 어떻게해야합니까? 또는 HTTP 페이지에서 HTTPS 페이지로 양식을 제출하면 HTTP 대신 HTTPS로 양식을 보내나요?
내 예는 다음과 같습니다.
http://www.example.com/some-page.php
나는 그것을 통해서만 액세스되기를 원합니다.
https://www.example.com/some-page.php
물론이 페이지에 대한 모든 링크를 HTTPS 버전으로 지정할 수는 있지만 일부 HTTP 사용자가 의도적으로 HTTP를 통해 액세스하는 것을 막지는 않습니다 ...
내가 생각한 한 가지는 PHP 파일의 헤더에 리디렉션을 지정하여 HTTPS 버전에 액세스하고 있는지 확인하는 것입니다.
if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
header('Location: https://www.example.com/some-page.php');
}
그러나 그것은 올바른 방법이 될 수 없습니다.
BTW, URL에주의를 기울이지 마십시오. 실제로 쇼핑 카트 등이있는 페이지 인 경우 다른 방식으로 수행한다는 것을 알고 있습니다. 신용 카드 정보를 입력하면 한 번에 한 항목을 판매하는 사이트의 페이지로 생각하면 한 번만 카드를 충전 할 목적으로 외부 사이트의 지불 게이트웨이에 제출됩니다.
내가 전에 한 방식은 기본적으로 작성한 것과 같지만 하드 코딩 된 값이 없습니다.
if ($ _ SERVER [ "HTTPS"]! = "on") { header ( "위치 : https : //". $ _SERVER [ "HTTP_HOST"]. $ _SERVER [ "REQUEST_URI"]); 출구(); }
Apache에서 지시문과 mod_rewrite를 사용하여 수행 할 수 있습니다.
<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</Location>
원하는 경우 정규 표현식을 사용하여 시간이 지남에 따라 위치를 더 스마트하게 만들 수 있습니다.
클라이언트 가 항상 HSTS ( HTTP Strict Transport Security ) 헤더를 사용 하여 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}
간단!
// 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
때로는 사용자가 보안 연결을 통해 사이트를 탐색하고 있는지 확인해야 할 수도 있습니다. 다음 행을 포함하는 .htaccess 파일을 사용하여 항상 사용자를 보안 연결 (https : //)로 리디렉션하는 쉬운 방법을 수행 할 수 있습니다.
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과 thebigjc가 언급했듯이 httaccess를 사용 하여이 작업을 수행 할 수 있으며 여기에 많은 답변이 있습니다.
다음을 추가하십시오.
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
.httaccess에있는 것의 끝까지.
여전히 우리는이 두 가지 도구로 가능한 한 안전하지 않습니다.
나머지는 간단합니다. 누락 된 속성이있는 경우
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
(동일한 세션 다른 값)
So all Im saying is dont just settle for one or the other when the answer lies in a combination.
For more httaccess rewriting info see the docs-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html
Some Stacks here -> Force SSL/https using .htaccess and mod_rewrite
and
Getting the full URL of the current page (PHP)
to name a couple.
The PHP way:
$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);
}
The Apache mod_rewrite way:
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Use $_SERVER['HTTPS']
to tell if it is SSL, and redirect to the right place if not.
And remember, the page that displays the form does not need to be fed via HTTPS, it's the post back URL that needs it most.
Edit: yes, as is pointed out below, it's best to have the entire process in HTTPS. It's much more reassuring - I was pointing out that the post is the most critical part. Also, you need to take care that any cookies are set to be secure, so they will only be sent via SSL. The mod_rewrite solution is also very nifty, I've used it to secure a lot of applications on my own website.
use htaccess
:
#if domain has www. and not https://
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{HTTP_HOST} ^(?i:www+\.+[^.]+\.+[^.]+)$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]
#if domain has not www.
RewriteCond %{HTTP_HOST} ^([^.]+\.+[^.]+)$
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [QSA,L,R=307]
Don't mix HTTP and HTTPS on the same page. If you have a form page that is served up via HTTP, I'm going to be nervous about submitting data -- I can't see if the submit goes over HTTPS or HTTP without doing a View Source and hunting for it.
Serving up the form over HTTPS along with the submit link isn't that heavy a change for the advantage.
If you use Apache or something like LiteSpeed, which supports .htaccess files, you can do the following. If you don't already have a .htaccess file, you should create a new .htaccess file in your root directory (usually where your index.php is located). Now add these lines as the first rewrite rules in your .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
You only need the instruction "RewriteEngine On" once in your .htaccess for all rewrite rules, so if you already have it, just copy the second and third line.
I hope this helps.
Using this is NOT enough:
if($_SERVER["HTTPS"] != "on")
{
header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
exit();
}
If you have any http content (like an external http image source), the browser will detect a possible threat. So be sure all your ref and src inside your code are https
For those using IIS adding this line in the web.config will help:
<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>
A full example file
<?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>
You shouldn't for security reasons. Especially if cookies are in play here. It leaves you wide open to cookie-based replay attacks.
Either way, you should use Apache control rules to tune it.
Then you can test for HTTPS being enabled and redirect as-needed where needed.
You should redirect to the pay page only using a FORM POST (no get), and accesses to the page without a POST should be directed back to the other pages. (This will catch the people just hot-jumping.)
http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/
Is a good place to start, apologies for not providing more. But you really should shove everything through SSL.
It's over-protective, but at least you have less worries.
I have been through many solutions with checking the status of $_SERVER[HTTPS] but seems like it is not reliable because sometimes it does not set or set to on, off, etc. causing the script to internal loop redirect.
Here is the most reliable solution if your server supports $_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;
}
Please note that depending on your installation, your server might not support $_SERVER[SCRIPT_URI] but if it does, this is the better script to use.
You can check here: Why do some PHP installations have $_SERVER['SCRIPT_URI'] and others not
maybe this one can help, you, that's how I did for my website, it works like a charm :
$protocol = $_SERVER["HTTP_CF_VISITOR"];
if (!strstr($protocol, 'https')){
header("Location: https://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
exit();
}
I have used this script and it works well through the site.
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;
}
?>
That easy.
'development' 카테고리의 다른 글
jekyll markdown 내부 링크 (0) | 2020.07.01 |
---|---|
Swift에서 Optional에 기본값을 제공 하시겠습니까? (0) | 2020.07.01 |
Python의 Hello World (0) | 2020.07.01 |
목록에서 문자열 값 찾기 및 바꾸기 (0) | 2020.07.01 |
ajax 업데이트 / 렌더링을위한 컴포넌트의 클라이언트 ID를 찾는 방법은 무엇입니까? (0) | 2020.07.01 |