启用S​​SL认证(HTTPS)后,HTTP两次将GET输入附加到后面

时间:2019-06-29 23:36:18

标签: php c++ http https

我们已将托管平台升级为最新的技术堆栈,其中包括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“

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

  

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,例如Gecko)Chrome / 74.0.3729.169 Safari / 537.36“

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

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

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

因此,我们必须从服务器端继续进行修复,但我们的托管公司似乎无法完全理解问题。

自最近三天以来,他们一直在分析问题,并提出了诸如googleapi呼叫修复之类的修复程序,但这无助于解决我们的实际问题。

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

如果没有解决办法,我可以要求他们删除SSL认证吗?

另一个更新:

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


我们已将此问题提交给我们的工程师,他们确认这仅在调用http而不是https时发生。启用S​​SL后,您现在需要使用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发出请求时代码被附加了两次,这是否可以找出问题所在?

  

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

1 个答案:

答案 0 :(得分:2)

如何解决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进入然后再离开
(最好从最旧到最新完成)。

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页面,并附加了原始查询字符串,因此两次。

我认为上述问题之一或全部是您的问题所在。

更新2:

Comment by Thi

  

这是我的托管公司的回复,“根据我们的工程师的说法,日志的原因是该网站对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上