防止电子邮件扫描器激活“退订”链接的策略

16
我希望在我所发送的邮件底部提供一个单击“取消订阅”链接。 显然,许多垃圾邮件扫描器会扫描电子邮件,并遵循电子邮件中发现的任何链接以扫描它们的内容以查找恶意软件。到目前为止,我使用的解决方法是: 如果通过HTTP GET请求“取消订阅”页面,则呈现一个简单的确认表单和一些JS,在页面加载时提交表单;如果通过HTTP POST请求“取消订阅”页面,则我们退订用户。 这种方法,用户通常只需要单击表单一次即可获得“您已被退订”的消息。如果他们已禁用JS,则仍可以手动提交确认表单。 现在的问题是,某些扫描程序(如Office365的ATP)将打开页面并在其中执行JS。通过执行JS,他们提交表单并导致用户自动退订。 我考虑添加自动提交JS逻辑检查: 不要针对特定的用户代理进行自动提交 不要针对特定的客户端IP范围进行自动提交 触发鼠标移动事件上的自动提交 但这些看起来都像脆弱的方法,最多只是一些hack方式,随着电子邮件扫描器改变其策略而注定会失败。

我相信在我之前,这个问题已经困扰了很多人。除了放弃单击功能外,是否有已知的合理解决方法?

附注:我已经添加了对RFC 8058的支持,但用户仍然会点击页脚中的链接。


1
一个有趣的问题,我想到的是这个新的谷歌无形的reCAPTCHA v3,在正常情况下,如果它看起来没问题,它不需要用户执行任何操作。 - Vladan
@Vladan可以在“正常情况”下工作。 如果reCAPTCHA检查失败(例如,因为页面在电子邮件客户端中打开,没有Google cookie),则这对最终用户非常恼人。 此外,数据会传输到Google,因此您需要对此感到舒适,并在隐私政策中提及。 - Pēteris Caune
1
我们有相同的功能。但是我们使用Emarsys创建发送给用户的电子邮件,在页脚中有一个简单的链接(编码),它起到了作用。现在你让我开始怀疑,我的用户是否被电子邮件扫描程序取消订阅了呢? - Amiga500
@Amiga500:我开始使用一个包含纯文本地址的一键链接。在发给482人的邮件中,该链接仅被点击了6次,并且所有点击都发生在运行开始后的103秒内。在回复给我的6个电子邮件地址中,一个是纯文本,一个是空的,4个是乱码的。结论是:所有的退订都是自动生成的(我认为主要是由微软软件生成的)。现在我要求用户手动在表单中输入他们的地址。 - EML
2个回答

13
这是M³AAWG(消息、恶意软件和移动反滥用工作组)正在进行的辩论话题。这是一团糟,没有简单的解决方案。听起来你做得很好,但有些反垃圾邮件系统过于激进。
最大的问题是,任何你能做的事情都可以被滥用市场营销人员或垃圾邮件发送者所做。
我听到的最好的建议是在操作上加一个计时器。对于在投递后5分钟内取消订阅的用户添加验证码,并在之后删除验证码。(不要为RFC 8058 List-Unsubscribe-Post链接实现此功能。)
我的下一个最喜欢的建议是在消息中添加一个金丝雀链接。这对人类读者来说应该是看不见的。如果跟随它,它将撤消该IP的最近点击活动并禁止该IP在一段时间内触发行动。
我也喜欢你的想法,只要确保在确认按钮点击后,即使禁用了Javascript,用户仍然可以取消订阅。

 

我内心的一部分(警告,我是一个反垃圾邮件研究员)希望出现这些误报。希望这能教育我的同行们,让他们知道自己做得很差,而这些升级将不断向他们推进。从你的角度来看,你可以把责任推给别人(尽管在此过程中你会失去一些订阅者)。

垃圾邮件检测系统必须小心避免订阅管理链接(至少在坏人开始将其伪装成取消订阅链接之前)。


1
谢谢!这两个想法都很好,我之前没有考虑过。我会尝试使用定时器方法。在我的情况下,“CAPTCHA”只是屏幕中央的一个简单按钮,只需点击即可。对于快速打开的退订链接,我不会包含JS自动点击该按钮。这应该至少可以绕过Office365 ATP,其扫描在发送电子邮件后一分钟内链接。金丝雀链接会更难实现(撤销操作、跟踪禁止使用的IP)。此外,垃圾邮件扫描程序可能会将带有隐藏链接的电子邮件标记为垃圾邮件/恶意软件,存在风险。 - Pēteris Caune
一个计时器可以解决我的测试案例(请参见对原帖的评论);所有取消订阅都在2分钟内到达。但是(重新)CAPTCHA是一个很大的麻烦,特别是对于不了解美国习语并且不喜欢盯着微小的无描述图像看的用户来说(什么是“人行道”?出租车是什么颜色?等等)。而且它也不再是一键点击了。我现在只要求用户在表单上输入他们的地址即可。 - EML

0
我也遇到了这个问题。我打算尝试一种方法,就是在电子邮件中添加一个复选框,只有在选中该复选框时才执行链接操作。另一种选择是使用 useragent(https://www.npmjs.com/package/express-useragent),根据它提供的信息来构建阻止某些请求的逻辑。

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