代码之家  ›  专栏  ›  技术社区  ›  Thi

从PHP7.0升级到PHP7.3时在PHP脚本上发现错误

php
  •  0
  • Thi  · 技术社区  · 7 年前

    我们已经用最新的技术栈升级了我们的托管平台,其中包括从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>
    

    下面是代码列表的结果。平台升级前的txt(使用PHP 7.0版)

    65cafead50f6d205d66f90c74f1683344ca86c8cc60fc0370c278ecb880da5c8
    6e85e436538335da64f6e9172bd4191686e591aa390cca69acb9346668a48bd5
    

    下面是代码列表的结果。平台升级后的txt(使用PHP 7.3版)

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

    因此,当代码本身的值与代码的值进行比较时,代码本身的值不匹配。

    以下是我在ssl_访问日志文件中看到的内容,即ssl_访问。log-20190629:79.1.200.79---[29/Jun/2019:07:46:24+0100]“GET/codelist.php?code=ae21250db8b20cac3b7016e6d36a63de5846d537f032ed841a3e5c9121202cf4?code=ae21250db8b20cac3b7016e6d36a63de5846d537f032ed841a3e5c9121202cf4 HTTP/1.1“200 19”-“注册”

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

    我想会是这样的,

    实例com/?代码=123456789 但并非如此 实例com/?代码=123456789?代码=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”

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

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

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

    27.62.66.34---[30/Jun/2019:21:46:28+0100]“GET/codecheck.php?code=10http/1.1”200-““Mozilla/5.0(Macintosh;英特尔Mac OS X 10_14_5)AppleWebKit/537.36(KHTML,像Gecko)Chrome/74.0.3729.169 Safari/537.36”

    你可以看到这两个请求的区别 http vs https .

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

    看来,将桌面应用程序更改为 https 将有助于解决这个问题,但这是我们不能用桌面应用程序做的事情。

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

    从过去三天开始,他们一直在分析这个问题,并提出了一些解决方案,比如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=10http/1.1“200-”curl/7.58.0”

    他们确认,这似乎与您的本地软件设置有关,因为这似乎只在“通过浏览器提交请求后,HTTP get数据不会附加两次,但通过其桌面软件提交请求时,HTTP get数据会附加两次”的情况下才会出现


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

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    如何解决PHP升级错误:

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

    1) Check your scripts for PHP Errors .

    2) 检查对应用程序的更改 php.ini 更新导致的文件。
    根据您的系统和升级方法 php。伊尼 文件可能会被调整,甚至是新的 违约 Read the Migration Notes 看看这是否适用于你。你需要回顾和探索发生了什么变化。还要手动比较您的保留/备份 php。伊尼 使用当前/新的live one。

    3) Read the PHP Migration notes for each version you have upgraded 进进出出
    (最好从最老的到最新的)。

    4) Read the corresponding PHP Changelog(s) 然后在这篇文本中(它是looong)搜索在步骤(1)中发现失败的函数。


    针对您的具体情况;您的代码质量非常低(在发送HTML代码之后发送HTTP HEDER),因此问题很可能是由PHP升级源中已经存在的错误引起的 E_警告 E_错误 ,或类似的。

    低质量的代码最容易通过图灵来修复 error_reporting(E_ALL); 要么在脚本中,要么在 php。伊尼 并读取生成的错误日志。

    祝你好运


    使现代化

    即使有了这个SSL日志,我也可以两次看到代码的值,并将相同的值写入文件。我想会是这样的
    实例com/?代码=123456789,但不尽相同
    实例com/?代码=123456789?代码=123456789。

    你有两个 ? 意味着你应该探索 设置 这个 code= 谢谢 使现代化 关于这些信息,你的问题是,代码是如何设置的?

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

    我认为以上一项或两项是你的问题所在。

    更新2:

    Comment by Thi :

    以下是我的托管公司的回应:“根据我们的工程师的说法,日志的原因是网站对谷歌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) Upgrade Insecure Requests 标志着要做到这一点;强迫所有人 http:// 网站内的链接将被转换为 https:// 客户端浏览器提供的链接。

    在你的 .htaccess ,或同等文件:

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

    然而 对第三方资源的不安全调用不会导致代码块被附加到URL两次 .

    推荐文章