Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >闲谈IPv6-Loopback网口上的IPv6地址

闲谈IPv6-Loopback网口上的IPv6地址

作者头像
望天
发布于 2019-06-15 03:09:19
发布于 2019-06-15 03:09:19
3K10
代码可运行
举报
文章被收录于专栏:along的开发之旅along的开发之旅
运行总次数:0
代码可运行

先说Loopback网卡,它一般的用途有三个:

  • 用于网络软件发布前的测试。
  • 用于协议栈本身的测试。
  • 用于配置一些可以标识主机的IP地址以供管理和接入(比如Linux LVS)。

早年,我也写过关于Loopback的两篇文章: 用IP地址的用途理解Loopback接口: https://blog.csdn.net/dog250/article/details/12272455 从Loopback接口扯一通Linuxer和Cisco NP/IE谁能爆了谁: https://blog.csdn.net/dog250/article/details/41908945 可以随便看看。

但是到了IPv6时代,很多IPv4时代看起来理所当然的配置,玩不转了。


我们先看一个IPv4的例子。

主机A和主机B,分配配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 主机A
lo:1.1.1.1/8    # 提供接入
eth0:1.1.1.2/24	# 提供连通性保证
net.ipv4.conf.all.arp_ignore=0 # 可以让Loopback地址被解析

# 主机B
eth0:1.1.1.3/24

现在,在主机B上去连接主机A的loopback地址1.1.1.1,是通的。原因非常简单:

  1. 主机A的arp_ignore特性保证loopback的地址可供解析。
  2. 主机B的eth0和主机A的loopback地址处在同一地址段,保证arp可以直接进行。
  3. 主机A的1.1.1.1这个目标地址在主机A的Local表中。
  4. 主机A的eth0地址的链路层路由提供了反向连通性。

一切看起来理所当然。但是这合理吗?

我们知道,LVS的DR模式一直 利用了 以上的这种配置方法提供负载均衡机制。

不同的是,设主机B为LVS服务器,主机A将arp_ignore设置为1,这样一来,主机A的Loopback接口地址1.1.1.1就不能被arp解析到了,只能在LVS服务器主机B上硬封装目标MAC地址来提供链路层可达性,而目标MAC地址则可以通过和主机A的eth0通信获取。

我们一直在用的LVS-DR,原来就是以上这么一个Trick!哈哈。

在IPv4/ARP时代,能玩的Trick非常之多,能被有效利用的也不少。但是到了IPv6时代,事情起了变化。我们来具体看一下。


主机A和主机B,分配配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 主机A
lo:2222:2222::2222/64    # 提供接入
eth0:2222:2222::3333/64	# 提供连通性保证
# IPv6不再有net.ipv4.conf.all.arp_ignore配置

# 主机B
eth0:2222:2222::456/64

试着从主机B去ping一下主机A的Loopback地址,不通了吧。原因很简单:

即地址解析失败,主机A不再回复针对自己Loopback网口的IP地址解析应答。

和IPv4的ARP不同,RFC4861的7.2.3小节是有规定的: https://tools.ietf.org/html/rfc4861#section-7.2.3

这看起来非常合理,因为IPv6定义了严格的scope的概念,所谓的 邻居解析 中的 邻居 关系,仅仅限于Link scope这个范围,也就是说,两块直连的网卡上配置的IPv6地址是邻居,而不是像ARP中模糊规定的那样,一块网卡的邻居可以是直连网卡所属主机上的任何IPv4地址。

按照邻居的定义,从这个意义上讲, IPv4的地址是属于主机的,而IPv6的地址则是属于网卡的。 这个和按照OSI/RM路由模型意义上理解的有所不同,值得注意。

我们来溯源一下。ARP是在1982年被RFC826定义的陈年协议: http://www.networksorcery.com/enp/rfc/rfc826.txt 我们来看一下RFC826所述的ARP Request处理流程:

