【问题标题】:How to deal with long links in HTML-emails如何处理 HTML 电子邮件中的长链接
【发布时间】:2012-09-05 08:07:32
【问题描述】:

我已经在网上搜索过,我可以找到两种解决方案:

  1. 使用 URL-shortner。
  2. 使用方括号 < > 允许插入空格。这仅适用于纯文本电子邮件。

我正在发送包含敏感信息的 HTML 电子邮件,例如密码恢复链接和自动身份验证链接。这些安全链接就其性质而言相当长。很容易超过 70 个字符或对电子邮件正文施加的任意限制。

显然我不能使用任何形式的 URL 缩短,因为它会绕过我用于链接的任何安全加密技术。

我想最大的问题是电子邮件客户端没有很好地包装链接。 CSS3 技术支持漂亮的自动换行,因此 MS Outlook 永远不会支持这一点。

如何使链接不会在视觉上造成干扰,并且在电子邮件客户端出现故障时可能易于复制粘贴?

例子

如果链接似乎不起作用,请尝试将其复制粘贴到您的浏览器: hxxp://发展/#AUTH / YoxOntz0Oj0ExOiJfcmFuG9tbmVzcyI7czoxOTI6kJsYkV0qMGMuZ1pFZVQ5YkRQNDZPR200Unl60dGlpNlhZZC9QcEVeH0lvV2NVVlpWWFcwWlF0VjRyc0p4akYzclJ0GTkJmSlgxco0aEtDS0FuTlBVSXAxUVhCcGdRNGpHMVl5UGZMRFVacDVSQ1BqcU0tKYlNxZ0FqYXpjTkNqTS9LV29xSk4ydGtyeFpNdV0c2VLMERUbEYwc08xUWU5aXR0GOXl0bVFpcjlXeGZjUE100S0o1L1FcmQ4MmhOdm5LUSI7fQ P>

补充说明:

我不希望我的链接过期。如果我希望它们完全过期,我会有几个月的时间框架,而不是几个小时。这些链接不仅仅是密码恢复链接。

【问题讨论】:

  • 为什么 URLs 这么长?当我编写密码检索系统时,我刚刚创建了一个在 24 小时内过期的哈希。那就不需要 70 多个字符了。
  • 使用生成更短网址的算法? MD5 仍然非常适合。
  • 只要你使用加密算法来生成随机值,你如何散列它并不重要。例如,如果您使用openssl_random_pseudo_bytes 生成字符串,您甚至可以只对其进行urlencode 或base64encode。重要的是确保您无法预测字符串并且它有足够的熵来避免暴力攻击。
  • 我不能使用md5,因为 URL 中有可读信息(我已经对示例进行了混淆)。我正在使用 openssl_random_pseudo_bytes 来提供一些加密技术,但由于 URL 包含实际数据,“只是”随机性是不够的。这与使用 URL-shortning 相同。

标签: php html-email


【解决方案1】:

在 Html 电子邮件中 ​​- 使用 html

如果您发送 html 电子邮件,有什么问题:

... <a href="long url">reset your password</a> ...

如果在您发送 html 电子邮件时链接被破坏 - 问题在于您发送电子邮件的方式,而不是收件人的电子邮件客户端。

使用较短的哈希

超长散列(是散列,还是加密?)真的有必要吗?使用任何足够长的哈希值在过期之前不会被暴力破解就足够了。要求用户复制和粘贴一个明显要换行的字符串对用户没有帮助,它只是将开发问题推给用户。

【讨论】:

  • &lt;textarea&gt; 在 Outlook 中不起作用(我会假设大多数其他电子邮件程序)。标记被完全忽略。
  • 生成更短的哈希值肯定是我正在考虑的事情,但即使是简单的 base64_encoded sha512 哈希值也非常长。
  • 我想我已经解释过了,也许不够明显:一些链接是自动身份验证链接(跳过显式用户登录)。您发布的有关 sha1 安全性的链接不适用,因为攻击者可以轻松了解有关如何生成哈希的更多信息。这是一个实际运行的应用程序,而不仅仅是对哈希的盲目攻击。如果可以的话,我会否决该评论,因为以这种方式考虑安全性很危险。
  • 在我看来,您正在向用户发送加密的身份验证 URL,而不是向他们显示安全网页上的链接,以便他们可以适当地使用它(拖动到书签)。如果散列以明文形式出现在电子邮件中,则创建散列的时间无关紧要。使用加密而不是哈希是您的网址如此长的主要原因 - 也是主要问题。只需使用哈希/令牌表,这部分问题就会消失 - 并允许您随时使令牌无效,以及取消电子邮件 URL 与用户凭据的关联
  • 不要这样做 (&lt;a href="long url"&gt;reset your password&lt;/a&gt;)。这种方法会增加您的垃圾邮件分数,因为反垃圾邮件解决方案会认为您的链接试图隐藏目的地。结论:为避免被标记为垃圾邮件,锚点的 href 和 text 应该始终是相同的字符串。
【解决方案2】:

您是否尝试过 Microsoft 专有的 word-break:break-all; ?

<td style=“word-break:break-all;”>

这对我来说效果最好(跨供应商的最佳兼容性):

<p style="word-break:break-all;">
    <font style="word-break:break-all;">hxxp://really_long_link</font>
</p>

测试于:MS Office 2007/2010、outlook.com、hotmail.com、gmail.com、yahoo.com(雅虎显示不佳)


虽然已将其编辑为包含 &lt;p&gt;...&lt;/p&gt;,但如果间距很重要,我强烈反对在 HTML 电子邮件中使用段落标签,因为电子邮件客户端会以不同方式解释这些标签。

【讨论】:

  • 我已经确认这至少在 MS Outlook 中有效。我需要做更多的测试,但看起来很有希望。
  • 我检查了一些较大的在线邮件供应商,这段代码似乎有效。我已经用最适合我的代码更新了答案(跨供应商的最佳兼容性)。
  • 注意:这会破坏普通文本的自动换行!如果包含在具有此样式的标签中,您的文字将在所有客户端的中间被截断。
  • 注意&lt;p&gt; 标签很好用,关于“我强烈反对使用段落标签”,因为您需要做的就是设置所需的边距。 IE。像这样的迷你 CSS 重置:&lt;p style="margin:0"&gt;margin: 20px 0 以获得良好的顶部和底部间隙。
猜你喜欢
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 2011-09-06
  • 1970-01-01
  • 2017-09-22
  • 2012-03-24
相关资源
最近更新 更多