精华内容
下载资源
问答
  • 重放攻击
    2022-07-17 03:19:17

    shift + r    设置重放的次数 

    更多相关内容
  • 重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。 首先要明确一个事情,重放攻击是二次请求,黑客通过抓包获取...
  • 主要给大家介绍了关于Spring Boot接口设计防篡改、防重放攻击的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 这种分类方法不仅包含了Syverson的分类,还将重放攻击扩展到了协议层次。给出了各层次可行的重放攻击实施的方式。根据此分类可以从块、块间、步间和协议间4个层次,快速地检查并发现安全协议中是否存在重放攻击
  • 如果服务端不进行防重放攻击,就会参数服务器压力增大,数据紊乱的后果。而使用添加时间戳的方式可以解决这一问题。 private readonly string TimeStamp = ConfigurationManager.AppSettings[TimeStamp];//配置...
  • 重放攻击

    千次阅读 2021-03-17 14:25:32
    机A要给主机B发送报文,中间重放攻击的主人可以是A,或者是攻击者C :当是A时,表示A会重复发送相同的报文给B, :当是C时,表示C截获了A发送给B的报文,然后再伪装成A给B发送其截获的报文 重放攻击的含义:主机A...

    机A要给主机B发送报文,中间重放攻击的主人可以是A,或者是攻击者C

    :当是A时,表示A会重复发送相同的报文给B,

    :当是C时,表示C截获了A发送给B的报文,然后再伪装成A给B发送其截获的报文

    重放攻击的含义:主机A给主机B发送的报文被攻击者C截获了,然后C伪装成A给B发送其截获来的报文,而B会误以为C就是A,就把回应报文发送给了C。

    虽然A是加密的,但C根本不用破译。

    实例分析:登录验证

    登录验证的基本流程:(4步)

    1,前端:

         用户输入账号,密码,然后登录

    2,用户在发送登录请求之前,web端会首先对明文密码进行md5加密(而加密后的密码会储存于后端的数据库中)

    3,提交账号及md5加密后的密码

    4,请求到达后端,将 从数据库中提取的账号与密码和现在提交的账号与密码进行比较,如果相同,则登录成功。

    那么在这中间会出现什么问题呢?

    思考:这个过程安全吗?

    我们知道,在此过程中传输的是经过md5加密后的密码,即使被监听者截取到,而md5是不可逆的,明文密码也不会泄露的 。

    其实不然,监听者无需解出密码明文,即可登录——因为监听者只需将监听到的URL(uniform )重放一下,即可冒充你的身份登录系统。

    下面我们讲解一下稍微安全一点的登录:

    关键是:进行了两次加密,且攻击者的session中的随机码与数据库中的随机码相同的概率可以忽略。

    1,进入前端用户登陆界面时生成一个随机码(盐值)(此随机码会在客户端和后端session中各保存一个)

    2,用户在发送登录请求之前,web端首先会对明文密码进行md5加密,存于数据库中,然后加密后的密码再与盐值连接,再进行md5加密

    最后密码=md5{[md5(明文密码)]+随机码}

    3,请求到达后端后,将 从数据库中提取的md5加密后的密码+后端session中的盐值进行md5加密,与发送来的密文进行对比,若相同,则成功。

     更安全的登陆流程:

    1,系统随机生成一个固定盐值,uerooejioeueo%@*?.,*6hgk,>ikuolm 足够复杂

    2,当用户注册,修改密码时,明文密码会先于固定盐值连接,进行md5加密,然后再与随机码连接再次进行md5加密

    最后密码=md5{【md5(明文密码+固定盐值)】+随机码}

    最后更加完善的方式:

    1,设置登陆验证码、

    2,错误达到一定次数,锁定账号几分钟

    3,存数据库前再加一次盐,然后再md5一次,防止拖库被猜密码

    ,防御方案:

    1,加随机数:双方只需要记住各自使用过的随机数,不能有重复数,如果报文中有以前使用过的随机数,则被认为是重放攻击

                          优点:双方不需要保持时间的同步,

                          缺点:需要额外保存使用过的随机数,则需要保存和查询开销

    2,加时间戳:时戳——代表当前时刻的数

                           而重放的时戳将相对远离当前时刻

                          优点:不需要内存开销

                          缺点:通信各方的计算机时钟必须保持同步(同步越好,受攻击的可能性越小)

    3,加流水号:双方在报文中添加一个逐步递增的整数,则只要收到一个不连续的流水号报文(太大或者太小)就认为有重放威胁

                           优点:不需要时间同步,保存的信息量小

                           缺点:攻击者如果对报文解密成功,就获得了流水号进而会伪造数据

    展开全文
  • 重放攻击是什么.mp4

    2020-09-17 11:01:18
    重放攻击是什么:如果比特币真的发生分叉,作为普通用户最大的风险就是重放攻击。如果比特币分裂为一种或者多种比特币,每个比特币账户内将根据他的比特币余额同时存在对应的所有分叉币。由于每条链上的地址和私钥、...
  • 为此,提出一种抗重放攻击的Web 服务认证协议。基于时间戳/消息ID 缓存的抗重放攻击方法,利用简单对象访问协议的请求/响应消息和WS-Security 规范设计双向认证协议,使用Axis2 的Module 机制加以实现。实验结果表明...
  • 在详细研究攻击实例的基础上,从攻击成功的根本原因出发,提出了一种新的重放攻击分类方法。该分类方法能够更清楚地认识到重放攻击的原理和本质,并针对不同的重放种类给出了避免攻击的原则性方法,对协议的设计和...
  • 一种FPGA上防重放攻击的远程比特流更新协议的分析改进.pdf
  • 基于方向的重放攻击防御机制.docx
  • 最好为快速会话维护一个 htttpOnly cookie(以验证用户并通过 XSS 抢夺 cookie 来防止重放攻击),同时在客户端可访问和修改的 cookie 中存储一些会话状态。 客户端会话在req.clientSession ,类似于 connect/...
  • 防止重放攻击 This article was originally published at Ben’s Tech Talks site. 本文最初在Ben的Tech Talks网站上发布。 Replay attacks, in which attackers intercept and resend network packets that do ...

    防止重放攻击

    Preventing replay attacks

    This article was originally published at Ben’s Tech Talks site.

    本文最初在Ben的Tech Talks网站上发布。

    Replay attacks, in which attackers intercept and resend network packets that do not belong to them, are extremely dangerous and can in some cases cause serious damage. What makes these kinds of attacks even more noisome is that they can even be staged on encrypted communication channels without gaining access to the decryption keys. Attackers only have to eavesdrop on your line and have a general knowledge of what task a specific set of packets are performing, and by resending those packets or requests, they will be able to disrupt your communications or cause more damaging effects.

    重播攻击 (攻击者拦截并重新发送不属于它们的网络数据包)极为危险,在某些情况下可能会造成严重破坏。 使这类攻击更加令人讨厌的是,它们甚至可以在加密的通信通道上进行,而无需访问解密密钥。 攻击者只需窃听您的电话,并且对特定的一组数据包正在执行的任务有一个一般的了解,并且通过重新发送这些数据包或请求,他们将能够破坏您的通信或造成更大的破坏性影响。

    In this article, I’ll show you a basic, easy-to-implement method that will prevent replay attacks on your website. It will also have the side benefit of preventing the annoying effects of confused users repeating their last POST request by constantly refreshing their browser at the wrong time.

    在本文中,我将向您展示一种基本的,易于实现的方法,该方法可以防止对您的网站进行重放攻击。 通过在错误的时间不断刷新浏览器,还可以防止混乱的用户重复他们的上一个POST请求的烦人的副作用。

    This is far from a complete solution. It has flaws and pending issues, but it gives you a general view of how tokens and simple protocols can enhance security in your websites. Sample codes and implementation are done in ASP.NET and C#, but the concept can be deployed on any other platform or programming language.

    这远非一个完整的解决方案。 它具有缺陷和悬而未决的问题,但是它使您可以大致了解令牌和简单协议如何增强网站的安全性。 示例代码和实现在ASP.NET和C#中完成,但是该概念可以部署在任何其他平台或编程语言上。

    一次性代币概念 (The One-time Token Concept)

    The idea behind the solution that will be offered in this post is to tie every HTTP response to a token string which will be valid only for the next post request. Here’s a simple breakdown of the steps involved:

    本文将提供的解决方案背后的想法是将每个HTTP响应与一个令牌字符串相关联,该令牌字符串仅对下一个发布请求有效。 这是所涉及步骤的简单分解:

    1. The client makes a GET request by typing the URL or a page or by clicking on a link.

      客户端通过键入URL或页面或单击链接来发出GET请求。
    2. The server generates a random token. Subsequently, it stores a copy of the token in the session and embeds a copy of the token in the <form> tag of the response it sends to the client.

      服务器生成一个随机令牌。 随后,它将令牌的副本存储在会话中,并将令牌的副本嵌入到发送给客户端的响应的<form>标记中。
    3. The client processes the content, and sends a POST request to the server, say when the user clicks on a button, which contains the randomly-generated token.

      客户端处理内容,然后向服务器发送POST请求,例如,当用户单击包含随机生成的令牌的按钮时。
    4. The server receives the request and proceeds with processing it only if the attached token is equal to the one stored in the user’s session.

      服务器仅在附加令牌等于用户会话中存储的令牌时,才接收请求并继续进行处理。
    5. The server invalidates the token and returns to step 2, where it formulates the response with a new random token.

      服务器使令牌无效,并返回到步骤2,在此它用新的随机令牌来表示响应。

    In this manner, even if a critical request sent to the server is intercepted by a malicious user, it cannot be repeated because the token it contains is no longer valid after the request is sent to the server. The same goes for the scenario where a careless user mistakenly presses F5 on the keyboard and resends the request after posting information to the server.

    这样,即使发送给服务器的关键请求被恶意用户拦截,也无法重复执行,因为它所包含的令牌在请求发送到服务器后不再有效。 对于粗心的用户错误地按下键盘上的F5并在将信息发布到服务器后重新发送请求的情况也是如此。

    试验台 (The Test-bed)

    In order to implement the one-time token concept, we’re going to create a sample page that contains a simple textbox and a submit button. We’ll also throw in a label control to display the test output.

    为了实现一次性令牌的概念,我们将创建一个示例页面,其中包含一个简单的文本框和一个提交按钮。 我们还将抛出一个标签控件以显示测试输出。

    simple textbox and button code

    The code behind will be a simple snippet that displays the time of the submission plus the data contained in textbox.

    后面的代码将是一个简单的代码段,显示提交时间以及文本框中包含的数据。

    time of the submission plus the data contained in textbox

    This is the output of the page after the initial GET request

    这是初始GET请求后页面的输出

    output after the initial GET request

    After submitting the page, the output will look like this:

    提交页面后,输出将如下所示:

    output after submission

    The problem is, if you refresh your page it will re-POST your data and repeat the last request, and the server will process it without a hitch. Now imagine if you had just made a critical $1,000,000 transaction and inadvertently pressed F5 on your keyboard. Or worse, some malicious user intercepts your request, figures out it’s a payment transaction, and repeats it in order to siphon your funds and spite you.

    问题是,如果刷新页面,它将重新发布您的数据并重复上一个请求,服务器将顺利处理它。 现在想象一下,如果您刚刚进行了一次重要的$ 1,000,000交易并且无意中按下了键盘上的F5键。 或更糟糕的是,某些恶意用户拦截了您的请求,发现这是一笔付款交易,然后重复执行以窃取您的资金并吞噬您。

    Preventing replay attacks

    解决方案 (The Solution)

    In order to prevent a POST request from being repeated, we update the markup to add a hidden field, which will store the token.

    为了防止重复发送POST请求,我们更新了标记以添加一个隐藏字段,该字段将存储令牌。

    adding a hidden field

    Next, we will create a function that generates a random token and embeds it both in the hidden field and the session collection.

    接下来,我们将创建一个函数,该函数生成一个随机令牌并将其嵌入到隐藏字段和会话集合中。

    random token

    Afterwards, we change the Page_Load() function to only display the posted data if the posted token is equal to the one stored in the session.

    然后,我们将Page_Load()函数更改为仅在发布的令牌等于会话中存储的令牌时显示发布的数据。

    change the Page_Load() function

    Finally, we override the OnPreRender() function to generate a new token before the final output is sent to the client. This is what makes it a one-time token, because it’s renewed every time a new request is sent.

    最后,在将最终输出发送到客户端之前,我们重写OnPreRender()函数以生成新令牌。 这就是使其成为一次性令牌的原因,因为每次发送新请求时都会对其进行更新。

    override the OnPreRender() function

    Now when you submit the form by clicking on the button, it works just as it did before. But if you try to simulate the replay attack by refreshing the page, you’ll get the following error because the token that is sent with the form is no longer equal to the one stored on the server:

    现在,当您通过单击按钮提交表单时,它的工作方式与以前一样。 但是,如果尝试通过刷新页面来模拟重播攻击,则会收到以下错误,因为与表单一起发送的令牌不再等于服务器上存储的令牌:

    error due to incorrect token

    This way, we can distinguish valid button-click submissions from falsely-repeated requests.

    这样,我们就可以将有效的按钮单击提交与错误重复的请求区分开。

    完善代码 (Refining the Code)

    Although this code fixes the replay attack problem for your page, it has several issues that need to be addressed:

    尽管此代码解决了页面的重播攻击问题,但仍有一些问题需要解决:

    • It has to be repeated across all pages

      必须在所有页面上重复
    • It will not work if you have several tabs open on the same website, because the token is being shared across requests

      如果您在同一网站上打开了多个标签,则该标签将无法正常工作,因为令牌是在请求之间共享的
    • It’s downright ugly

      真丑

    As a fanatic Object Oriented Programming (OOP) enthusiast, I’m always looking for opportunities to refactor and refine code by leveraging the power of this most awesome programming paradigm.

    作为狂热的面向对象编程(OOP)爱好者,我一直在寻找利用这种最出色的编程范例的力量来重构和完善代码的机会。

    In order to address the above-mentioned issues, the first thing we do is to define a class that will encapsulate the token generation functionality. We’ll call the class TokenizedPage and will derive it from System.Web.UI.Page in order to be able to use it for pages in the future.

    为了解决上述问题,我们要做的第一件事是定义一个将封装令牌生成功能的类。 我们将调用TokenizedPage类,并将其从System.Web.UI.Page派生,以便将来能够在页面上使用它。

    calling the class TokenizedPage

    Next, in order to make the code more readable and manageable, we encapsulate the page token and the session token into two different properties that we add to the TokenizedPage class. In order to make the code easily portable in web pages, we will use the ViewState collection instead of the hidden input field to store the page token. We also use the Page.Title property as the key for storing the token in the session. This will improve our code and will partially address the second issue, which would limit the use of our site to a single tab in the browser. By applying this change, we’ll be able to have separate pages of the site open in different tabs, but we won’t be able to have several instances of the same page open in separate tabs, because they’ll still be sharing tokens. This issue will be addressed later.

    接下来,为了使代码更具可读性和可管理性,我们将页面令牌和会话令牌封装到两个不同的属性中,并添加到TokenizedPage类中。 为了使代码易于在网页中移植,我们将使用ViewState集合而不是隐藏的输入字段来存储页面令牌。 我们还使用Page.Title属性作为在会话中存储令牌的键。 这将改善我们的代码,并部分解决第二个问题,这将使我们网站的使用仅限于浏览器中的单个选项卡。 通过应用此更改,我们将能够在不同的选项卡中打开网站的单独页面,但是我们将无法在单独的选项卡中打开同一页面的多个实例,因为它们仍将共享令牌。 稍后将解决此问题。

    encapsulating  page and session tokens

    Next, we add a read-only Boolean property named IsTokenValid, which follows the example of other Page properties such as IsPostBack and IsValid. The purpose of this property is to make sure the page token is equal to the session token.

    接下来,我们添加一个名为IsTokenValid的只读布尔属性,该属性遵循其他Page属性(例如IsPostBack和IsValid)的示例。 此属性的目的是确保页面令牌等于会话令牌。

    adding IsTokenValid

    Finally, we add the GenerateRandomToken() function and the override of the OnPreRender() event as was done in the test-bed.

    最后,我们添加了GenerateRandomToken()函数和OnPreRender()事件的覆盖,如在测试台上所做的那样。

    GenerateRandomToken and OnPreRender

    Now, in order to use the one-token pattern, all we need to do is to create a new page, derive it from TokenizedPage and use the IsTokenValid whenever the one-time token is needed.

    现在,为了使用单令牌模式,我们需要做的就是创建一个新页面,从TokenizedPage派生它,并在需要一次性令牌时使用IsTokenValid。

    IsTokenValid

    Much better.

    好多了。

    使它变得更好 (Making it Even Better)

    One of the problems with this code is that if you have two tabs in your browser pointing to the same page, posting one will invalidate the token of the other, since they’re using the same session token key. This can be addressed by adding a token ID which will make sure each request-response sequence happening in one tab will use its own set of unique tokens and will not interfere with other requests on the same page. The first order of business is to go back to the TokenizedPage class and add a TokenID property. This property generates a random ID the first time it is called in the initial GET request and stores it in the ViewState collection for future reuse.

    此代码的问题之一是,如果浏览器中有两个选项卡指向同一个页面,则发布一个选项卡会使另一个选项卡的令牌无效,因为它们使用的是相同的会话令牌密钥。 这可以通过添加令牌ID来解决,该令牌ID将确保在一个选项卡中发生的每个请求-响应序列都将使用其自己的唯一令牌集,并且不会干扰同一页面上的其他请求。 首先要做的事情是返回TokenizedPage类并添加TokenID属性。 此属性在初始GET请求中首次调用时会生成一个随机ID,并将其存储在ViewState集合中以备将来使用。

    adding a TokenID property

    Next, we will alter the SessionHiddenToken property to use the TokenId property instead of using the Page.Title property.

    接下来,我们将SessionHiddenToken属性更改为使用TokenId属性,而不是使用Page.Title属性。

    using the TokenId property

    The cool thing is that since we had used abstraction and encapsulation principles (another big shout out to the benefits of OOP), we don’t need to make any other change and the new mechanism will work with all pages that we’ve derived from TokenizedPage.

    很棒的事情是,由于我们使用了抽象和封装原理(另一种大呼OOP的好处),因此我们无需进行任何其他更改,并且新机制将适用于我们从中衍生的所有页面TokenizedPage。

    剩余的问题 (Remaining Issues)

    This is about it for the one-time token pattern. There are two issues that remain:

    这与一次性令牌模式有关。 仍然存在两个问题:

    • An unlimited number of token IDs will be generated for each session (the number of GET requests that is sent to each session) to be more precise. This can be addressed by implementing a stack or cache mechanism that pops older IDs when a number limit is exceeded or when they become unused for a specific duration. I’ll leave the implementation to you.

      更精确地说,将为每个会话生成无限数量的令牌ID(发送到每个会话的GET请求数量)。 可以通过实现堆栈或缓存机制来解决此问题,该机制将在超出数量限制或在特定持续时间内不使用它们时弹出较旧的ID。 我将把实施留给您。
    • The default random number generator is not what you would call the most secure and reliable source of randomness and a savvy hacker might be able to predict the sequence of tokens. However, if you’re using SSL encryption, they won’t be able to get a hold of the token anyway.

      默认的随机数生成器不是您所说的最安全,最可靠的随机性源,精明的黑客可能能够预测令牌的序列。 但是,如果您使用的是SSL加密,则无论如何他们将无法获得令牌。

    Do you have any enhancements to add or would like to share its implementation in another platform and programming language? Please leave a note in the comments section below.

    您是否要添加任何增强功能或希望以其他平台和编程语言共享其实现? 请在下面的评论部分中留下注释。

    翻译自: https://www.sitepoint.com/how-to-prevent-replay-attacks-on-your-website/

    防止重放攻击

    展开全文
  • 重放攻击通常用来恶意消耗 Web 系统有限的资源,比如某电商平台的竞争对手或者恶意用户可能利用重放攻击来恶意占用爆款商品的库存,或者在秒杀活动的时候快速刷走活动商品。我们熟悉的“黄牛”,就是利用“秒杀器”...

    上一讲,我给你介绍了 KV 存储。虽然用了 KV 存储后,服务整体性能和可用性都得到了提升,但是如果有人恶意捣乱,效果也会大打折扣。举个例子,如果秒杀系统有安全漏洞,导致有1/3 的是利用漏洞发起的恶意请求,那这部分就会带来存储开销,白白浪费了 1/3 的存储资源。

    从系统角度来看,这可能是小事,仅仅降低了一些可用性,但它给公司造成的经济损失却很大。比如,有人可能会利用漏洞快速重复提交订单,导致用户在活动中享受多笔订单优惠。更严重的是,假如黑客利用漏洞执行一些恶意操作,如获取或者篡改系统数据或者权限,这可能导致用户数据泄漏,进而被告上法庭。

    现在你意识到 Web 安全的重要性了吧。那我们该如何防范 Web 安全问题呢?这就是本讲我要给你重点介绍的内容了。希望学完后,你能轻松应对一些常见的 Web 安全问题。

    Web 安全风险有哪些?

    作为软件工程师,我们通常需要注意哪些 Web 安全风险呢?我的建议是,可以参考 OWASP Top 10 。

    什么是 OWASP 呢?OWASP 是 Open Web Application Security Project 的缩写,它是一个组织,中文名称叫“开放式Web应用程序安全项目”。OWASP 每年都会发布排名前十的 Web 安全风险,也就是前面提到的 OWASP Top 10 。比如 2020 年 OWASP Top 10 如下:

    1. 注入

    2. 失效身份验证和会话管理

    3. 敏感信息泄露

    4. XML 外部实体注入攻击(XXE)

    5. 存取控制中断

    6. 安全性错误配置

    7. 跨站脚本攻击(XSS)

    8. 不安全的反序列化

    9. 使用具有已知漏洞的组件

    10. 日志记录和监控不足

    Lark20201211-210552.png
    这 10 种风险在这里我就不一一介绍了,重点为你介绍下 Top 1 “注入”,因为它的风险最高。为什么这么说呢?

    “注入”允许攻击者上传一段可解释执行的代码片段,而该代码片段可能帮助攻击者获取系统管理权限或者隐私信息。比如,黑客可能通过“SQL 注入”获取数据库表中所有的用户名和密码,或者通过“shell 脚本注入”等方式获取系统管理权限,进而危害整个系统的安全。

    实际上,Top 4 XXE 和 Top 7 XSS 也是利用了“注入”来实现的。XXE 主要是将恶意代码注入 XML 文件中,利用服务器解析 XML 文件的漏洞来获取服务器上的额外数据。而 XSS 主要是利用浏览器渲染前端页面的漏洞,将恶意代码注入页面的数据中,窃取用户信息或执行恶意操作。

    “注入”的攻击对象主要是两类:

    • 针对系统的注入,主要用于在系统中执行恶意代码,如利用“shell脚本注入”上传获取系统权限的脚本;

    • 针对用户的注入,主要用于获取用户身份信息并执行损害用户利益的操作,如利用 XSS 获取用户登录信息并发起转账请求。

    除了以上因系统自身缺陷导致的风险外,攻击者还有一些利用网络缺陷发起的攻击手段,比如:中间人攻击、重放攻击、DDoS 攻击。

    中间人攻击, 简单来说就是攻击者通过技术手段,侵入发送方和接收方之间的计算机(如网络代理服务),拦截网络请求窃取并篡改数据。我们通常可以利用加密等方式有效防止中间人攻击,如使用 HTTPS 代替 HTTP。

    什么是重放攻击呢?所谓重放攻击,就是把以前发过的数据原封不动地重新发送给接收方。这个发过的数据,可能是攻击者窃听到的别人的数据,也有可能是攻击者曾经自己发过的数据。

    重放攻击通常用来恶意消耗 Web 系统有限的资源,比如某电商平台的竞争对手或者恶意用户可能利用重放攻击来恶意占用爆款商品的库存,或者在秒杀活动的时候快速刷走活动商品。我们熟悉的“黄牛”,就是利用“秒杀器”之类的工具,快速提交重复的请求来刷走秒杀商品。

    DDoS 攻击又是什么呢?DDoS的全称是 Distributed Denial of Service,即“分布式拒绝服务”,它的前身是 DoS (Denial of Service,拒绝服务)。DDoS 攻击通常是利用大量计算机同时向服务器发送大量垃圾数据,让服务器因为资源限制而无法处理正常的用户请求。

    你发现没有,重放攻击和 DDoS 攻击有个相同点:都是利用大量请求快速占用系统资源。有时候,当重放攻击的请求量达到一定量级(如单节点达到 1000 次),就发生质的转变,可视为 DDoS 攻击。目前各大云产商基本都有预防 DDoS 攻击的能力。

    对于秒杀系统来说,由于涉及钱和货,系统资源和用户信息都很重要,而重放攻击和 XSS 会危害到这两方面的安全。所以,接下来我将详细为你介绍下如何预防这两方面的安全风险 。

    如何预防重放攻击?

    前面我们了解到,重放攻击主要是将发送过的数据重新发送给接收方。试想下,如果我们能将这些关键的数据打上唯一标识,并在接收端记录下是否已经接收过,是不是就能预防重放攻击了呢?没错,就是这个思路!那具体是怎么做呢?

    通常有三种方法预防范重放攻击:加随机数、加时间戳、加序列号。

    加随机数,我们可以让后端生成一个随机数给前端,并将该随机数记录为未使用,同时设置有效期。在后续前后端交互中,后端会接收前端请求,并校验是否有该随机数,是否未使用,是否未过期。如果请求中没有该参数,或者该随机数已使用或者已过期,则拒绝请求。

    这个方法的优点是不容易伪造,但它需要额外保存使用过的随机数,若记录的时间段较长,则保存和查询的开销较大。

    加时间戳, 我们可以在前端生成一个时间戳,然后把它作为参数发给后端,后端校验该时间戳与当前时间是否相差在一个允许的范围内(比如 10 秒),如果超过了,则拒绝请求。

    该方法优点是不用像加随机数那样额外保存其他信息,但前端和后端认证双方需要准确的时间同步,同步越好,受攻击的可能性就越小。所以,当系统变得庞大时,跨越的区域较广,要做到精确的时间同步就变得不容易了。

    加序列号, 每次请求或返回的时候,我们都可以在上一次请求或返回的序号上加 1 ,并将当前序号记录下来。如果收到不连续的序号,则认为是非法数据。

    该方法优点是不需要时间同步,保存的信息量比随机数方式小。缺点是一旦攻击者对报文解密成功,就可以获得流水号,从而每次将流水号递增欺骗认证端。

    以上三种方法各有优缺点,那么秒杀系统该使用哪种方法呢?

    我们都知道,一个正常用户在发起抢购商品的请求前,需要先进入秒杀活动页或者商品详情页,而这两个页面都会请求后端接口,以获取活动信息和商品信息。基于此,我们就可以利用这两个页面来做文章。

    具体来说,就是在这两个页面调用后端接口的时候,由后端给前端下发一个短时间内可以作为唯一标识的东西,比如用随机数和时间戳拼接得到的数字。同时,后端将这个唯一标识记录下来,有效期设置为活动结束时间。

    当用户在前端发出请求抢购商品的时候,后端从抢购接口处接收到请求,此时它先判断是否有该唯一标识,如果没有该标识或者该标识已经被用过,则拒绝请求。

    由于唯一标识的生成算法是由后端控制,攻击者无法伪造,只能通过接口获取。所以,当攻击者通过接口获取唯一标识的时候,我们可以对攻击者进行常规限流,如限制每个 IP 每秒请求数。

    需要注意的是,秒杀系统最好开启代理层的粘性会话(Sticky Session)功能,以便将同一个用户的请求转发到同一个服务节点。这样就可以利用服务节点的本地内存缓存,来快速校验唯一标识,以及针对 IP 限流。

    以上就是防重放攻击的方法,你学会了吗?

    如何防 XSS ?

    前面提到了“注入”的风险,比如在提交表单的时候,攻击者可能在表单某个字段里填上一段可被系统执行的脚本代码。如果系统没有安全校验并执行了该代码的话,可能就会遭到攻击者入侵,导致用户数据泄漏。

    举个例子,某系统查询账号信息的 SQL 可能是这样拼接而成的:

    "SELECT * FROM accounts WHERE custID='" + ID + "'"
    

    如果攻击者将参数 ID 填写为:

    or '1'='1'
    

    这将会导致所有账号信息被泄漏。

    XSS 产生的本质原因和这个类似,也是通过前端传入非法脚本代码到后端。只不过与 SQL 注入不同的是,XSS 是在前端获取用户信息并发起非法请求,而 SQL 注入是在后端获取用户信息。

    我们要怎么防范 XSS 风险呢?

    首先,我们要对前端输入的数据进行校验,过滤掉非法关键字。比如,我们可以让前端对商品图片 URL 输入框的数据进行校验,过滤掉诸如“javascript:”这样的前端关键字。

    其次,后端对前端输入的数据进行转码后,再存入数据库,如进行 URLEncode 和 Escape 。在拼接 SQL 语句的时候,不要用简单的字符串拼接,而是利用占位符和参数通过 SQL 语句生成函数的来生成,如下所示:

    sql := mysql.Raw("SELECT * FROM accounts WHERE custID='?'", ID)
    

    这样可以利用 SQL 语句生成函数来校验参数合法性。
    最后,前端在页面渲染的时候,也需要注意对一些关键字段进行字符转义,比如对字符串中的单引号(')、双引号(")、尖括号(<>)进行转义,就能防止前端利用这些数据渲染页面的时候执行攻击者注入的 javascript 代码。

    以上便是防范 XSS 的方法。你学会了吗?

    小结

    这一讲我给你介绍了一些常见的 Web 安全风险,以及常用的防范手段。相信现在你对 Web 安全已经有了初步的认识。那么,你是否能将他们应用到自己的工作当中呢?

    思考题:如果无法通过秒杀活动页下发唯一标识,我们该采用什么方法防重放攻击呢?

    你可以把答案写在留言区。期待你的回答哦!

    这一讲就介绍到这里了,下一讲我将为你介绍如何通过系统参数,按业务场景优化网络性能。

    2.png


    精选评论

    **振:

    同一用户或同一IP的访问频次?

        讲师回复:

        针对用户和 IP 的是限流。防重放是针对单个请求的,目的是防止相同数据重复提交。举个例子:UI 上不小心点了两次提交按钮,可能就触发了两次相同参数的下单请求,但系统应该只执行一次。

    **3655:

    重放攻击那里说再加个接口搞唯一标识 再对这个接口搞个限流

        讲师回复:

        这个接口是用于下发唯一标识,后续下单请求带上该唯一标识,下单请求完了后该唯一标识失效。

    **个咪的汪:

    可以用request的header内的数据来限制客户端不能重复提交吗?或者ip

        讲师回复:

        即使用 header 或者 ip,也需要确保请求是唯一的。

    **用户0528:

    还有更多的方法么,这些好像很常见,有没有大厂独有的利器

        讲师回复:

        Web 安全的防范依赖 Web 技术,而 Web 技术本身比较成熟,所以方法比较通用。一些简单的 Web 安全防范,可以借助云厂商提供的 WAF 来做,但跟具体业务相关的就需要业务服务自己处理了。不同公司,可能区别也就是在于一些关键字段名称不一样,校验的逻辑不一样。用的技术可能也有差异,比如用的前端、后端框架不一样,遇到的问题也会有差异。

    展开全文
  • StrongDesignated验证者签名方案,可抵抗重放攻击
  • 可以防御重放攻击,校验参数被修改(数字签名) ,校验请求超时 :paw_prints: | :new_moon_face: :China: 什么是宙斯盾? Aegis追求简单的框架,所以使用最新的技术,拦截每一个http请求,然后检查参数,你可以根据...
  • ETHW重放攻击

    2022-09-19 16:56:29
    ETHW重放攻击
  • 重放攻击
  • 重放攻击(Replay Attacks)

    千次阅读 2021-02-26 10:57:59
    重放攻击(Replay Attacks)1.什么是重放攻击顾名思义,重复的会话请求就是重放攻击。可能是因为用户重复发起请求,也可能是因为请求被攻击者获取,然后重新发给服务器。2.重放攻击的危害请求被攻击者获取,并重新发送...
  • API重放攻击(Replay Attacks)又称重播攻击、回放攻击。他的原理就是把之前窃听到的数据原封不动的重新发送给接收方。HTTPS并不能防止这种攻击,虽然传输的数据是经过加密的,窃听者无法得到数据的准确定义,但是...
  • 文章目录1、重放攻击简介2、重放攻击演示3、解决方案4、重放攻击验证 欢迎各位 前(提)来(出)讨(意)论(见)。 1、重放攻击简介 重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机...
  • 重放攻击(Replay Attacks)(高风险)

    千次阅读 2020-10-12 21:36:01
    认证重放攻击(高风险) 风险级别: 高风险 风险描述: 攻击者发送一个目标主机已经接收的数据包,特别是在认证过程中,用于认证用户身份时; 风险分析: 攻击者可以使用重放攻击方式伪装成用户,冒充用户身份进行一...
  • 然而,此类系统带来的便利是以它们对不同攻击(例如干扰、重放、干扰-重放和密码分析)的脆弱性为代价的。这些攻击如果轻视,可能会给公众带来灾难性后果,例如财产盗窃和人员伤亡。为此,提出了一种使
  • 以太坊重放攻击

    千次阅读 2017-11-16 08:01:04
    引言以太坊硬分叉后出现了大量的“重放攻击”,有交易所声称丢了币,用户丢币的事更多。那到底什么是重放攻击呢?计算机术语里的“重放攻击”以太坊硬分叉后发生的“重放攻击”和传统计算机术语不是一回事。传统术语...
  • API防重放攻击

    2022-06-14 14:13:43
    重放
  • 重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。 首先要明确一个事情,重放攻击是二次请求,黑客通过抓包获取到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,328
精华内容 6,131
关键字:

重放攻击