如何防止模拟的http的恶意请求?

http://www.dewen.io/q/5511

我有一串URL www.abc.com?para=xxx 
在页面中点击按钮后用ajax执行此URL后,后台会执行一些操作,页面通过ajax的响应结果继续完成接下来的操作。这里是没登录的情况下,没有用户标志这种session的。 
但是如果遇到懂程序的人,如果发现了这个接口的调用方法,就可以使用一些Http模拟提交的工具来请求这个接口,从而引发系统安全问题。
我不想通过IP进行访问次数和访问时间的限制,同样不想使用验证码,这样很影响用户使用的体验。 
用HTTP_REFERER来判断HTTP来路,也不可靠,有没有什么更好的办法比较有效地阻止这种行为?

评论 (4) •  • 链接 • 2012-09-12 
  • 0
    www.abc.com?para=xxx&sign=md5(key.xxx)
    接收para变量时,
    验证sign
     – fjyxian 2012-09-18
  • 0
    你可以增加每个url的有效期,有效期过了就不处理该请求 – kazaff 2012-09-22
  • 1
    果断csrfToken,这是业界成熟的方案 – kenvi 2012-09-25
  • 0
    [是不是和这个类似][1]
    [1]: http://www.oschina.net/question/12_72060
     – 明月照大江 2012-10-07
12个答案

之前写过一篇文章《CSRF: 不要低估了我的危害和攻击能力》,比较长,就不贴过来了,需要的自己过去看~

大致总结如下,总体来说,预防CSRF主要从2个方面入手,分别是:
1、正确使用GET,POST和Cookie;
2、在non-GET请求中使用Security token;

评论 (0) • 链接 • 2012-09-13

可以对请求进行限制,如果不是采用ajax方式请求的可以拒绝请求
$AJAX = ('XMLHttpRequest' == @$_SERVER['HTTP_X_REQUESTED_WITH']);
if(!$AJAX) exit;
....

评论 (1) • 链接 • 2012-09-12
  • 1
    可以通过设置header来模拟ajax请求,很多单元测试框架就可以实现模拟ajax请求 – abbish 2012-09-14

页面载入时服务器端产生加密key,js使用key加密参数,提交到服务器,由服务器解密后运行,解密失败的无视请求。

缺点也存在,那就是加密是在js处进行的,如果被人深入依旧可以使用程序调用。

限制这种调用的最优方法就是在服务器端,不想使用session登录信息判断的话,这就很难操作。只能将js复杂化,增加他人解读难度。

我不想通过IP进行访问次数和访问时间的限制,同样不想使用验证码,这样很影响用户使用的体验。

可以使用session进行时间间隔判断,例如载入页面到提交参数时间间隔过短的,很有可能是程序自动提交,毕竟浏览器载入,渲染都是需要时间的。

评论 (0) • 链接 • 2012-09-12
  1. 我觉得不登录就能用的接口如果也能引发安全问题的话,这个属于设计问题吧……如果是Ajax登录之类的接口的话另当别论
  2. 浏览器能做的任何操作,程序都是可以模拟的。因为浏览器也是程序。因此所谓防范毫无意义。验证码之类的机制虽然可以防止全自动,但至少也可以半自动(手输验证码)。真正防范大量自动或半自动调用的方法只有按IP的访问量限制。
  3. Session是没用的。Session是靠Cookies来工作的,清掉Cookies又是一个新的Session

综上所述,有用的方法就只有你说的那两种:通过IP进行访问次数和访问时间的限制,验证码
百度贴吧之类的大型网站防范程序发帖也是用的这两种方法,如果有更好的方法他们早就用了。可以考虑把这两种合起来,没超过访问次数和访问时间限制就正常访问,否则要求验证码,这样算是一个权衡吧。

评论 (2) • 链接 • 2012-09-14
  • 0
    其实 LZ 主要想解决的是 外部调用 ajax 引发的安全问题,而不是说限制接口的次数.. – 秋叶 2012-09-19
  • 0
    @秋叶 这就是没办法。用户能进行的操作,脚本也能进行。 – 灵剑2012 2012-09-19

如果你的应用不是到处都是这种按钮的话,最好的方法还是验证码和访问限制,如果很多,那还是优化流程设计减少按钮吧

评论 (0) • 链接 • 2012-09-14

1.假如是需要登录才可以调用的接口,那么每次进行操作的时候都进行登录判断即可。
2.假如是不需要登录可以操作的接口,那么就在ajax 的url 添加上 加密( 时间 + 常量 + ip)
后端反解密,成功代表请求正常,反之失败, 接受到数据的时候再判断下 一定时间内ip 请求次数是否过多,如果是的话 一直返回失败....

评论 (0) • 链接 • 2012-09-19

要想完全安全只能走pki,那一套了。

评论 (0) • 链接 • 2012-09-21

服务端生成密钥,传递给客户端,服务端再验证

评论 (0) • 链接 • 2012-09-20
  • 社区维基

    0 票

  • 赵志新
    1

你要识别 机器与用户 只有 验证码一条路可以走了

评论 (0) • 链接 • 2012-09-19

www.abc.com?para=xxx&sign=md5(key.xxx)
接收para变量时,
验证sign

评论 (0) • 链接 • 2012-09-18

HTTP_REFERER这个你是用的什么语言,整个数据必须用javascript获得,然后传给服务器,因为除了javascript其他语言的referer都是可以伪造的,javascript的不可以伪造,当然对于javascript也是有办法的,不过这个是最准确的,百度统计等等级网站都是用的javascript判断来路

评论 (2) • 链接 • 2012-09-16
  • 0
    但是其他工具可以连javascript的头一起伪造,还是没用 – 灵剑2012 2012-09-16
  • 0
    HTTP_REFERER 完全可以模拟 – ericlin 2012-09-24

所有的登录请求都可被模拟,看模拟人水平如何了。杀毒软件也是先有病毒后杀毒,做不到完全的安全,只能通过一些手段减少。
一、通过后台你可以清楚看到恶意点击来源,IP直接禁止
二、系统会根据您的频率设置要求,一般的模拟都是有规律的。

增加 防恶意点击阻击功能
1、不采取动作:只记录不对恶意点击访客采取阻击动作,可以正常访问网站;
2、警告并提示收藏:提醒访客将网站添加到收藏夹,下次访问就不用再点广告链接进入网站(警告内容及收藏可以在全局参数设置中定义);
3、网站跳转:拒绝访客访问,直接转向用户自定义的网站;
4、关不掉的对话框:对方电脑弹出关不掉的对话框;
5、黑屏:对方电脑显示黑屏效果,关闭时出现关不掉的对话框;
6、弹窗死机:对方电脑不断弹出窗口,直到电脑资源耗尽瘫痪;
7、组合攻击:多种阻击联合执行
8、病毒植入:给恶意访客的电脑稙入病毒

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页