TRUE))); $read = stream_sock-6ren">
gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:44 25 4
gpt4 key购买 nike

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

<?php

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

# rest of code
...

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

现在我有情况了。用户请求如下 URL

http://domain.com/login.php

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

https://domain.com/login.php

例如,SSL 证书会在一段时间后过期,并且希望让用户在没有安全连接的情况下使用登录。

我的目标是这个例子:

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 解决方案(自动检测)!

如有任何帮助,我们将不胜感激。

最佳答案

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

<?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)

<?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 并标记为无效。使用您的脚本检查有效性,您就可以开始了。

关于php - 如何使用 PHP 检测安全连接 (https)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15108258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com