首页 > 解决方案 > 启用 SSL 认证 (HTTPS) 后 HTTP 附加 GET 输入两次

问题描述

我们使用最新的技术堆栈升级了我们的托管平台,其中包括从 7.0 版到 7.3 版的 PHP 更新并启用了 SSL 认证。

升级后,我们的一种用户身份验证方法失败了,它一直有效,直到托管平台升级。

这是 PHP 代码的副本 - codecheck.php,

<html>
<body>
<?php 
        $header = "Content-Type: application/json";
        header($header);

        $code = $_GET["code"];

        $codelistFile  = "./codelist.txt";
        $codeList = file( $codelistFile, FILE_SKIP_EMPTY_LINES);

        $codelistOutput = sprintf('%s%s', $code, "\r\n" );

        file_put_contents( $codelistFile, $codelistOutput, FILE_APPEND); 
?>
</body>
</html>

这是平台升级前codelist.txt的结果(PHP版本7.0)

65cafead50f6d205d66f90c74f1683344ca86c8cc60fc0370c278ecb880da5c8
6e85e436538335da64f6e9172bd4191686e591aa390cca69acb9346668a48bd5

这是平台升级后codelist.txt的结果(PHP版本7.3)

774cad9dd07761fe79db8baa9370a3dd84abca558c73c1f46b39e7c996a26d70?code=774cad9dd07761fe79db8baa9370a3dd84abca558c73c1f46b39e7c996a26d70
f10bb27fb82b0d539d3607012655012764c60794cc656aa6912eccc16d927a82?code=f10bb27fb82b0d539d3607012655012764c60794cc656aa6912eccc16d927a82

这是与“代码”文本本身一起重复的代码值,因此“代码”的值在比较时不匹配。

这是我在 ssl_access 日志文件中可以看到的内容, ssl_access.log-20190629:79.1.200.79 - - [29/Jun/2019:07:46:24 +0100] "GET /codelist.php?code=ae21250db8b20cac3b7016e6d36a63de5846d537f031ed20cf4a?codee=cac3b7016e6d36a63de5846d537f0312ed84cf4a?codee ae21250db8b20cac3b7016e6d36a63de5846d537f032ed841a3e5c9121202cf4 HTTP/1.1" 200 19 "-" "注册"

从这个日志文件中,我可以看到所有对服务器附加数据的 GET 请求。

我希望它会是这样的,

example.com/?code=123456789 但不像 example.com/?code=123456789?code=123456789

我对 PHP 和 HTTPS 的东西很陌生,请帮助解决这个问题。谢谢你。

这是一个更新:

正如所建议的,问题似乎更多地与 SSL 重写有关,

这是来自桌面应用程序的代码,应用程序将在其中连接并与服务器检查代码,

C++:


CString RegistrationServer::Uri( CString page, CString code )
{
    CString sServer;

    sServer.Format("http://www.mywebsite,com/%s?code=%s", page, code); 

   //Here page=codecheck.php and code = 10;

    return sServer;
}

这是通过桌面应用程序提交时的日志,

27.62.66.34 - - [30/Jun/2019:21:55:51 +0100] "GET /codecheck.php?code=10?code=10 HTTP/1.1" 200 - "-" "Hack-o-Matic 版本0.01"

我可以通过网络浏览器模拟相同的请求,如下所示,

https://www.mywebsite/codecheck.php?code=10

这是通过网络浏览器提交时的日志,

27.62.66.34 - - [30/Jun/2019:21:46:28 +0100] "GET /codecheck.php?code=10 HTTP/1.1" 200 - "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"

您可以看到两个请求的区别是httpvs https

当请求来自桌面应用程序时,代码数据被附加两次,使用 http。

似乎将桌面应用程序更改为具有https将有助于解决问题,但这是我们无法对桌面应用程序做任何事情的事情。

所以我们必须从服务器端进行修复,但我们的托管公司似乎并没有完全理解这个问题。

自过去 3 天以来,他们一直在分析问题并提出一些修复,例如 googleapi 调用修复,但这无助于解决我们的真正问题。

我不确定我是否遗漏了一些更好的短语/术语来更好地向他们解释这个问题。请让我知道是否有更好的方法向我们的托管公司解释该问题。

如果没有任何效果,我可以要求他们删除 SSL 认证吗?

另一个更新:

这是我们托管公司的回复,


