您编写的代码完全正确。在许多邮件客户端(如 GMail、ThunderBird 等)中,默认情况下不显示图像。您需要单击“显示图像”链接。这个过程不能自动化。这是防止CSRF的安全措施。
部分参考如下:
生活黑客:
默认情况下,Gmail 会尝试通过阻止电子邮件中的图像来保护您的电子邮件免受垃圾邮件发送者的侵害,直到您告诉它显示它们。这很好,但是当您想查看联系人中的图像时有点烦人。
Gmail 现在不会在我的电子邮件中显示图片。- 谷歌组
更改为默认使用 HTTPS 后,您与 Gmail 的连接将通过 HTTPS 进行加密。但是,您可能收到的某些消息(例如广告和简报)可能包含不是通过 HTTPS 发送的图像,而是通过 HTTP 发送的。
诸如 Internet Explorer 之类的浏览器会通过弹出窗口警告您,表明您在通过 HTTPS 连接到 Gmail 时可能正在尝试访问通过 HTTP 发送的内容。这就是为什么为 Internet Explorer 启用混合内容的显示对你们中的一些人有所帮助。但是,在启用 HTTP 内容显示时请务必小心,因为某些网站可能包含浏览器设置试图保护您免受风险或恶意内容的影响。
为什么电子邮件不直接加载图像
Gmail、yahoo、hotmail 等电子邮件提供商不会直接在电子邮件中加载图像。这些服务要求您允许加载图像。他们为什么这样做呢?是为了防止 XSS/CSRF 吗?
两个原因 - 隐私和 CSRF。
隐私
它允许发件人在我不知情的情况下确定我是否打开了电子邮件。垃圾邮件发送者可以弄清楚他们的“营销”活动是否产生了任何影响。
CSRF
要使 CSRF 工作,受害者必须单击链接或访问攻击者页面。如果电子邮件客户端要自动显示图像,只需打开一封电子邮件就足以发起 CSRF 攻击。
例如,假设 paypal 有一个 csrf 漏洞。还假设用户已登录到贝宝。现在,攻击者向用户发送一封带有<img
src="http://paypal.com/transferfunds?fromAccount=victim&toAccount=attacker"/>
. 一旦用户打开电子邮件,资金就会被转移。