首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PHP检测安全连接(https)?

如何使用PHP检测安全连接(https)?
EN

Stack Overflow用户
提问于 2013-02-27 09:18:31
回答 3查看 9.4K关注 0票数 0

目前,我的服务器上包含了SSL。希望通过https强制我的用户使用登录页面登录。

代码语言:javascript
复制
<?php

  if (empty($_SERVER['https']) || $_SERVER['https'] != 'on') {
    header('location: https://my_login_page');
    exit();
    }

  # rest of code
  ...

但是,当没有SSL时,这是一个问题。

现在我有情况了。用户请求后的URL

代码语言:javascript
复制
http://domain.com/login.php

在这里,我无法访问$_SERVER['https'],并希望确保可以将用户重定向到

代码语言:javascript
复制
https://domain.com/login.php

例如,SSL证书在一段时间后到期,希望保持用户使用登录w/out安全连接。

我的目标是类似于这个例子:

代码语言:javascript
复制
if (ssl_installed() && (empty($_SERVER['https']) || $_SERVER[] != 'on')) {
  header('location: https://domain.com/login.php');
  exit();
  }

# when there's no SSL it continues using HTTP

是的,希望编写函数(例如:ssl_installed()),它在可能使用安全连接时返回true,否则使用false

我尝试过使用get_headers(),并意识到它总是针对https://链接返回false。

可能的解决方案:

我已经有解决办法了。我的数据库中的配置表包含行ssl=1 (或0),在建立了数据库连接之后,我将使用这个值来决定是否可以使用SSL,上面提到的函数使用这个值来返回结果。

我的问题是:有更简单的解决方案吗?

要澄清的是:,我正在寻找PHP解决方案(自动检测)!

任何帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-27 09:36:45

您可以在配置文件中执行类似的操作,而不是编辑每个脚本。

代码语言:javascript
复制
<?php

// will match /login.php and /checkout.php as examples
$force_ssl = preg_match('/\/(login|checkout)\.php(.+)?/', $_SERVER['REQUEST_URI']);
$using_ssl = (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? true : false;

$url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

if ($force_ssl && !$using_ssl) {

    // redirect to SSL
    header('Location: https://' . $url);

} elseif (!$force_ssl && $using_ssl) {

    // redirect back to normal
    header('Location: http://' . $url);

}

然后,如果证书过期,只需在配置文件中将$force_ssl设置为false,它将处理以前重定向的每个脚本。

现在问题已经澄清了,您可以创建这样的PHP脚本(从https://stackoverflow.com/a/4741196/654678获取的代码)

代码语言:javascript
复制
<?php

// get and check certificate
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
$read = stream_socket_client("ssl://www.google.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
$cert = stream_context_get_params($read);

$valid = ($cert["options"]["ssl"]["peer_certificate"] != NULL) ? true : false;

// save validity in database or somewhere else accessible

然后设置一个crontab,或每日任务或其他东西,以便每天访问该PHP脚本。如果没有证书,它将返回NULL并被标记为无效。用你的脚本检查你的有效性,你就可以走了。

票数 5
EN

Stack Overflow用户

发布于 2013-02-27 09:23:53

我认为您可以使用htaccess解决这个问题,这两个条件可能会有所帮助。

  • RewriteCond %{HTTP:X转发-SSL} on
  • RewriteCond %{HTTPS} on

有关更多信息,请参见以下答案:https://stackoverflow.com/a/1128624/1712686

票数 1
EN

Stack Overflow用户

发布于 2019-03-07 09:42:13

代码语言:javascript
复制
/**
 * Return true if HTTPS enabled  otherwise return false
 */
function check_ssl() {
  if ( isset( $_SERVER['HTTPS'] ) ) {
    if ( 'on' == strtolower( $_SERVER['HTTPS'] ) ) {
      return true;
    } elseif ( '1' == $_SERVER['HTTPS'] ) {
      return true;
    }
  }

  if ( isset( $_SERVER['SERVER_PORT'] )
    && ( '443' == $_SERVER['SERVER_PORT'] ) 
  ) {
    return true;
  }

  return false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15108258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档