使用C#登陸帶驗證碼的網站

我在 上一篇文章中已經講解了通常網站的登陸原來和C#的登陸實現,不少人問到對於使用了驗證碼的網站該怎麼辦,這裏我就講講驗證碼的原理和對應的登陸方法。
驗證碼的由來
幾年前,大部分網站、論壇之類的是沒有驗證碼的,由於對於通常用戶來講驗證碼只是增長了用戶的操做,下降了用戶的體驗。可是後來各類灌水機器人、投票機器人、惡意註冊機器人層出不窮,大大增長了網站的負擔同時也給網站數據庫帶來了大量的垃圾數據。爲了防止各類機器人程序的破壞,因而程序員想出了只有人眼可以識別的,程序不容易識別的驗證碼!
驗證碼是一個圖片,將字母、數字甚至漢字做爲圖片的內容,這樣一張圖片中的內容用人眼很容易識別,而程序將沒法識別。在進行數據庫操做以前(好比登陸驗證、投票、發帖、回覆、註冊等等)程序首先驗證客戶端提交的驗證碼是否與圖片中的內容相同,若是相同則進行數據庫操做,不一樣則提示驗證碼錯誤,不進行數據庫操做。這樣各類機器人程序就被拒之門外了!
可是隨着計算機科學的發展,模式識別等技術愈來愈成熟,因而編寫機器人程序的傢伙能夠經過程序將直接寫在圖片中的內容識別出來,而後提交到服務器,這樣驗證碼將形同虛設。爲了防止機器人程序的識別,驗證碼的圖片生成也不斷在發展,加入干擾點、干擾線,文字變形、變換角度位置,顏色不一樣……各類防止計算機識別的技術也應用到驗證碼中。就在這兩種技術的競爭中,因而便造成了咱們如今看到的驗證碼,已經有不少人在抱怨「這是什麼驗證碼哦,人眼都分辨不清楚是什麼」,一切也是無奈。
驗證碼的使用
驗證碼是針對各類機器人程序的,因此驗證碼圖片中的內容是不能存放在Cookie、HTML和URL中的,若是看到一個驗證碼圖片的URL是 [url]http://xxxxxx.com/Expwd.aspx?code=1af8[/url] 而驗證碼圖片中的內容就是1af8那將是十分好笑的事情。同時,若是經過抓包發現了Cookie中保存了驗證碼的值或者查看HTML時看到了形如:<input type="hidden" id="exPwd" name="exPwd" value="1af8"/>這樣將驗證碼的內容放在隱藏元素中也是難以想象的。對於這些行爲,顯然是這個程序員不知道驗證碼是拿來幹什麼的,只是別人的網站上有驗證碼,與本身的網站也弄一個來趕時髦。另外還有一種可笑的是驗證碼看上去像是驗證碼,結果看HTML代碼竟然不是一個圖片,而是一個<span>1</span><span>a</span><span>f</span><span>8</span>。你們不要不覺得然,以上這幾種狀況還真是我現實生活中遇到過的,當年寫投票機器人的時候遇到這種狀況我最高興了!!!
驗證碼的內容必須保存在服務器端,通常咱們能夠將隨機生成的驗證碼的內容放入Session中,用戶提交的時候將提交的內容與Session中的驗證碼進行比較判斷。在生成驗證碼的頁面後臺代碼能夠寫爲:
protected void Page_Load( object sender, EventArgs e)
     {
             string checkCode = CreateCode(4);
             Session[ "CheckCode"] = checkCode;
             CreateImage(checkCode);
     }