这就是说,IPv4看来,链路对端主机上所有的网卡所有的IPv4地址,都是邻居,而IPv6则不同,RFC4861的邻居发现规定,只有链路对端网卡上的IP地址,才是邻居。

即便如此,Linux系统在内核协议栈层面还是提供了下面的参数,以便你自己可以解释RFC826未解释清楚的模糊地带:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
net.ipv4.conf.XX.arp_ignore
net.ipv4.conf.XX.arp_filter

你可以通过定义上述参数,自己来决定邻居是网卡还是主机:


说了半天,上面那个例子,如何在IPv6的情况下,让主机B可以ping通主机A的2222:2222::2222地址呢?


很简单,用路由指示nexthop啊:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 主机A
lo:2222:2222::2222/64    # 提供接入
eth0:2222:2222::3333/64	# 提供连通性保证
eth0:fe80::eb7c:b2da:7088:3c38 # Link-Local地址,用于主机B的下一跳
# IPv6不再有net.ipv4.conf.all.arp_ignore配置

# 主机B
eth0:2222:2222::456/64
# 设置一条比kernel发现的链路层路由前缀更长的明细路由即可
ip -6 route add 2222:2222::2222/128 via fe80::eb7c:b2da:7088:3c38 dev eth0

IPv6不再允许乱玩IPv4/ARP未明确规定的灰色地带,通过严格限制scope,明确了IP路由的严谨性。你如果不想通过标准的IP路由连通主机A和主机B,那么就采用LVS-DR模式的自行封包机制,即 发往主机A的数据包的目标MAC地址不再通过针对Loopback地址的邻居解析而来,而是通过到达主机A的eth0的路由表项来获取。

可以说,IPv6的LVS-DR更加简单了,因为不必再担心Loopback接口的IPv6地址被解析造成地址冲突,省去了arp_ignore的配置。


下面看看IPv6的Loopback地址本身。


IPv4的Loopback地址是一个网段 127.0.0.0/8 ,这意味着这个超级大的段里的所有IP地址均属于本机Loopback!你可以试一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ping 127.9.2.3 -c 1
PING 127.9.2.3 (127.9.2.3) 56(84) bytes of data.
64 bytes from 127.9.2.3: icmp_seq=1 ttl=64 time=0.016 ms

--- 127.9.2.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.016/0.016/0.016/0.000 ms
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# ping 127.1.4.7 -c 1
PING 127.1.4.7 (127.1.4.7) 56(84) bytes of data.
64 bytes from 127.1.4.7: icmp_seq=1 ttl=64 time=0.015 ms

--- 127.1.4.7 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.015/0.015/0.015/0.000 ms

