php - 启用 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"
我可以通过网络浏览器模拟相同的请求,如下所示,
这是通过网络浏览器提交时的日志,
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"
您可以看到两个请求的区别是http
vs 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 发出请求时,代码被附加了两次,这是否有任何线索来发现问题所在?
解决方案
如何解决PHP升级错误:
事后,如何查找、诊断和修复明显由 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/…" 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。
推荐阅读
- javascript - 如何实现自定义提取钩子
- javascript - 使用 javascript 时如何调用 .toggle() 函数?
- javascript - 从 innerText 中删除最后一项
- r - 从数据框中的列中删除括号和句号
- android - RecyclerView 在项目单击时闪烁
- r - 无法在谷歌云平台(GCP)中安装 R 的依赖项?
- yocto - Correct handling of persistent files for readonly rootfs
- c# - 使 Azure 认知搜索精确
- go - 如何自动将依赖包添加到 go.mod
- python - Python:列表理解中元组和列表的迭代差异?