如何处理HTML电子邮件中的长链接

16

我在网上搜寻了一下,发现有两种解决方案:

  1. 使用URL缩短服务。
  2. 使用尖括号<>来允许插入空格。这仅适用于纯文本邮件。

我正在发送包含敏感信息的HTML电子邮件,如密码恢复链接和自动认证链接。这些安全链接本质上非常长,很容易超过70个字符或电子邮件正文施加的任何任意限制。

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

我想最大的问题是这些链接在电子邮件客户端中没有良好的换行。漂亮的单词换行在CSS3技术中得到支持,所以MS Outlook永远不会支持此功能。

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

示例

  

如果链接似乎无法正常工作,请尝试将其复制并粘贴到您的浏览器中:   hxxp://development/#auth/YoxOntz0Oj0ExOiJfcmFuG9tbmVzcyI7czoxOTI6kJsYkV0qMGMuZ1pFZVQ5YkRQNDZPR200Unl60dGlpNlhZZC9QcEVeH0lvV2NVVlpWWFcwWlF0VjRyc0p4akYzclJ0GTkJmSlgxco0aEtDS0FuTlBVSXAxUVhCcGdRNGpHMVl5UGZMRFVacDVSQ1BqcU0tKYlNxZ0FqYXpjTkNqTS9LV29xSk4ydGtyeFpNdV0c2VLMERUbEYwc08xUWU5aXR0GOXl0bVFpcjlXeGZjUE100S0o1L1FcmQ4MmhOdm5LUSI7fQ

附加说明:

我不希望我的链接过期。如果我要让它们过期,那也应该是几个月的时间范围,而不是几小时。这些链接不仅仅是密码恢复链接。


1
为什么URL会这么长呢?当我编写密码重置系统时,我只需创建一个在24小时内过期的哈希值即可,不需要超过70个字符。 - Martin Bean
使用一种生成较短 URL 的算法?MD5 仍然非常适合此用途。 - JvdBerg
只要您使用加密算法来生成随机值,那么如何哈希它就无关紧要。例如,如果您正在使用openssl_random_pseudo_bytes生成字符串,甚至可以仅对其进行urlencode或base64encode。重要的是确保您无法预测该字符串,并且具有足够的熵以避免暴力攻击。 - Daniel M
我无法使用 md5,因为 URL 中有可读信息(我已混淆示例)。我正在使用 openssl_random_pseudo_bytes 来提供一些加密技术,但由于 URL 包含实际数据,仅仅依靠随机性是不够的。这与使用 URL 缩短服务相同。 - Halcyon
2个回答

31

你尝试过使用 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(Yahoo显示效果不佳)


虽然这段代码已经被编辑并包含了<p>...</p>标签,但我强烈反对在HTML邮件中使用段落标签,因为邮件客户端对它们的解释是不同的,如果间距很重要。


1
我已经确认这在至少 MS Outlook 中可以工作。我需要进行更多的测试,但它看起来很有前途。 - Halcyon
2
我检查了一些较大的在线邮件供应商,这段代码似乎可以工作。我已经更新了答案,并提供了对我来说最好的代码(在各个供应商之间具有最佳兼容性)。 - Halcyon
1
请注意:这会在普通文本的换行中断!如果包含在具有此样式的标记中,您的单词将在所有客户端上被截断。 - Will
请注意,<p>标签是可以使用的,因为您只需要设置所需的边距即可。例如,像这样进行迷你CSS重置:<p style="margin:0">或者margin: 20px 0以获得漂亮的顶部和底部间隔。但我强烈不建议使用段落标签。 - Nathan

3

在HTML邮件中使用HTML

如果您正在发送HTML邮件,以下操作可能会有问题:

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

如果在发送HTML邮件时链接被破坏了 - 问题出在发送电子邮件的方式,而不是收件人的邮件客户端。
使用更短的哈希
是否真的有必要使用超长的哈希(它是哈希还是加密?)?使用任何足够长以在到期之前无法被暴力破解的哈希应该足够。要求用户复制和粘贴一个明显会换行的字符串并没有帮助用户,它只是将开发问题推给了用户。

<textarea> 在 Outlook(以及我认为大多数其他电子邮件程序)中无法正常工作。该标签将被完全忽略。 - Halcyon
生成较短的哈希值确实是我正在考虑的事情,但即使是一个简单的base64_encoded sha512哈希值也相当长。 - Halcyon
我认为我已经解释过了,但可能不是很明显:其中一些链接是自动身份验证链接(跳过显式的用户登录)。你发的关于sha1安全的链接不适用,因为攻击者可以轻易地了解有关哈希生成方式的更多信息。这是一个实际运行的应用程序,而不仅仅是对哈希的盲目攻击。如果可能的话,我会踩评论,因为以这种方式考虑安全问题是危险的。 - Halcyon
听起来你正在通过电子邮件向用户发送加密的身份验证URL,而不是在安全的网页上显示链接,让他们可以适当地操作它(拖到书签)。如果哈希值以明文形式出现在电子邮件中,那么无论你将其设置多长,都没有意义。使用加密而不是哈希是您的URL如此之长的主要原因 - 也是主要问题。只需使用哈希/令牌表,问题的一部分就会消失 - 并允许您随时使令牌无效,以及取消与用户凭据相关联的电子邮件URL。 - AD7six
3
不要这样做(<a href="长链接">重置您的密码</a>)。这种方法会增加您的垃圾邮件评分,因为反垃圾邮件解决方案会认为您的链接试图隐藏目标。结论:为避免被标记为垃圾邮件,锚文本的href和文本应始终相同。 - TomDogg
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接