本文将介绍一种绕过 Nginx 直接获取客户端 TLS 版本限制的方法,通过客户端 JavaScript 获取 TLS 版本信息,并将其传递给 PHP-FPM 处理。
Nginx 本身无法直接将客户端 TLS 版本信息传递给 PHP-FPM。但我们可以利用客户端 JavaScript 来获取 TLS 版本,然后将该信息通过 GET 或 POST 请求发送到服务器。
具体步骤如下:
-
使用 howsmyssl.com API 获取客户端 TLS 版本。
howsmyssl.com 提供了一个免费的 API,可以检测客户端使用的 TLS 版本。我们可以通过 JavaScript 调用该 API。
-
在客户端页面中添加以下代码:
<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 脚本路径。
-
在 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,并且依赖于第三方服务的可用性,因此需要根据实际情况进行权衡和选择。
评论(已关闭)
评论已关闭