我们也可以用TCP同时打开 特性在本机上telnet任意的127.0.0.0/8段的侦听端口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# telnet 127.199.200.100 22
Trying 127.199.200.100...
Connected to 127.199.200.100.
Escape character is '^]'.
SSH-2.0-OpenSSH_7.4
Connection closed by foreign host.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      968/sshd
tcp        0      0 127.199.200.100:22      127.0.0.1:43605         ESTABLISHED 3062/sshd: [accepte
tcp        0      0 192.168.56.101:22       192.168.56.1:50846      ESTABLISHED 1152/sshd: root@pts
tcp        0      0 127.0.0.1:43605         127.199.200.100:22      ESTABLISHED 3061/telnet
tcp6       0      0 :::22                   :::*                    LISTEN      968/sshd
[root@localhost ~]#

因此,如果我们希望在本机测试一个服务器软件的并发连接,我们便可以使用127.0.0.0/8段内的任意地址做客户端或者服务器端。

不光如此,如果你觉得127.0.0.0/8这个段太特殊,那你可以可以随意配置任何IPv4段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip addr add dev lo 22.22.22.22/24
[root@localhost ~]#
[root@localhost ~]# ping 22.22.22.123 -c 1
PING 22.22.22.123 (22.22.22.123) 56(84) bytes of data.
64 bytes from 22.22.22.123: icmp_seq=1 ttl=64 time=0.016 ms

--- 22.22.22.123 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.016/0.016/0.016/0.000 ms
[root@localhost ~]#
[root@localhost ~]# ping 22.22.22.79 -c 1
PING 22.22.22.79 (22.22.22.79) 56(84) bytes of data.
64 bytes from 22.22.22.79: icmp_seq=1 ttl=64 time=0.016 ms

--- 22.22.22.79 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.016/0.016/0.016/0.000 ms

然而IPv6不能这样了。

IPv6规范 Loopback环回地址只有一个地址::1/128,而不是一个网段。

这是可以理解的。因为IPv6严格限定了scope。而Loopback的地址scope是HOST,即本主机内,言外之意,这个scope限制了 Loopback地址是出不来本机的。

我们从邻居的视角来看这个scope。这实际上指的是, 不同的scope限制了分层模型各个层次的直接可达邻居的范围和数量。

  • NOWHERE scope 一个节点都没有。
  • HOST scope 只有自己一个节点,没有邻居。
  • LINK scope 二层链路可达的互为邻居,即二层链路对端即邻居。
  • SITE scope(已废弃) 三层特定汇聚前缀的节点,即特定网段的三层可达节点之间互相为邻。
  • GLOBAL scope 所有节点,即所有三层可达的节点互相为邻。

既然HOST scope只有一个节点,无邻居,那么只有一个/128前缀的特殊地址了,IPv6规范规定为 ::1/128

然而我的理解和RFC的定义比较,可能有点不一致,Loopback真正的定义在:https://tools.ietf.org/html/rfc4291#section-2.5.3

2.5.3. The Loopback Address The unicast address 0:0:0:0:0:0:0:1 is called the loopback address. It may be used by a node to send an IPv6 packet to itself. It must not be assigned to any physical interface. It is treated as having Link-Local scope, and may be thought of as the Link-Local unicast address of a virtual interface (typically called the “loopback interface”) to an imaginary link that goes nowhere. The loopback address must not be used as the source address in IPv6 packets that are sent outside of a single node. An IPv6 packet with a destination address of loopback must never be sent outside of a single node and must never be forwarded by an IPv6 router. A packet received on an interface with a destination address of loopback must be dropped.重点!

但是我个人觉得Loopback还是理解成HOST scope比较好!

注意上面RFC定义的第二段,这才是重点。简单来讲就是要做到 ::1/128这个Loopback地址不出本机!

现在留下一个问题, scope到底对Loopback接口上配置的地址,包括::1/128和其它所有添加到Loopback的地址有什么限制呢?

如上所述, 限制就是 Loopback地址不能有邻居! 毕竟,它的邻居是没有意义的,每一个主机的Loopback接口只有一个,没有什么机制能让Loopback和其它什么接口直连!

这意味着, 所有的Loopback接口上配置的地址,其整个前缀地址空间将全部不可达!

我们在Linux系统上看清楚这一切。我先来添加一个IPv6地址给Loopback接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip -6 addr add dev lo 3333:3333::3333/64

随后我们看路由表,先看Local表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip -6 route ls tab local
local ::1 dev lo proto unspec metric 0
# 不错,这就是lo上的新地址生成的local路由,然而却没有类似IPv4的链路层路由
local 3333:3333::3333 dev lo proto unspec metric 0
local fe80::fbb2:a1e:e59:15eb dev lo proto unspec metric 0
ff00::/8 dev enp0s3 metric 256
ff00::/8 dev enp0s8 metric 256

没有看到类似IPv4添加完地址之后生成的链路层路由,我们看看main表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@localhost ~]# ip -6 route ls tab main
unreachable ::/96 dev lo metric 1024 error -101
unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -101
unreachable 2002:a00::/24 dev lo metric 1024 error -101
unreachable 2002:7f00::/24 dev lo metric 1024 error -101
unreachable 2002:a9fe::/32 dev lo metric 1024 error -101
unreachable 2002:ac10::/28 dev lo metric 1024 error -101
unreachable 2002:c0a8::/32 dev lo metric 1024 error -101
unreachable 2002:e000::/19 dev lo metric 1024 error -101
# 注意,竟然生成了一条unreachable路由!
unreachable 3333:3333::/64 dev lo proto kernel metric 256 error -101
unreachable 3ffe:ffff::/32 dev lo metric 1024 error -101
fe80::/64 dev enp0s8 proto kernel metric 100
fe80::/64 dev enp0s8 proto kernel metric 256

