如何实现Stack Overflow的“你是一个人”的功能吗?

时间:2010-03-04 15:53:00

标签: c# asp.net asp.net-mvc

在此网站上,如果您点击次数太多或发表评论太快或类似的话,您会被重定向到“你是一个人”屏幕。有人知道如何做类似的事吗?

7 个答案:

答案 0 :(得分:10)

这几乎可以肯定是一种启发式方法,试图“猜测”用户是某种形式的自动化过程,而不是一个人,例如:

  • 超过“x”要求连续做同样的事情
  • “y”段内的“x”行动

通常情况下,“x”和“y”值将被表述为“真实的人”不太可能做的事情,例如:

  • 连续5次编辑相同的答案
  • 在1分钟内打下10个问题

一旦你获得了一套规则,你就可以实现一些在每个请求开始时检查它们的代码,无论是在Page_Load中调用的方法,还是在你的母版页中调用的东西,在asp.net中的东西管道,这很容易! ;)

答案 1 :(得分:3)

答案 2 :(得分:3)

对于asp.net,这是一个非常好的 Captcha Control ,首先是你需要的

http://www.codeproject.com/KB/custom-controls/CaptchaControl.aspx

然后你可以将它与这个试图找到 dos攻击的想法一起使用

http://weblogs.asp.net/omarzabir/archive/2007/10/16/prevent-denial-of-service-dos-attacks-in-your-web-application.aspx

如果(context.Request.Browser.Crawler)返回false,则在此代码中存储错误;它必须返回true,或者完全删除它。

并根据点击次数或提交内容进行操作。

如果用户在一段时间内进行了太多点击,或者多次提交,那么您只需打开capthaControl,如果点击次数太多,那么就会触发dos。通过这种方式,您可以同时拥有2个解决方案,Dos阻止,同时使用验证码。

我已经做了类似于我自己的事情,但我已经改变了两者的源代码,以满足我的需求。

针对dos攻击的不同代码的另一个有趣链接。

http://madskristensen.net/post/Block-DoS-attacks-easily-in-ASPNET.aspx

希望这对你有所帮助。

答案 3 :(得分:2)

猜测......

编写一个记录请求并将其存储在会话中的HTTP处理程序。

当有新请求进入时,请检查存储了多少请求(并使旧请求过期)。

如果过去几分钟内的请求数量超过了给定的阈值,请重定向用户。

如果您在ASP.NET网页表单中执行此操作,则可以在网站母版页上执行此操作(或编写IHttpHandler)。

如果您正在使用MVC框架,则可以编写一个基本控制器来检查每个操作。

使用rails,您可以编写before_request过滤器。

使用asp.net MVC,您可以编写[ActionFilterAttribute]属性

答案 4 :(得分:2)

您应该有一个会话来跟踪用户活动。

在会话中,您可以使用计数器进行评论和发布,如:

(伪代码而不是C#,抱歉:)

if (post_event) {

    posts_during_1_minute_interval++;

    if (time_now-reference_time > 1_minute) {
    reference_time = time_now;
    posts_during_1_minute_interval=0;
    }
}
...
if (posts_during_1_minute_interval > 10) redirect("/are-you-human.htm");

在are-you-human.htm页面上,您可以拥有recaptcha,就像他们在StcakOverflow.com上一样

另见:http://blog.stackoverflow.com/2009/07/are-you-a-human-being/

答案 5 :(得分:1)

只需检查您从特定IP或会话中获得的点击/分钟数或其他数量,并确定您的首选门限和优势

答案 6 :(得分:-2)

我还会检查请求的用户代理标头 - 如果它看起来不像一个流行的浏览器(或是空的)那么抛出“你是一个人吗?”页。