好比在登陸進行驗證的時候能夠寫爲:
protected void btnLogin_Click( object sender, ImageClickEventArgs e)
    {
             if (Session[ "CheckCode"] == null)
            {
                    UIHelper.Alert(Page, "驗證碼已過時,請從新輸入");
                     return;
            }
             if (Session[ "CheckCode"].ToString().ToLower() != txbCode.Text.ToLower()) //驗證碼忽略大小寫
            {
                    UIHelper.Alert(Page, "驗證碼錯誤");
                     return;
            }    
//數據庫驗證……    
}
使用C#登陸帶驗證碼的網站
前面咱們已經對整個驗證碼的原理和使用有了基本的瞭解,如今言歸正傳,講講如何登陸帶驗證碼的網站。這裏咱們以CSDN的登陸爲例。
1.在IE中正常登陸一次並把登陸時候的數據包抓下來。
2.分析其中的登陸原理以下:
1)請求 [url]http://passport.csdn.net/UserLogin.aspx[/url]頁面,與服務器創建會話,服務器返回一個SessionID在HTTP的Header中,以下,其餘內容咱們能夠忽略。
ASP.NET_SessionId=ydebagnqgiiixi2dvihfw355; path=/; HttpOnly,ABCDEF=; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,QWERTOP=; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,activeUserName=Guest; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,UserName=Guest; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,PName=; domain=csdn.net; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,ClientKey=; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,userid=0; expires=Tue, 22-Apr-2008 17:57:01 GMT; path=/,ClientKey=933ffb09-5096-4fbb-b90f-5f0bff335b41; path=/
2)該頁面返回的HTML中有一個<input type="hidden" name="ClientKey" value="a50b14fa-2a75-4364-bbeb-3b498b72aa46" />這個值在登陸提交時也須要,因此須要從HTML代碼中分離出來。
3)將該SessionID做爲Cookie的內容發送到驗證碼生成的頁面 [url]http://passport.csdn.net/ShowExPwd.aspx[/url] 該頁面將返回一個圖片的二進制流。
4)將返回的二進制流轉換爲圖片並呈現給用戶。
Image img = new Bitmap(
                    Http.GetStreamByBytes( "http://passport.csdn.net" , "http://passport.csdn.net/ShowExPwd.aspx", b,
                                                                aspcookie, out header));//得到驗證碼圖片
this.pictureBox1.Image = img;
5)用戶輸入用戶名、密碼和驗證碼,而後和同前面分離出的ClientKey按以下的格式POST到 [url]http://passport.csdn.net/UserLogin.aspx[/url]進行驗證。
__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwULLTE4NDgzMDI2NjcPFgIeCkZpbmlzaFN0YXloFgJmD2QWBAIBDxYCHgRUZXh0BQznlKjmiLfnmbvlvZVkAgIPZBYCAgMPZBYCAgEPFgIeB1Zpc2libGVoZBgBBR5fX0NvbnRyb2xzUmVxdWlyZVBvc3RCYWNrS2V5X18WAgUeY3RsMDAkQ1BIX0NvbnRlbnQkY2JfU2F2ZVN0YXRlBR1jdGwwMCRDUEhfQ29udGVudCRJbWFnZV9Mb2dpbr5SL%2FGtMqVCJ%2FCh4jH%2FXp4DhlVU&ctl00%24CPH_Content%24tb_LoginNameOrLoginEmail= studyzy&ctl00%24CPH_Content%24tb_Password= 123&ctl00%24CPH_Content%24tb_ExPwd= wgssj&ClientKey= a50b14fa-2a75-4364-bbeb-3b498b72aa46&ctl00%24CPH_Content%24cb_SaveState=on&from=http%3A%2F%2Fhi.csdn.net%2Fmy.html&MailParameters=&MailParameters=&ctl00%24CPH_Content%24Image_Login.x=26&ctl00%24CPH_Content%24Image_Login.y=11
6)驗證成功的話將返回包含用戶信息(發帖數、積分、博客排名等等)的HTML,驗證失敗將返回具體的錯誤信息。
3.以上將CSDN的登陸原理分析清楚了,那麼接下來就是代碼實現了,代碼實現比較簡單,我直接在上篇文章所使用的Demo代碼上修改的,因此寫的不是很漂亮,你們如有興趣能夠看看。 /Files/studyzy/LoginCSDNDemo.rar
成功登陸後如圖:
如今當前用戶已經成功登陸了,那麼接下來是要在CSDN上發表博客、論壇發帖只須要將當前的SessionID放入Cookie中,在提交時使用該Cookie便可。
【出自 博客園深藍居

0javascript

收藏java

fangdaren

15篇文章,3W+人氣,0粉絲

Ctrl+Enter 發佈mysql

發佈linux

取消git

1條評論程序員

按時間倒序 按時間正序

掃一掃,領取大禮包spring

0sql

1
分享
fangdaren
相關文章
相關標籤/搜索