php - 启用 SSL 认证 (HTTPS) 后 HTTP 附加 GET 输入两次

标签 php c++ http https

我们使用最新的技术堆栈升级了我们的托管平台,其中包括从版本 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=ae21250db8b20cac3b7016e6d36a63de5846d53 7f032ed841a3e5c9121202cf4 ?code=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 ver 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"

您可以看到 httphttps 请求的区别。

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

似乎将桌面应用更改为具有 https 将有助于解决该问题,但这是我们对桌面应用无能为力的事情。

所以我们必须从服务器端转达修复,但我们的托管公司似乎并不完全了解这个问题。

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

我不确定我是否遗漏了一些更好的短语/术语来更好地向他们解释这个问题。如果有更好的方式向我们的托管公司解释该问题,请告诉我。

如果没有解决,我可以要求他们取消 SSL 认证吗?

另一个更新:

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


我们已将此问题提交给我们的工程师,他们确认这只会在调用 http 而不是 https 时发生。您现在需要使用 https,因为您已经启用了 SSL。

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 发出请求时代码被附加了两次,这是否有任何线索可以发现问题所在?

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

最佳答案

如何解决PHP升级错误:

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

1) Check your scripts for PHP Errors .

2) 检查由更新引起的 php.ini 文件更改。
根据您的系统和升级方法,php.ini 文件可能会被调整甚至是新的默认值一个。 Read the Migration Notes 看看这是否适用于您。您将需要查看和探索更改的内容。同时手动比较您的保留/备份 php.ini 与当前/新的实时代码。

3) Read the PHP Migration notes for each version you have upgraded into and then out
(这些最好从最旧到最新完成)。

4) Read the corresponding PHP Changelog(s) 并搜索此文本(太长了)以查找您发现在步骤 (1) 中失败的函数。


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

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

祝你好运。


更新

Even with this SSL log, I can see the value for code twice and the same written to the file. I would expect it would be something like
example.com/?code=123456789 but not as
example.com/?code=123456789?code=123456789.

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

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

我认为您的问题出在以上一个或两个地方。

更新 2:

Comment by Thi :

Here is what my hosting company responded, "as per our engineers the cause of the logs is de to the website making http (not https) calls to the google api for css and other things. They have advised that you need to ensure that any code that relates to http is switched to https." - There is below line in all of our html pages and have changed it to https but it didn't help <link href="fonts.googleapis.com/…" rel="stylesheet" type="text/css">

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

解决方案:

1) 将您所有的传出链接更新为 https://(或简称为 //),这样:

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

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

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

在您的 .htaccess 或等效文件中:

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

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

关于php - 启用 SSL 认证 (HTTPS) 后 HTTP 附加 GET 输入两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56821504/

相关文章:

php - 在 PHP 中自动加载特征

PHP:从数据库中提取的列中的日期未更新(phpMyAdmin)

javascript - 如何从数据库设置值计时器倒计时?

php - 我如何判断 MySQL 查询是否在 PHP 中未返回任何内容?

c++ - 在扩展字符串中查找第 k 个元素

http - 如何在具有底部导航的应用程序中处理 http GET 请求

c++ - 用于呈现蛋白质带状图的 OpenGL 代码

c++ - 模板元编程 : Problems with Partial Specialization

php - 更改 http header 信息以隐藏服务器信息

android - 在 Android 上使用 POST 发送登录信息!