網站自動註冊問題

凝霜發表於2012-12-04

網站自動註冊問題

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

原理

先來說說負載排程的原理:

  1. 設定並行引數。thread_count設定並行執行緒的數量,user_srart_index設定註冊使用者的起始編號,user_end_index設定註冊使用者的終止編號;
  2. step變數用於計算每個工作執行緒需要負載的註冊數量;
  3. 通過for迴圈,將任務分塊,並傳遞給worker_thread.sh進行後臺註冊。

接下來講解下work_thread.sh的原理:

  1. 通過接收parallel_reg.sh傳遞進來的兩個引數,可以確定註冊的起始編號和結束編號,並以此作為for迴圈的範圍;
  2. 使用了強大的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中,因為我們不需要檢視這些資訊。

總結

通過上述兩個指令碼,我們可以看出在沒有註冊碼的情況下網站被惡意註冊是一件非常簡單的事情,因此我們在設計網站的時候對註冊碼一定要認真對待,要盡最大可能增加其識別難度,以防止惡意註冊。

相關文章