显示下一条  |  关闭

老和山小和尚

敬天爱人

 
 
 
 
 
 

一个高效的验证码服务器

2011-12-30 16:39:14 阅读436 评论2 302011/12 Dec30

为了应对网络中的恶意注册或者DDOS攻击,区分是人类还是非人类是非常重要的,验证码也应运而生。我在前面提出过用验证码来对付DDOS攻击的方法。但DDOS攻击由于来势凶猛,对于验证码服务本身的效率要求比较高。

本文就提出一种快速回复和验证的验证码服务器。主要使用了nginx+ngx_lua+memcached的的技术。所有使用的代码在这里可以看到:

https://github.com/yaoweibin/captcha_server

服务器的使用方法如下:

1. 首先我使用Jcaptcha来产生1万张验证图片,文件名就是其匹配字符串。据我的同事说,Jcaptcha由于字母的粘连效果较好,破解难度比较大。

2. 然后安装一个memcache服务器,将1万张图片按字符串和图片的对应关系存入memcached。同时,存入一个1到1万的序号与匹配字符串的映射表。

3. 安装

作者  | 2011-12-30 16:39:14 | 阅读(436) |评论(2) | 阅读全文>>

记一次有效的DDOS防御

2011-12-5 12:53:15 阅读224 评论2 52011/12 Dec5

去年我就开发了nginx_limit_access_module, 该模块提供一个POST接口,通过该接口,系统管理员可以发送指令进去,手工封禁某些host,ip,uri等资源。这些封禁都需要手工配置,基本上想封什么就封什么,但它只是一个被动技能,需要你发送封禁指令。如果你想让Nginx自动封禁,可以看看limit_reqlimit_conn模块。

DDOS攻击每逢年关就攻击得紧些,这个模块是去年年底开发的,当时也测试了挺久,都没什么大问题,过了年,就没有攻击了,后来也就没上线。结果今年年底又来了,攻击的目标都是些私服博客,看起来DDOS攻击还是挺赚钱的,真是个人傻钱多的行业。

基本上我们碰到的攻击都是固定的host或者uri,攻击IP主机可能有几千个,高峰期每秒钟有近万个并发请求,攻击会持续1个小时左右,结果导致后端应用服务器先撑不住挂掉,然后是nginx,由于后端服务器没有反应,积累过多链接,内存耗尽,也挂了。

最终结果是,我们屈服了,直接将私服博客封掉了事。

但每次这样搞我们也不是办法,狗急了也会跳墙,谁愿意大半夜的起来重启机器?所以,我们现在设计了一套应急方案:在应用服务器那边,对单个博客访问次数进行统计,超过一定阈值,向limit_access模块发送指令,自动封禁某些host一段时间。逻辑很简单,响应速度也足够快。我们的想法也是尽量单点清除,不影响其他用户的体验。

作者  | 2011-12-5 12:53:15 | 阅读(224) |评论(2) | 阅读全文>>

[Announce] nginx_cross_origin_module v0.1 release

2011-11-10 15:12:51 阅读84 评论0 102011/11 Nov10

The URL of this project is here:

https://github.com/yaoweibin/nginx_cross_origin_module

Name

nginx_cross_origin_module - support cross origin resource sharing

protocol in Nginx

Status

This module is at its very early phase of development and considered

highly experimental. But you're encouraged to test it out on your side

and report any quirks that you experience.

We need your help! If you find this module useful and/or interesting,

please consider joining the development!

Synopsis

a simple example:

