XSRF:它是什么,如何工作,如何阻止它?

本文深入探讨了跨站点请求伪造(XSRF)攻击的原理,展示了一个银行转账场景下的实例,揭示了即便在未主动操作的情况下,账户资金仍可能被盗的风险。文章提供了个人用户及网站开发者防范XSRF的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近出现了一种不太明显的骇客,它是现在臭名昭著的分支

XSS

它被称为跨站点请求伪造,简称XSRF。 XSRF是一种临时身份盗用形式,可能导致您的计算机启动银行交易,发送电子邮件或短信,甚至更改您喜欢的站点上的帐户信息...而您从未意识到!

好消息

在我们开始陷入困境和阴霾之前,您应该知道XSRF尽管可能非常具有破坏性,但实际上很容易防御。

另外,许多现代站点都采用了反XSS和XSRF技术(例如本文底部列出的技术),因此,即使有人试图将XSRF提取到您的帐户中,也无法正常工作。

设置

作为运行中的XSRF的示例,假设您最喜欢的银行有一个使用$ _GET传递帐户交易数据的网站。 因此,如果您想将$ 100从帐户1002转到帐户1004,请转到:

http://myawesomebank.com/transfer.php?from=1002&to=1004&amt=100
此时,您可能在想:“这确实有问题!” 而且你是对的。 但是没问题...即使有人试图进入该网址快速赚到100美元,他仍然必须登录才能这样做,对吗?

错误。

因此,我们的勇敢的黑客前往了您最喜欢的论坛站点,并在其中创建了带有图片标签的帖子。 但是,他没有给它一个有效的图像文件,而是给它一个讨厌的uri:


<img src="http://myawesomebank.com/transfer.php?from=1002&to=1004&amt=100" /> 
幸福受害者

现在是有趣的部分。 假设您最近访问了myawesomebank.com,以查看您的帐户余额。 我们还可以说,与大多数普通人一样,您在关闭浏览器窗口之前并未注销帐户。 sk

您会注意到您最喜欢的论坛站点上有一条新帖子,因此您可以看看它。 奇怪的是,上面有一个图像,但不会显示。

您刷新页面几次,但是看不到图片。 你放弃,去睡觉。

第二天,当您检查您的帐户余额时,您有$ 500的空头!

发生了什么?

当您打开包含XSRF代码的页面时,您的浏览器将看到一个IMG标签,并发送了对该图像的src的请求,作为加载页面的一部分。

没关系,src没有以有效的图像扩展名结尾; 这实际上是相当普遍的,因为许多站点将使用PHP(或其他服务器端)脚本从数据库或服务器文档根目录之外获取图像。

因此,您的浏览器发送了请求,并得到了响应,即myawesomebank.com的“交易完成”页面。 当然,这不是有效的图像数据,因此您的浏览器没有显示任何内容。

“但是,”您可能会坚持,“加载XSRF代码时,我不在银行的网站上!” 也许您不是,但是根据您的银行,由于您的会话cookie被链接到一个未过期的会话,因此您实际上仍在登录! 这意味着,即使您未在地址栏中键入位置,也已处理了发送到银行服务器的所有请求!

如何保护自己
  • 在关闭浏览器窗口或转到其他站点之前,请始终注销您登录的任何站点。
  • 如果未加载图像(尤其是在论坛或邮件列表等“可公开写入”的网站上,请不要刷新页面!右键单击图像并选择“属性”(在IE或FireFox上),或“复制图片地址”(在Safari上)并验证文件是否为图片
  • 如果您认为自己是XSRF的受害者,请立即采取行动! 与目标站点的管理员联系,并获得损坏!
  • 如果您认为有人在论坛或其他站点上发布了XSRF代码,请立即通知站点管理员,以便他可以删除该代码并禁止违规者!
如何保护您的网站免受XSRF侵害
  • 切勿在地址中传递敏感数据。 尽可能多地使用POST。
  • 在执行任何后端代码之前,请检查引荐页(通过$ _SESSION ['HTTP_REFERER'])! 如果域名与您的域名不匹配,请不要处理该请求
  • 强制会话超时。 当用户一段时间未提交任何请求时,其会话将自动过期。
附录A:强制会话超时

您曾经注意到在某些站点上的情况,如果您离开计算机一段时间后再回来,当您单击链接时,该站点将要求您再次登录,因为“您的会话由于不活动而超时”。

他们是如何做到的?

好吧,您不能真正使用“计时器”,因为网络无法正常工作。 您不知道用户何时单击链接...,即使他仍在您的网站上! 相反,您必须执行某种“反向计时器”。

您可以将超时变量与当前时间进行比较,然后存储新的超时值,而不是从静态的“直到到期的时间”开始递减计数。

用代码表示:

用户登录后,设置其初始超时值。 传统上,用户在会话无效之前会处于闲置状态15分钟。 当然,根据您网站的性质,您可以选择使用其他值。


// When you log the User in, set his timeout:
define('SESSION_TIMEOUT', 15);
$_SESSION['timeout'] = (time() + (SESSION_TIMEOUT * 60)); 
然后,将此代码放在要求用户登录的每个页面的顶部:

session_start(); 
// Check to make sure the User is logged in.
if(! checkToSeeIfUserIsLoggedIn(yourCodeGoesHere))
{
    .
    .
    .
} 
// Check to see if the current time is AFTER the session is marked for timeout.
if(time() > $_SESSION['timeout'])
{
    // User's session has expired.  Go back to the login screen.
    header('Location: login.php?message=timeout');
    exit;
} 
即使用户正在使用您网站上的不安全页面,您也可能希望延长其超时时间:

if(isset($_SESSION['timeout']))
    $_SESSION['timeout'] = (time() + (SESSION_TIMEOUT * 60)); 

From: https://bytes.com/topic/php/insights/680454-xsrf-what-how-does-work-how-can-you-thwart

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值