生成任意移动的URL字符时

时间:2019-12-16 02:20:33

标签: php html email url php-7.1

从客户处收到此消息后,我们的密码重置电子邮件通常可以正确生成,但是(以代码形式)如下所示:

 <h4> <a href="https://'.$this->server.'/password?email_token='.$email_token.'&user_email='.$user_email.'">reset here</a></h4>

生成的字符串如下:

https://password/?email_token=111111111111111111111aaaaaaabbbb&user_email=info@mail.com

最后,它应该是这样的:

    https://website.com/password?email_token=111111111111111111111aaaaaaabbbb&user_email=info@mail.com

这是有趣的部分:

.'/password?

它的生成如下:

password/?

以某种方式生成电子邮件时,将'password'之前的'/'移至密码之后,但移至'?'之前

这是一个静态字符串片段,这怎么可能发生?

1 个答案:

答案 0 :(得分:1)

这是由客户端(Chrome,FireFox,Edge以及可能的其他客户端解释器,例如Outlook)中的URL解析引起的问题。我没有测试Opera,但是在Internet Explorer 11中没有发生。

有关更多详细信息,请参见:https://webkit.org/blog/7086/url-parsing-in-webkit/

URL解析也可以通过发送或接收MTA来应用,例如; postfix,gmail,office.com等。但是,我对postfix和gmail的测试并没有改变电子邮件的源代码。
我们需要知道您的服务器配置和收件人的MTA才能进行验证。

PHP源代码和结果HTML中的实际字符串输出符合预期

https:///password?email_token=111111111111111111111aaaaaaabbbb&user_email=info@mail.com

由于它不是有效的URI,由于缺少$this->server提供的域,因此有问题的客户端将解析URL并移动多余的/

运行以下代码段,以在浏览器中单击和鼠标悬停时体验URL解析:为简洁起见,缩短了URL参数。

<a href="https:///password?email_token=1">Test</a>

渲染结果:

Rendered URL


使用new URL()时,在Javascript中可能会遇到相同的行为。

var url = 'https:///password?e=1';
var u = new URL(url);
window.alert('Original: ' + url + "\nParsed: " + u.href);


但是,只要提供域,URL便不会更改。

<a href="https://example.com/password?email_token=1">Test</a>