http {

cors on;

作者  | 2011-11-10 15:12:51 | 阅读(84) |评论(0) | 阅读全文>>

Cross-Origin Resource Sharing协议的介绍

2011-11-9 18:17:33 阅读120 评论0 92011/11 Nov9

为什么要用COR(Cross-Origin-Request,跨域请求)?[1]

传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求。

浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本。但是Javascript脚本是不能获取这些资源的内容的,它只能被浏览器执行或渲染。

COR允许Javascript获取这些外域站点资源内容。

与crossdomain.xml的不同[1]

像Flash和Silverlight这类插件也允许读取跨域请求,但是它们的设计方式跟COR完全不同。

在Flash和Silverlight中,服务器需要创建一个crossdomain.xml的文件来允许跨域请求。如果这个文件声明“http://your.site”允许来自“http://my.site”的请求,则来自“http://my.site”的请求可以访问所有“http://your.site”的文件。这是一种整个站点层面上的控制模式,要么你允许一个外域的站点访问,要么拒绝。

COR不一样,它是页面层次的控制模式。每一个页面需要返回一个名为‘Access-Control-Allow-Origin’的HTTP头来允许外域的站点访问。你可以仅仅暴露有限的资源和有限的外域站点访问。在COR模式中,访问控制的职责可以放到页面开发者的手中,而不是服务器管理员。当然页面开发者需要写专门的处理代码来允许被外域访问。

另外一个主要的区别是,某

作者  | 2011-11-9 18:17:33 | 阅读(120) |评论(0) | 阅读全文>>

针对DDOS 应用层攻击的一种对策

2011-10-24 17:00:54 阅读213 评论4 242011/10 Oct24

年底了,私服之间DDOS攻击也频繁起来,网易博客作为有些私服的发布平台,频频遭遇攻击,难道他们也有年底业绩考核?

去年我也写过关于应用层的DDOS攻击的一篇文章,那时也没有什么好想法,就是尽量降低DDOS攻击的资源消耗。其实针对HTTP层的攻击,也是有一些比较通用的方法的。

特点

我们碰到的HTTP层DDOS攻击有几个特点:

1. 攻击的IP很分散,应该是调用了大量主机,不停的发送请求。如果IP很集中的话就好好办了,可以通过封禁IP的方法解决。

2. 攻击的频率跟普通人类似。如果频率很高,可以用Nginx的limit_req模块来限制。

3. 攻击者不是真实人类。

原理

此类攻击有点像垃圾邮件,那些攻击主机基本的上都是被劫持的‘肉鸡’,接受遥控者的指令来向目标发送HTTP请求包。所以,破解的一个办法就是因为对方不是真实人类,那么就可以使用著名的图灵测试,来判断对方到底是不是人类。

下面是我的做法:

1. 当攻击开始时,对所有请求返回一个CAPTCHA页面,真实的用户会输入验证码,然后返回。如果通过验证,就给用户返回一个安全cookie,下次拥有这个cookie的用户就可以直接访问页面。

2. cookie要精心构造,首先需要包含一

作者  | 2011-10-24 17:00:54 | 阅读(213) |评论(4) | 阅读全文>>

一种一致性hash的实现及优化

2011-9-14 14:21:04 阅读250 评论0 142011/09 Sept14

最近需要用到多台cache服务器来作图片缓存,我在设计的时候考虑,一方面我想增加cache服务器的命中率,通过对URL进行hash是比较好的方法,各台服务器可以尽可能集中缓存一部分的页面。另一方面,我想尽可能的降低在增减cache服务器时候的出现所有cache重新分配的局面。所以,自然而然我想到了用一致性hash的方法。

原理

一致性hash的方法的原理[1][2]相当简单,它建立了一定范围hash值的环,每个cache服务器节点经过hash计算都映射到环上相应某个点。

当某个HTTP请求过来时,可以对其URL进行hash计算,获得的hash值在上面这个环沿顺时针方向进行查找,找到第一个点就是它需要的目标节点。

当服务器节点增加时,假设cache B与cache C之间加了一个cache D的节点,其影响也就是Key B与Key C之间的部分cache会重新分配,其他区间则不会改变。传统的hash分配的方法一般是hash值和服务器数进行求余,当服务器数据变化时,所有的hash值都会变化,这样会引起后端cache记录的剧烈抖动,大部分的cache数据可能需要重新向源服务器请求并刷新。

我参考的一种实现方式

上述一致性hash原理很简单,但具体实现还有很多地方需要优化,比如:key A, B, C如何分布,才能让到服务器ABC的负载均衡?增减服务器的时候也能实现负载均衡,并把抖动的cache数据量控制在一定的范围内?

这就引出了虚拟节点的概念:

虚拟节点的概念就是在环上出现的多个点对应的是同一个真实节点,也可以说是让真实的服务分布到环上的多个位置。

作者  | 2011-9-14 14:21:04 | 阅读(250) |评论(0) | 阅读全文>>

一个AC自动机的实现(C语言,BSD许可证)

2011-5-31 19:12:36 阅读513 评论2 312011/05 May31

这是前几天工作中碰到的一个查找字串的问题。

以C语言为例,一般我们在查找字符串中的子串时,最简单的是strstr函数。当子串数很少的时候,这个函数还是很简单有效的。但是在实际情况里,我们需要查找很多的子串,如果遍历每个子串都要扫描整个字符串,那复杂度就大了。

假设我们的字符串的长度为n,而所有的字串长度之和为m,那么我们的简单复杂匹配时间复杂度O(nm),这是很显而易见的。

那怎么来进行优化呢?用AC自动机,它其实是KMP算法的多子串的扩展形式!AC自动机的原理是将所有的匹配子串编译成一个状态机,然后将输入的字符串逐字进行状态跳转,如果跳到匹配状态就认为是匹配了。其原理的详细描述可以看[2]。根据[1]的计算,它的时间复杂度只有O(2n),当然它的空间复杂度会有一定的增加,一般与字符串的长度成正比,大约是O(km),k是一定的常量,一般也就几百K的内存。所以与几十倍的时间复杂度节省来说,是非常有益的。

如果你想对AC自动机有比较深入的了解,建议看[1]这篇论文,我的代码基本上就是按照这篇论文的伪代码描述实现的。

我的代码可以在这里找到:https://github.com/yaoweibin/aho_corasick_state_machine

[1] Margaret J. Corasick (June 1975).

作者  | 2011-5-31 19:12:36 | 阅读(513) |评论(2) | 阅读全文>>

nginx_upstream_keepalive_patch

2011-5-31 18:44:17 阅读390 评论0 312011/05 May31

Patch的URL:https://github.com/yaoweibin/nginx_upstream_keepalive_patch

这个patch主要用于支持后端HTTP的keepalive,不是完整的HTTP/1.1功能(据说agentzh 8月份会开发完整的功能,敬请期待)。

现在这个patch还处于测试阶段,欢迎试用,积极报bug。

这个patch最佳的应用范围是那些比较小的后端请求回复,不用每次请求都建立连接,与后端通信性能会有比较大的提升。

==INSTALLATION==

cd nginx-1.0.2

patch -p1 < /path/to/this/directory/upstream_keepalive_1.0.2.patch

#add the module

./configure --add-module=/path/to/this/directory

==EXAMPLE==

upstream backends {

server 10.0.0.1;

server 10.0.0.2;

keepalive 128;

}

The ngx_http_upstream_keepalive_module's document is here:

作者  | 2011-5-31 18:44:17 | 阅读(390) |评论(0) | 阅读全文>>

描述:这个模块可以把用户转到reCAPTCHA页面,只有用户通过reCAPTCHA验证,才能允许其访问。主要用来防止spam和DDOS攻击。

Name

nginx_http_recaptcha_module - support google's reCAPTCHA with Nginx

Description

This module can be deployed in spam or DDOS attack protection for Nginx.

It's used the reCAPTCHA to distinguish between human and auto script.

The module works with these steps below:

* First, the request comes from client. If the request contains the

correct secure cookie, it will do the normal action. If not, the

request will redirect to the recaptcha page.

* Second, the client inputs the captcha letters.

* Third, Nginx sends this input letters to recaptcha server for

作者  | 2011-2-15 15:10:27 | 阅读(354) |评论(0) | 阅读全文>>

Alan J. Perlis的编程格言

2011-1-12 14:30:02 阅读402 评论0 122011/01 Jan12

引用者注:今天在《程序员》看到了Alan J. Perlis的光辉历史,他是第一位图灵奖(1966 年) 获得者,ALGOL的语言发明者,特此抄录他的编程格言。

原文地址:http://www.cs.yale.edu/quotes.html

EPIGRAMS IN PROGRAMMING

1. One man's constant is another man's variable.

2. Functions delay binding; data structures induce binding. Moral: Structure data late in the programming process.

3. Syntactic sugar causes cancer of the semicolon.

4. Every program is a part of some other program and rarely fits.

5. If a program manipulates a large amount of data, it does so in a small number of ways.

6. Symmetry is a complexity-reducing concept (co-routines include subroutines); seek it everywhere.

作者  | 2011-1-12 14:30:02 | 阅读(402) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 

自定义模块

 
 
模块内容加载中...
 
 
 
 
 
 
 

浙江省 杭州市 天蝎座

 发消息  写留言

 
好吧,我是青蛙王子
 
近期心愿follow your heart, just do it.
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 
 
 
日志评论
评论列表加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 
 
 
列表加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2012

   
创建博客 登录  
 关注