我们已将此提交给我们的工程师,他们确认这仅在调用 http 而不是 https 时发生。由于您已启用 SSL,因此您现在需要使用 https。

Latitude-E6540:~$ curl -I http://www.mywebsite.com/codecheck.php?code=10 
HTTP/1.1 301 Moved Permanently
Server: nginx/1.15.8
Date: Mon, 01 Jul 2019 11:03:47 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://www.mywebsite.com/codecheck.php?code=10?code=10
Strict-Transport-Security: max-age=15768000

我们的工程师进行了一些测试,当他们设置为 https 时,他们无法复制。

Latitude-E6540:~$ curl -I https://www.mywebsite.com/codecheck.php?code=10 
HTTP/1.1 200 OK
Server: nginx/1.15.8
Date: Mon, 01 Jul 2019 11:03:35 GMT
Content-Type: application/json
Connection: keep-alive
Strict-Transport-Security: max-age=15768000

这是来自服务器的日志,

213.171.217.184 - - [01/Jul/2019:12:03:35 +0100] “HEAD /usage7.php?code=10 HTTP/1.1” 200 - “-” “curl/7.58.0”

他们确认这看起来与您的本地软件设置有关,因为这似乎只是在“通过浏览器提交请求后,HTTP GET 数据没有附加两次但通过他们的桌面软件提交时, HTTP GET 数据附加两次"


我想问你的是,从 curl 输出本身下方,我可以看到当使用 http 发出请求时,代码被附加了两次,这是否有任何线索来发现问题所在?

位置:https://www.mywebsite/codecheck.php?code=10?code=10

标签: phpc++httphttps

解决方案


如何解决PHP升级错误:

事后,如何查找、诊断和修复明显由 PHP 更新引起的错误?

1)检查您的脚本是否有 PHP 错误

2) 检查php.ini由更新引起的文件更改。
根据您的系统和升级方法,php.ini文件可能会被调整,甚至是新的默认文件。阅读迁移说明,看看这是否适用于您。您将需要查看和探索发生了什么变化。还要手动将您的保留/备份php.ini与当前/新的实时比较。

3)阅读您升级到然后退出的每个版本的 PHP 迁移说明
(最好从最旧到最新完成)。

4)阅读相应的 PHP Changelog(s)并搜索此文本(它很冗长)以查找您在步骤 (1) 中发现失败的函数。


对于您的具体情况;您的代码质量非常低(您在发送 HTML 代码后发送 HTTP heders)所以问题很可能是由于 PHP 将已经存在的错误从E_WARNING升级到E_ERROR或类似的。

低质量的代码最容易通过打开error_reporting(E_ALL);脚本或打开php.ini并阅读生成的错误日志来修复。

祝你好运。


更新

即使使用此 SSL 日志,我也可以看到两次代码的值,并且将相同的值写入文件。我希望它类似于
example.com/?code=123456789,但不是
example.com/?code=123456789?code=123456789。

您有两个标志?意味着您应该探索设置code=值的代码,请使用此信息更新您的问题,代码是如何设置的?

您的问题可能与您的 HTTP 主机路由、Apache、Nginx 等有关,您的 HTTP 主机可能是双重加载,首先是 HTTP_ 页面,然后是重定向到附加了原始查询字符串的 HTTPS 页面,因此附加了两次。

我认为上述一项或两项是您的问题所在。

更新 2:

蒂评论

这是我的托管公司的回应,“根据我们的工程师,日志的原因是网站对 google api 进行了 http(不是 https)调用以获取 css 和其他内容。他们建议您需要确保任何与 http 相关的代码已切换为 https。” - 我们所有的 html 页面中都有以下行,并将其更改为 https,但它没有帮助<link href="fonts.googleapis.com/…&quot; rel="stylesheet" type="text/css">

这与我上面提到的有关检查服务器路由的 HTTP 和 HTTPS 协议的内容有关。

解决方案:

1)更新您所有的传出链接https://(或简单地//),以便:

<link href="//fonts.googleapis.com/..." rel="stylesheet" type="text/css">

如果安全加载,将始终安全连接。

2)使用内容安全策略 (CSP)升级不安全请求标志来做到这一点;强制http://您网站内的所有链接https://被客户端浏览器转换为链接。

在您的.htaccess或 equivilant 文件中:

Content-Security-Policy: upgrade-insecure-requests;

但是,对 3rd 方资源的不安全调用不会导致您的代码块被两次附加到您的 URL


推荐阅读