这意味着3333:3333::3333/64这个地址确实所有邻居均不可达, local表中仅存了一条/128前缀的明细路由。

我们这个例子中采用的是/64前缀,无论采用什么长度的前缀,均是这样的结果, 前缀定义的Link范围网段内的邻居,将全部不可达!

其它的OS协议栈我暂时没有探究,仅就Linux内核协议栈的这方面实现,贴出一段代码:

IPv6地址是严格分类分scope的,所以除非是::1/128,其它均不会携带LOOPBACK标志,因此当你在Loopback接口添加一个IP地址时,就会在Main路由表添加一条针对该前缀网段的unreachable路由,以儆效尤。


结论是什么?

结论就是,当你添加一个IPv6地址到Loopback接口的时候,该地址前缀的网段路由将会以unreachable的形式添加进Main路由表。没有可达前缀网段的路由表项了,这就意味着,你无法像IPv4那样,通过在Loopback添加一个网段,来使用这个网段的所有地址了。比如,你添加了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1234:1234::1234/64

你将无法ping通:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1234:1234::1
1234:1234::2
...
1234:1234::3456
...

这是不是意味着如果你要在本机测试一款服务器软件的并发连接数, 必须手工添加海量的/128地址,而不能通过添加一个网段达到同样的目的!

如果是,那怎么办呢?我们如何做成像IPv4那个样子呢?

也不难,将unreachable路由从Main表中删除掉然后添加到Local表中即可了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ip -6 route del unreachable 1234:1234::1234/64
ip -6 route add local 1234:1234::1234/64 dev lo

记住, 一切尽在路由 即可咯。


Redhat的网站上报告过这个问题:https://bugzilla.redhat.com/show_bug.cgi?id=969950 我倒是觉得这并不是一个Bug,这是合情合理的正常现象。

当然,我们已经知道,这是IPv6地址的模型规范决定的,IETF也已经注意到了这个问题,这个和IPv4的Loopback截然不同的问题,于是提出了一种方法: A Larger Loopback Prefix for IPv6: https://tools.ietf.org/id/draft-smith-v6ops-larger-ipv6-loopback-prefix-04.html#rfc.section.5.2.1


