我们已将托管平台升级为最新的技术堆栈,其中包括PHP从7.0版更新到7.3版并启用了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>
这是平台升级之前(使用7.0版PHP)codelist.txt的结果
65cafead50f6d205d66f90c74f1683344ca86c8cc60fc0370c278ecb880da5c8
6e85e436538335da64f6e9172bd4191686e591aa390cca69acb9346668a48bd5
这是平台升级后(使用PHP 7.3版)codelist.txt的结果
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=ae21250db8b20cac3b7016e6d36a63de5846d537f032ed841a3cf5c912 ?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“
我可以通过下面的网络浏览器模拟相同的请求,
这里是通过网络浏览器提交的日志,
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,例如Gecko)Chrome / 74.0.3729.169 Safari / 537.36“
您可以看到两个请求的区别是http
与https
。
当请求来自桌面应用程序时,代码数据会附加两次,使用http。
似乎将桌面应用程序更改为具有 https 可以帮助解决该问题,但这是我们无法使用桌面应用程序做的任何事情。
因此,我们必须从服务器端继续进行修复,但我们的托管公司似乎无法完全理解问题。
自最近三天以来,他们一直在分析问题,并提出了诸如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” < / p>
他们确认这似乎与您的本地软件设置有关,因为这仅在“通过浏览器提交请求后,HTTP GET数据未附加两次,而是通过他们的桌面提交时才获得”软件,则将HTTP GET数据附加两次”
我想问的是,从curl输出本身的下面,我可以看到在使用http发出请求时代码被附加了两次,这是否可以找出问题所在?
答案 0 :(得分:2)
事后,如何查找,诊断和修复明显由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进入然后再离开
(最好从最旧到最新完成)。
4)Read the corresponding PHP Changelog(s)并在此文本中(很长)搜索您在步骤(1)中发现的功能失败。
对于您的特定实例;您的代码质量很差(在发送HTML代码之后发送HTTP提示信息),因此问题很可能是由于PHP将现有错误从 E_WARNING 升级到了 E_ERROR < / strong>,或类似内容。
通过在脚本或php.ini
中浏览error_reporting(E_ALL);
并读取生成的错误日志,最容易修复低质量代码。
祝你好运。
即使使用此SSL日志,我也可以看到两次代码值,并且写入文件的代码相同。我希望它会像
example.com/?code=123456789,而不是
example.com/?code=123456789?code=123456789。
您有两个?
符号,这意味着您应该探索设置code=
值的代码 ,请对此问题进行更新信息,如何设置代码?
您的问题可能出在您的HTTP主机路由,Apache,Nginx等上,您的HTTP主机可能是两次加载,首先是HTTP_页面,然后是重定向到HTTPS页面,并附加了原始查询字符串,因此两次。
我认为上述问题之一或全部是您的问题所在。
这是我的托管公司的回复,“根据我们的工程师的说法,日志的原因是该网站对google api进行了css等其他HTTP(而非https)调用。他们建议您需要确保将与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)Upgrade Insecure Requests标志可以做到这一点;强制客户端浏览器将您网站内的所有http://
链接转换为https://
链接。
在您的.htaccess
或同等文件中:
Content-Security-Policy: upgrade-insecure-requests;
但是,对第三方资源的不安全调用不会导致您的代码块两次附加到您的URL上。