boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

使用 Nginx 获取客户端 TLS 版本并传递给 PHP


avatar
站长 2025年8月5日 10

使用 Nginx 获取客户端 TLS 版本并传递给 PHP

本文将介绍一种绕过 Nginx 直接获取客户端 TLS 版本限制的方法,通过客户端 JavaScript 获取 TLS 版本信息,并将其传递给 PHP-FPM 处理。

Nginx 本身无法直接将客户端 TLS 版本信息传递给 PHP-FPM。但我们可以利用客户端 JavaScript 来获取 TLS 版本,然后将该信息通过 GET 或 POST 请求发送到服务器。

具体步骤如下:

  1. 使用 howsmyssl.com API 获取客户端 TLS 版本。

    howsmyssl.com 提供了一个免费的 API,可以检测客户端使用的 TLS 版本。我们可以通过 JavaScript 调用该 API。

  2. 在客户端页面中添加以下代码:

    <script>    function parseTLSinfo(TLSinf) {       console.log(TLSinf); // 在控制台查看 TLS 信息       // 将 TLS 信息发送到服务器       sendTLSInfoToServer(TLSinf);     }     function sendTLSInfoToServer(TLSinf) {       // 将 TLS 信息编码为 JSON 字符串       const tlsInfoString = JSON.stringify(TLSinf);        // 创建一个 XMLHttpRequest 对象       const xhr = new XMLHttpRequest();        // 配置请求       xhr.open("POST", "/your-php-script.php", true); // 替换为你的 PHP 脚本路径       xhr.setRequestHeader("Content-Type", "application/json");        // 设置回调函数       xhr.onload = function () {         if (xhr.status === 200) {           console.log("TLS 信息已成功发送到服务器");         } else {           console.error("发送 TLS 信息失败:", xhr.status);         }       };        // 发送请求       xhr.send(tlsInfoString);     } </script>  <script src="https://www.howsmyssl.com/a/check?callback=parseTLSinfo"></script>

    这段代码首先定义了一个 parseTLSinfo 函数,该函数作为 howsmyssl.com API 的回调函数。当 API 返回数据时,parseTLSinfo 函数会被调用,并将 TLS 信息作为参数传递给它。

    sendTLSInfoToServer 函数负责将 TLS 信息发送到服务器。这里使用了 XMLHttpRequest 对象,将 TLS 信息以 JSON 字符串的形式通过 POST 请求发送到 /your-php-script.php。你需要将 /your-php-script.php 替换为你实际的 PHP 脚本路径。

  3. 在 PHP 脚本中接收 TLS 信息。

    在你的 PHP 脚本 (/your-php-script.php) 中,你需要接收并处理客户端发送的 TLS 信息。

    <?php  // 获取 POST 请求中的 JSON 数据 $tlsInfoJson = file_get_contents('php://input');  // 将 JSON 数据解码为 PHP 数组 $tlsInfo = json_decode($tlsInfoJson, true);  // 检查是否成功解码 if ($tlsInfo === null) {     error_log("Error decoding TLS info JSON: " . json_last_error_msg());     http_response_code(400); // Bad Request     exit; }  // 现在你可以使用 $tlsInfo 数组中的数据了 // 例如: $tlsVersion = $tlsInfo['tls_version']; $givenCipherSuites = $tlsInfo['given_cipher_suites'];  // 将 TLS 版本信息记录到日志 error_log("Client TLS Version: " . $tlsVersion); error_log("Client Cipher Suites: " . implode(',', $givenCipherSuites));  // 或者将其存储到数据库 // ...  // 返回成功响应 http_response_code(200); // OK echo "TLS info received successfully.";  ?>

    这段 PHP 代码首先使用 file_get_contents(‘php://input’) 获取 POST 请求中的 JSON 数据。然后使用 json_decode 函数将 JSON 数据解码为 PHP 数组。最后,你可以从 $tlsInfo 数组中提取所需的 TLS 信息,例如 TLS 版本和密码套件。

注意事项:

  • howsmyssl.com 是一个第三方服务,依赖于其可用性。如果该服务不可用,你的代码将无法获取 TLS 信息。
  • 这种方法依赖于客户端 JavaScript 的执行。如果客户端禁用了 JavaScript,或者由于网络问题导致脚本无法加载,你的代码将无法获取 TLS 信息。
  • 确保你的 PHP 脚本能够正确处理接收到的 JSON 数据,并进行适当的错误处理。
  • 考虑安全因素,例如验证客户端发送的数据,以防止恶意攻击。

总结:

虽然 Nginx 无法直接将客户端 TLS 版本传递给 PHP-FPM,但通过客户端 JavaScript 和第三方 API,我们可以间接获取 TLS 版本信息,并将其传递给服务器进行处理。 这种方法需要在客户端执行 JavaScript,并且依赖于第三方服务的可用性,因此需要根据实际情况进行权衡和选择。



评论(已关闭)

评论已关闭