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

來源:互聯網
上載者:User
文章目錄
  •  
 

我在上一篇文章中已經講解了一般網站的登入原來和C#的登入實現,很多人問到對於使用了驗證碼的網站該怎麼辦,這裡我就講講驗證碼的原理和對應的登入方法。

驗證碼的由來

幾年前,大部分網站、論壇之類的是沒有驗證碼的,因為對於一般使用者來說驗證碼只是增加了使用者的操作,降低了使用者的體驗。但是後來各種灌水機器人、投票機器人、惡意註冊機器人層出不窮,大大增加了網站的負擔同時也給網站資料庫帶來了大量的垃圾資料。為了防止各種機器人程式的破壞,於是程式員想出了只有人眼能夠識別的,程式不容易識別的驗證碼!

驗證碼是一個圖片,將字母、數字甚至漢字作為圖片的內容,這樣一張圖片中的內容用人眼很容易識別,而程式將無法識別。在進行資料庫操作之前(比如登入驗證、投票、發帖、回複、註冊等等)程式首先驗證用戶端提交的驗證碼是否與圖片中的內容相同,如果相同則進行資料庫操作,不同則提示驗證碼錯誤,不進行資料庫操作。這樣各種機器人程式就被拒之門外了!

但是隨著電腦科學的發展,模式識別等技術越來越成熟,於是編寫機器人程式的傢伙可以通過程式將直接寫在圖片中的內容識別出來,然後提交到伺服器,這樣驗證碼將形同虛設。為了防止機器人程式的識別,驗證碼的圖片產生也不斷在發展,加入幹擾點、幹擾線,文字變形、變換角度位置,顏色不同……各種防止電腦識別的技術也應用到驗證碼中。就在這兩種技術的競爭中,於是便形成了我們現在看到的驗證碼,已經有很多人在抱怨“這是什麼驗證碼哦,人眼都分辨不清楚是什麼”,一切也是無奈。

驗證碼的使用

驗證碼是針對各種機器人程式的,所以驗證碼圖片中的內容是不能存放在Cookie、HTML和URL中的,如果看到一個驗證碼圖片的URL是http://xxxxxx.com/Expwd.aspx?code=1af8 而驗證碼圖片中的內容就是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)請求http://passport.csdn.net/UserLogin.aspx頁面,與伺服器建立會話,伺服器返回一個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的內容發送到驗證碼產生的頁面http://passport.csdn.net/ShowExPwd.aspx 該頁面將返回一個圖片的二進位流。

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到http://passport.csdn.net/UserLogin.aspx進行驗證。

__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即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.