精华内容
下载资源
问答
  • 并发攻击
    千次阅读
    2019-05-02 08:08:09

    这两篇文章很简单易懂,自己看一下就行,所以没有自己写一下。蛮有趣的。

    分布式锁解决超卖的优化:《用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景?》](https://blog.csdn.net/u010391342/article/details/84372342)

    高并发情况下出现的问题和如何解决:《Web大规模高并发请求和抢购的解决方案》

    更多相关内容
  • 将waf.php文件上传网站里,在核心文件里加入引用代码:include('waf.php');根据你文件存放的路径修改
  • 主要介绍了Windows服务器应对高并发和DDOS攻击的配置方法,本文讲解了应对高并发请求、应对DDOS攻击的多种配置方法,需要的朋友可以参考下
  • 他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Missing Loading前,强占这其中十几毫秒的时间,进行恶意攻击。 相关链接: Memcached笔记——(一)安装&常规错误&监控 Memcached笔记...

    近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源。他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Missing Loading前,强占这其中十几毫秒的时间,进行恶意攻击。

    相关链接:
    Memcached笔记——(一)安装&常规错误&监控
    Memcached笔记——(二)XMemcached&Spring集成
    Memcached笔记——(三)Memcached使用总结

    Memcached笔记——(四)应对高并发攻击

    为了应对上述情况,做了如下调整:

    1. 更新数据时,先写Cache,然后写Database,如果可以,写操作交给队列后续完成。
    2. 限制统一帐号,同一动作,同一秒钟并发次数,超过1次不做做动作,返回操作失败。
    3. 限制统一用户,每日动作次数,超限返回操作失败。

    要完成上述操作,同事给我支招。用Memcached的add方法,就可以很快速的解决问题。不需要很繁琐的开发,也不需要依赖数据库记录,完全内存操作。

    以下实现一个判定冲突的方法:

    Java代码 复制代码 收藏代码
    1. /**
    2. * 冲突延时 1秒
    3. */
    4. public static final int MUTEX_EXP = 1;
    5. /**
    6. * 冲突键
    7. */
    8. public static final String MUTEX_KEY_PREFIX = "MUTEX_";
    9. /**
    10. * 冲突判定
    11. *
    12. * @param key
    13. */
    14. public boolean isMutex(String key) {
    15. return isMutex(key, MUTEX_EXP);
    16. }
    17. /**
    18. * 冲突判定
    19. *
    20. * @param key
    21. * @param exp
    22. * @return true 冲突
    23. */
    24. public boolean isMutex(String key, int exp) {
    25. boolean status = true;
    26. try {
    27. if (memcachedClient.add(MUTEX_KEY_PREFIX + key, exp, "true")) {
    28. status = false;
    29. }
    30. } catch (Exception e) {
    31. logger.error(e.getMessage(), e);
    32. }
    33. return status;
    34. }
    	/**
    	 * 冲突延时 1秒
    	 */
    	public static final int MUTEX_EXP = 1;
    	/**
    	 * 冲突键
    	 */
    	public static final String MUTEX_KEY_PREFIX = "MUTEX_";
    
    	/**
    	 * 冲突判定
    	 * 
    	 * @param key
    	 */
    	public boolean isMutex(String key) {
    		return isMutex(key, MUTEX_EXP);
    	}
    
    	/**
    	 * 冲突判定
    	 * 
    	 * @param key
    	 * @param exp
    	 * @return true 冲突
    	 */
    	public boolean isMutex(String key, int exp) {
    		boolean status = true;
    		try {
    			if (memcachedClient.add(MUTEX_KEY_PREFIX + key, exp, "true")) {
    				status = false;
    			}
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    		}
    		return status;
    	}

    做个说明:

    选项 说明
    add 仅当存储空间中不存在键相同的数据时才保存
    replace 仅当存储空间中存在键相同的数据时才保存
    set 与add和replace不同,无论何时都保存

    也就是说,如果add操作返回为true,则认为当前不冲突!

    回归场景,恶意用户1秒钟操作6次,遇到上述这个方法,只有乖乖地1秒后再来。别小看这1秒钟,一个数据库操作不过几毫秒。1秒延迟,足以降低系统负载,增加恶意用户成本。

    附我用到的基于XMemcached实现:

    Java代码 复制代码 收藏代码
    1. import net.rubyeye.xmemcached.MemcachedClient;
    2. import org.apache.log4j.Logger;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.stereotype.Component;
    5. /**
    6. *
    7. * @author Snowolf
    8. * @version 1.0
    9. * @since 1.0
    10. */
    11. @Component
    12. public class MemcachedManager {
    13. /**
    14. * 缓存时效 1天
    15. */
    16. public static final int CACHE_EXP_DAY = 3600 * 24;
    17. /**
    18. * 缓存时效 1周
    19. */
    20. public static final int CACHE_EXP_WEEK = 3600 * 24 * 7;
    21. /**
    22. * 缓存时效 1月
    23. */
    24. public static final int CACHE_EXP_MONTH = 3600 * 24 * 30;
    25. /**
    26. * 缓存时效 永久
    27. */
    28. public static final int CACHE_EXP_FOREVER = 0;
    29. /**
    30. * 冲突延时 1秒
    31. */
    32. public static final int MUTEX_EXP = 1;
    33. /**
    34. * 冲突键
    35. */
    36. public static final String MUTEX_KEY_PREFIX = "MUTEX_";
    37. /**
    38. * Logger for this class
    39. */
    40. private static final Logger logger = Logger
    41. .getLogger(MemcachedManager.class);
    42. /**
    43. * Memcached Client
    44. */
    45. @Autowired
    46. private MemcachedClient memcachedClient;
    47. /**
    48. * 缓存
    49. *
    50. * @param key
    51. * @param value
    52. * @param exp
    53. * 失效时间
    54. */
    55. public void cacheObject(String key, Object value, int exp) {
    56. try {
    57. memcachedClient.set(key, exp, value);
    58. } catch (Exception e) {
    59. logger.error(e.getMessage(), e);
    60. }
    61. logger.info("Cache Object: [" + key + "]");
    62. }
    63. /**
    64. * Shut down the Memcached Cilent.
    65. */
    66. public void finalize() {
    67. if (memcachedClient != null) {
    68. try {
    69. if (!memcachedClient.isShutdown()) {
    70. memcachedClient.shutdown();
    71. logger.debug("Shutdown MemcachedManager...");
    72. }
    73. } catch (Exception e) {
    74. logger.error(e.getMessage(), e);
    75. }
    76. }
    77. }
    78. /**
    79. * 清理对象
    80. *
    81. * @param key
    82. */
    83. public void flushObject(String key) {
    84. try {
    85. memcachedClient.deleteWithNoReply(key);
    86. } catch (Exception e) {
    87. logger.error(e.getMessage(), e);
    88. }
    89. logger.info("Flush Object: [" + key + "]");
    90. }
    91. /**
    92. * 冲突判定
    93. *
    94. * @param key
    95. */
    96. public boolean isMutex(String key) {
    97. return isMutex(key, MUTEX_EXP);
    98. }
    99. /**
    100. * 冲突判定
    101. *
    102. * @param key
    103. * @param exp
    104. * @return true 冲突
    105. */
    106. public boolean isMutex(String key, int exp) {
    107. boolean status = true;
    108. try {
    109. if (memcachedClient.add(MUTEX_KEY_PREFIX + key, exp, "true")) {
    110. status = false;
    111. }
    112. } catch (Exception e) {
    113. logger.error(e.getMessage(), e);
    114. }
    115. return status;
    116. }
    117. /**
    118. * 加载缓存对象
    119. *
    120. * @param key
    121. * @return
    122. */
    123. public <T> T loadObject(String key) {
    124. T object = null;
    125. try {
    126. object = memcachedClient.<T> get(key);
    127. } catch (Exception e) {
    128. logger.error(e.getMessage(), e);
    129. }
    130. logger.info("Load Object: [" + key + "]");
    131. return object;
    132. }
    133. }
    import net.rubyeye.xmemcached.MemcachedClient;
    
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    /**
     * 
     * @author Snowolf
     * @version 1.0
     * @since 1.0
     */
    @Component
    public class MemcachedManager {
    
    	/**
    	 * 缓存时效 1天
    	 */
    	public static final int CACHE_EXP_DAY = 3600 * 24;
    
    	/**
    	 * 缓存时效 1周
    	 */
    	public static final int CACHE_EXP_WEEK = 3600 * 24 * 7;
    
    	/**
    	 * 缓存时效 1月
    	 */
    	public static final int CACHE_EXP_MONTH = 3600 * 24 * 30;
    
    	/**
    	 * 缓存时效 永久
    	 */
    	public static final int CACHE_EXP_FOREVER = 0;
    
    	/**
    	 * 冲突延时 1秒
    	 */
    	public static final int MUTEX_EXP = 1;
    	/**
    	 * 冲突键
    	 */
    	public static final String MUTEX_KEY_PREFIX = "MUTEX_";
    	/**
    	 * Logger for this class
    	 */
    	private static final Logger logger = Logger
    			.getLogger(MemcachedManager.class);
    
    	/**
    	 * Memcached Client
    	 */
    	@Autowired
    	private MemcachedClient memcachedClient;
    
    	/**
    	 * 缓存
    	 * 
    	 * @param key
    	 * @param value
    	 * @param exp
    	 *            失效时间
    	 */
    	public void cacheObject(String key, Object value, int exp) {
    		try {
    			memcachedClient.set(key, exp, value);
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    		}
    		logger.info("Cache Object: [" + key + "]");
    	}
    
    	/**
    	 * Shut down the Memcached Cilent.
    	 */
    	public void finalize() {
    		if (memcachedClient != null) {
    			try {
    				if (!memcachedClient.isShutdown()) {
    					memcachedClient.shutdown();
    					logger.debug("Shutdown MemcachedManager...");
    				}
    			} catch (Exception e) {
    				logger.error(e.getMessage(), e);
    			}
    		}
    	}
    
    	/**
    	 * 清理对象
    	 * 
    	 * @param key
    	 */
    	public void flushObject(String key) {
    		try {
    			memcachedClient.deleteWithNoReply(key);
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    		}
    		logger.info("Flush Object: [" + key + "]");
    	}
    
    	/**
    	 * 冲突判定
    	 * 
    	 * @param key
    	 */
    	public boolean isMutex(String key) {
    		return isMutex(key, MUTEX_EXP);
    	}
    
    	/**
    	 * 冲突判定
    	 * 
    	 * @param key
    	 * @param exp
    	 * @return true 冲突
    	 */
    	public boolean isMutex(String key, int exp) {
    		boolean status = true;
    		try {
    			if (memcachedClient.add(MUTEX_KEY_PREFIX + key, exp, "true")) {
    				status = false;
    			}
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    		}
    		return status;
    	}
    
    	/**
    	 * 加载缓存对象
    	 * 
    	 * @param key
    	 * @return
    	 */
    	public <T> T loadObject(String key) {
    		T object = null;
    		try {
    			object = memcachedClient.<T> get(key);
    		} catch (Exception e) {
    			logger.error(e.getMessage(), e);
    		}
    		logger.info("Load Object: [" + key + "]");
    		return object;
    	}
    
    }

    相关链接:
    Memcached笔记——(一)安装&常规错误&监控
    Memcached笔记——(二)XMemcached&Spring集成
    Memcached笔记——(三)Memcached使用总结

    Memcached笔记——(四)应对高并发攻击

    展开全文
  • TCP连接管理相关的攻击

    千次阅读 2022-03-04 09:40:03
    SYN泛洪是一种TCP拒绝服务攻击,在这种攻击中一个或多个恶意的客户端产生一系 列TCP连接尝试(SYN报文段),并将它们发送给一台服务器,它们通常采用“伪造”的 (例如,随机选择)源IP地址。服务器会为每一条连接分配一定...

    SYN泛洪攻击

    SYN泛洪是一种TCP拒绝服务攻击,在这种攻击中一个或多个恶意的客户端产生一系 列TCP连接尝试(SYN报文段),并将它们发送给一台服务器,它们通常采用“伪造”的 (例如,随机选择)源IP地址。服务器会为每一条连接分配一定数量的连接资源。由于连接 尚未完全建立,服务器为了维护大量的半打开连接会在耗尽自身内存后拒绝为后续的合法连 接请求服务。

    解决方法

    回收最旧的半开TCP连接

    在填充积压后覆盖最旧的半开连接。这种策略要求合法连接可以在比积压可以填充恶意SYN数据包的时间更短的时间内完全建立。当攻击量增加时,或者如果积压大小太小而不实用,则此特定防御失败。

    SYN Cookie

    SYN Cookie 是对 TCP 服务器端的三次握手做一些修改,专门用来防范 SYN Flood 攻击的一种手段。它的原理是,在 TCP 服务器接收到 TCP SYN 包并返回 TCP SYN+ACK 包时,不分配一个专门的数据区,而是根据这个 SYN 包计算出一个 cookie 值。这个 cookie作为将要返回的 SYN ACK 包的初始序列号。当客户端返回一个 ACK 包时,根据包头信息计算 cookie,与返回的确认序列号(初始序列号 + 1)进行对比,如果相同,则是一个正常连接,然后,分配资源,建立连接。

    实现的关键在于cookie的计算,cookie的计算应该包含本次连接的状态信息,使攻击者不能伪造。

    影响路径最大传输单元

    在这种攻击中,攻击者伪造一个 ICMP PTB 消息(需要进行分片但设置了不分片位)。该消息包含了一个非常小的 MTU 值(例如,68字节)。这样就迫使受害的 TCP 尝试采用非常小的数据包来填充数据,从而大大降低了它的性能。

    解决方法

    最强力的攻击方法是简单地禁用主机的路径最大传输单元发现功能。当接收到的 ICMP PTB 消息的下一跳最大传输单元小于 576字节时,其他选项会禁用路径最大传输单元发现功能。Linux 的一个系统的选项,例如:ifconfig ppp0 mtu 288。该选项会保持最小的数据包大小(为了 TCP 的大数据包)。如果该选项被固定为某一数值,那么较大的数据包则不能将 IPv4 的 DF 位置位。这种方法虽然比完全禁用路径最大传输单元发现功能更具攻击性。

    破坏现有的TCP连接

    另一种类型的攻击涉及破坏现有的 TCP 连接,甚至可能将其劫持。这一类攻击通常包含的第一步是使两个之前正在通信的 TCP 节点 "失去同步" 。这样它们将使用不正确的序列号。至少有两种方法能实现上述攻击:在连接建立过程中引发不正确的状态传输,在 ESTABLISHED 状态下产生额外的数据。一旦两端不能再进行通信(但却认为它们间拥有一个打开的连接),攻击者就能够在连接中注入新的流量,而且这些注入的流量会被 TCP 认为是正确的。

    欺骗攻击

    这类攻击所涉及的 TCP 报文段是由攻击者精心定制的,目的在于破坏或改变现有 TCP 连接的行为。攻击者可以生成一个伪造的重置报文段并将其发送给一个 TCP 通信节点。假定与连接相关的 4 元组以及校验和都是正确的,序列号也处在正确的范围。这样就会造成连接的任意一端失败。

    解决方法

    认证每一个报文段(例如,使用 TCP-AO 选项) ;要求重置报文段拥有一个特殊的序列号以代替处于某一范围的序列号;要求时间戳选项具有特定的数值;使用其他形式的 cookie 文件,让非关键的数据依赖于更加准确的连接信息或一个秘密数值。

    展开全文
  • 这里要解决两个问题: ...实际中,程序员什么情况下意识到被攻击了?一般都是等用户反馈说应用访问很卡之类的,查看检查日志发现大量报错,因此在这里就突出了日志的重要性。但是有些人喜欢写continue或return..

    这里要解决两个问题:

    1、高并发;

    2、如何识别恶意用户

     

    高并发是一个概念,很难讲请求量达到多少就是高并发。理论上每个接口都会出现高并发。实际上,我们只关心一些热点业务的并发数,这个和硬件、业务的复杂程度、容器节点数都有关。处理高并发的常规操作就是扩容和缓存,里面的操作细节就先不讲。

     

    如何识别恶意用户?

    实际中,程序员什么情况下意识到被攻击了?一般都是等用户反馈说应用访问很卡之类的,查看检查日志发现大量报错,因此在这里就突出了日志的重要性。但是有些人喜欢写continue或return,没有抛错或者记录日志,就无从下手了。这种事情也是经一戳长一智,没有意识到这个问题,就不会处理,提前写好日志,或者做接口监控,统计接口的访问次数和访问IP,设置黑名单。回到现实,你的应用有没有被攻击的价值?

    展开全文
  • 并发是指在同一个时间点,有很多用户同时访问URL地址,比如...这里主要讲述的是在并发请求下的数据逻辑处理的接口,如何保证数据的一致性和完整性,这里的并发可能是大量用户发起的,也可能攻击者通过并发工具发起的
  • redis缓存如何应对高并发请求和攻击

    千次阅读 2019-01-07 16:14:57
    发生缓存穿透,高并发场景下,如果是黑客恶意攻击也是致命的。那么在缓存这层怎么作保护方案尼 缓存穿透示意图 方案 1)缓存空数据 将数据库查询结果为空的key也存储在缓存中。当后续又出现该key的...
  • 并发服务器-多线程服务器详解
  • C语言实现的支持高并发、超高性能Web服务器源码,可以编译运行,使用高性能HTTP解析器fasterhttp作为其解析核心,在开启Keep-Alive和gzip压缩时(现代浏览器默认开启)性能比nginx约快3倍。 hetao功能: * 支持主流...
  • 这篇文章主要介绍了如何使用Python多线程测试并发漏洞,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求介绍 有时候想看看Web应用在代码或者数据库层有没有...
  • php session的锁和并发

    2020-12-19 13:52:13
    本文分享PHP的session在使用过程中的锁和并发的问题,与之相关的...我们的系统是基于phalcon 2.0.8 开发的,如你所见,我们在表单域加入了防止csrf攻击的域。也启用了验证码。 <input type="hidden" name="{{ se
  • PHP防CC攻击实现代码

    2020-10-28 05:42:37
    所谓的CC攻击就是对方利用程序或一些代理对您的网站进行不间断的访问,造成您的网站处理不了而处于当机状态
  • Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标...
  • CLI工具和库可轻松执行,并支持并发网络请求和精美的UI。 安装 确保已安装 ,然后运行 $ npm install --global padding-oracle-attacker 或者 $ yarn global add padding-oracle-attacker CLI用法 Usage $ ...
  • 以下是一个典型的高负载web应用...攻击检测和安全隔离:由于反向代理服务无需完成任何动态页面生成任务,所有与业务逻辑相关的请求都转发至后端应用服务器处理。因此反向代理服务几乎不会被应用程序设计或后端数据漏洞
  • 大家都知道服务器资源有限的,但是客户端来的请求是无限的(不排除恶意攻击), 为了保证大部分的请求能够正常响应,不得不放弃一些客户端来的请求,所以我们会采用Nginx的限流操作, 这种操作可以很大程度上缓解...
  • 商品秒杀,防并发解决思路

    千次阅读 2018-03-03 20:06:53
    我们在做电商项目的时候,经常会遇到抢购秒杀的问题,综合来说主要是两个问题一,高并发情况下对数据库产生的压力二,如何避免超卖(库存&lt; 0)的情况。针对这两个问题来谈下解决思路一,缓解数据库压力 用 缓存就...
  • wpsshop商城b2c官方正版 php开源框架 高并发,抗ddos攻击 抗cc攻击 二次开发,学习必不可少的源码 测试可以使用 官方下载 含手机端 pc端。
  • ⑤、对于白名单过滤,只要将白名单 IP 保存到脚本同一目录下的 white_ip.txt 文件中即可,若发现攻击 IP 在白名单中,脚本不会直接拉黑,而是发一封邮件给你,让你自己判断这个白名单攻击你是为毛?如果白名单需要...
  • 3.使用多进程和多线程的方式实现并发服务器import socketfrom multiprocessing import Processfrom threading import Threaddef task(sock):while True:try:recv_data = sock.recv(1024)if recv_data:print('accept ...
  • 常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务。 端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口。虽然其本身并不是恶意的网络活动,但也...
  • 针对数字签名的公平交换问题,提出了可废除并发签名机制.在签名阶段,首先由签名者选取一种特殊...与传统并发签名方式相比,所提机制可消除各种攻击的可能性,特别是在产生可废除并发签名时,交换双方只需要产生一个k
  • 以下是一个典型的高负载web应用...攻击检测和安全隔离:由于反向代理服务无需完成任何动态页面生成任务,所有与业务逻辑相关的请求都转发至后端应用服务器处理。因此反向代理服务几乎不会被应用程序设计或后端数据漏洞
  • JAVA并发编程

    千次阅读 多人点赞 2021-10-18 11:22:03
    并发编程 1.进程与线程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO ...
  • 每天15分钟JMeter入门篇(二):使用JMeter实现并发测试 每天15分钟JMeter入门篇(三):认识JMeter的逻辑控制器 每天15分钟JMeter入门篇(四):认识JMeter中的函数 每天15分钟JMeter入门篇(五):认识JMeter中的...
  • CC攻击讲解

    千次阅读 2019-01-09 09:41:52
    DDoS攻击势头愈演愈烈,除了攻击手法的多样化发展之外,udp攻击是相对比如好防御,这是四层流量攻击。最麻烦的攻击手段是cc攻击。下面我祥细讲讲CC攻击之后有什么表现,如何防御,有Cc有什么攻击类型。   案例:...
  • 模拟实验配备IEEE 802.15.4对等传感器网络,实验结果证明了提出的系统可以容忍并发女巫攻击数量的变化,也可以成功处理同时发生的、可延展的女巫攻击。另外发生假警报的概率非常小,整个网络性能及其一致性没有受到...
  • windows服务器应对高并发和DDOS攻击

    千次阅读 2016-10-08 17:09:32
    windows系统本身就有很多机制可以用来提高性能和安全,其中有不少可以用来应对高并发请求和DDOS攻击的情况。 通过以下配置可以改善windows服务器性能: 一、应对高并发请求: 1、TCP...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,073
精华内容 32,029
关键字:

并发攻击