这便是今天要写的内容,别的不多说了。浙江温州皮鞋湿,下雨进水不会湿。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年04月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
loopback网卡地址,看似不起眼的细节,实际上里面头头多着哩,感谢作者分享
loopback网卡地址,看似不起眼的细节,实际上里面头头多着哩,感谢作者分享
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
WEB安全新玩法 [3] 防护交易数据篡改
在任何涉及交易的系统中,客户与商家之间的交易数据具有核心作用,如购买商品的价格、数量、型号和优惠券等。在客户挑选商品的过程中,这些交易数据逐渐形成;待客户提交订单时,交易数据被商家接收,形成双方认可的订单。交易数据在形成过程中必须要有可靠的临时存储,而不可靠的存储会允许攻击者提交伪造的交易数据,使商家利益受损。
天存信息
2021/06/24
1.8K0
WEB安全新玩法 [3] 防护交易数据篡改
WEB安全新玩法 [5] 防范水平越权之查看他人订单信息
水平越权是指系统中的用户在未经授权的情况下,查看到另一个同级别用户所拥有的资源。水平越权会导致信息泄露,其产生原因是软件业务设计或编码上的缺陷。iFlow 业务安全加固平台可以缓解部分场景下的水平越权问题。
天存信息
2021/06/29
1.1K0
WEB安全新玩法 [5] 防范水平越权之查看他人订单信息
WEB安全新玩法 [9] 重置密码之验证流程防绕过
一般来说,业务流程中出现多个操作环节时,是需要顺序完成的。程序设计者往往按照正常用户的操作顺序实现功能,而忽略了攻击者能够绕过中途环节,直接在后续环节上进行非法操作。iFlow 业务安全加固平台能够在不修改网站程序的情况下,强制流程的顺序执行。
天存信息
2021/07/29
1.2K0
WEB安全新玩法 [9] 重置密码之验证流程防绕过
WEB安全新玩法 [6] 防范图形验证码重复使用
在完成关键业务操作时,要求用户输入图形验证码是防范自动化攻击的一种措施。为安全起见,即使针对同一用户,在重新输入信息时也应该更新图形验证码。iFlow 业务安全加固平台可以加强这方面的处理。
天存信息
2021/06/30
1.1K0
WEB安全新玩法 [6] 防范图形验证码重复使用
WEB安全新玩法 [2] 防范前端验证绕过
用户登录,几乎是所有 Web 应用所必须的环节。Web 应用通常会加入一些验证手段,以防止攻击者使用机器人自动登录,如要求用户输入图形验证码、拖动滑动条等。但是,如果验证的逻辑仅仅在前端执行,是很容易被攻击者绕过的。iFlow 业务安全加固平台可以为只使用前端验证的应用打上动态虚拟补丁,使之成为需要前后端配合执行的验证逻辑,大幅度提高攻击者的攻击难度。
天存信息
2021/06/23
1.8K0
WEB安全新玩法 [2] 防范前端验证绕过
WEB安全新玩法 [11] 防范批量注册
网站的攻击者通过批量注册用户,能够实施大规模非法操作,如抢优惠券、恶意刷单等。这给服务商造成了直接的经济损失,而大量的垃圾用户也会占用系统资源,增加系统运行压力。防范批量注册需要针对系统特点,多管齐下综合应对,iFlow 业务安全加固平台可以提供各种防范批量注册的技术实现方式。
天存信息
2021/08/03
1.1K0
WEB安全新玩法 [11] 防范批量注册
WEB安全新玩法 [4] 防护邮箱密码重置漏洞
大部分具有账号系统的应用都会提供重置用户登录密码的功能,常见方式之一是:用户输入自己的邮箱地址或手机号,应用向这个邮箱或手机号发送验证码,用户将收到的验证码输入应用中即可完成密码重置。这一过程容易因设计不周全而被攻击者加以利用。iFlow 业务安全加固平台可以为设计不当的应用打上动态虚拟补丁,使之防御可能的恶意利用。
天存信息
2021/06/28
2.3K0
WEB安全新玩法 [4] 防护邮箱密码重置漏洞
WEB安全新玩法 [7] 加密不安全下载路径
提供下载功能的网站,其下载资源的链接是任何用户都能获取的。如若设计不当,攻击者通过分析链接的文本,能够构造出意外但有效的链接,访问网站功能之外的资源,从而窃取主机上的敏感信息。
天存信息
2021/07/01
5750
WEB安全新玩法 [7] 加密不安全下载路径
WEB安全新玩法 [10] 防范竞争条件支付漏洞
服务器端业务逻辑,特别是涉及数据库读写时,存在着关键步骤的时序问题,如果设计或代码编写不当就可能存在竞争条件漏洞。攻击者可以利用多线程并发技术,在数据库的余额字段更新之前,同时发起多次兑换积分或购买商品请求,从中获取利益。本文将讨论如何简单地使用 iFlow 应用安全加固平台的可编程特性,对竞争条件产生的支付漏洞进行防护。
天存信息
2021/07/30
1K0
WEB安全新玩法 [10] 防范竞争条件支付漏洞
WEB安全新玩法 [1] 业务安全动态加固平台
近年来,信息安全体系建设趋于完善,以注入攻击、跨站攻击等为代表的传统 Web 应用层攻击很大程度上得到了缓解。但是,Web 应用的业务功能日益丰富、在线交易活动愈加频繁,新的安全问题也随之呈现:基于 Web 应用所承载的交易特性,某些利用其业务逻辑设计缺陷来构造的针对具体业务的攻击逐渐成为主流,我们称之为业务层攻击。
天存信息
2021/06/22
5000
WEB安全新玩法 [1] 业务安全动态加固平台
京东电商下单黄金链路:防止订单重复提交与支付的深度解析
在电商领域,尤其是在像京东这样的大型电商平台中,防止订单重复提交与支付是一项至关重要的任务。这不仅关乎用户体验,还直接影响到平台的运营效率和信誉。本文将深入探讨京东电商下单黄金链路中如何防止订单重复提交与支付的解决方案,从背景、业务场景、功能、底层实现原理以及具体措施等方面进行详细讲解,并结合Java代码进行分析。
小马哥学JAVA
2024/10/27
3190
防止重复提交3种方法
2 还是javascript,将提交按钮或者image置为disable 3 利用struts的同步令牌机制 利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。 基本原理:
PHP开发工程师
2021/05/05
1.4K0
白帽子讲web安全 pdf_白帽子讲web安全适合初学者看吗
一个网站的数据库,在没有任何保护的情况下,数据库服务端口是允许任何人随意连接的;在有了防火墙的保护后,通过ACL可以控制只允许信任来源的访问。这些措施在很大程度上保证了系统软件处于信任边界之内,从而杜绝了绝大部分的攻击来源。
全栈程序员站长
2022/09/29
6110
白帽子讲web安全 pdf_白帽子讲web安全适合初学者看吗
防止Web表单重复提交的方法总结
在Web开发中,对于处理表单重复提交是经常要面对的事情。那么,存在哪些场景会导致表单重复提交呢?表单重复提交会带来什么问题?有哪些方法可以避免表单重复提交?
编程随笔
2019/09/11
4.9K0
防止Web表单重复提交的方法总结
web安全性浅析
能注入恶意的HTML/JavaScript代码到用户浏览的网页上,从而达到Cookie资料窃取、会话劫持、钓鱼欺骗等攻击。
ConardLi
2019/09/08
8420
如何防止表单重复提交
在看Java Web 深入分析时, 看到表单重复提交问题一节, 如下描述如何解决问题:
望天
2018/08/02
3.3K0
如何防止表单重复提交
JavaWeb防止表单重复提交的几种方式
(4)、ajax提交加锁 采用ajax方式提交表单时,设置一个布尔变量(true/false),当然其他类型变量也可以。初始时为true可以提交,在前端向服务器发出请求后,服务端响应结果没有回来之前将该值置为false,正常响应时再置为true。
全栈程序员站长
2022/08/04
2.4K0
【黄啊码】PHP如何防止重复提交
防抖(Debounce)是一种防止重复提交的策略,它通过延迟一定时间来合并连续的操作,以确保只执行一次。
黄啊码
2023/12/18
3330
CSRF/XSRF概述
CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,一般是攻击者冒充用户进行站内操作,它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则是伪装成受信任用户的请求来访问操作受信任的网站。
全栈程序员站长
2022/08/31
1.7K0
防止订单重复提交或支付分布式锁方案设计
在现代电子商务应用程序中,订单的提交和支付是核心业务流程之一。然而,由于各种原因,用户可能会多次提交订单或重复支付,这可能导致严重的问题,如库存错误、多次扣款等。为了解决这个问题,我们可以使用分布式锁来确保订单的唯一性,本文将介绍如何设计和实现一个防止订单重复提交或支付的分布式锁方案。
疯狂的KK
2023/09/05
1.9K0
防止订单重复提交或支付分布式锁方案设计
推荐阅读
相关推荐
WEB安全新玩法 [3] 防护交易数据篡改
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验