隨著互聯網的飛速發展,驗證碼驗證已成為保護網站安全的重要手段。但是由于一些原因,驗證碼的強度越來越強,隨之而來的是驗證碼識別的難度增加。而在這個過程中,javascript驗證碼識別也成為了研究的重點。
例如,對于普通的文字驗證碼,我們可以使用JS識別驗證碼,實現自動化登錄。具體做法如下:
function getVerificationCode() { var codeImg = document.getElementById("codeImg"); //獲取驗證碼圖片 var canvas = document.createElement("canvas"); //創建canvas元素 var ctx = canvas.getContext("2d"); canvas.width = codeImg.width; //比照驗證碼圖片的尺寸 canvas.height = codeImg.height; ctx.drawImage(codeImg, 0, 0); //將驗證碼圖片繪制到canvas上 var imgData = ctx.getImageData(0,0,canvas.width,canvas.height); //獲取canvas中的像素信息 var data = imgData.data; var code = ""; for(var i=0;i<data.length;i+=4) { code += (data[i]+data[i+1]+data[i+2])/3<100 ? "1":"0"; //根據像素信息計算出驗證碼中的數字 } //將計算結果返回給函數調用者 return code; }
但是,強度更高的驗證碼,我們通過JS識別難度就會增加。例如,夾雜滑塊驗證的圖片識別。
滑塊驗證碼一般分為兩部分:缺口滑塊和滑塊背景。首先我們需要將缺口滑塊與滑塊背景分離,代碼如下:
function getOffset(img1, img2) { var canvas1 = document.createElement("canvas"); //創建canvas元素 var ctx1 = canvas1.getContext("2d"); var canvas2 = document.createElement("canvas"); var ctx2 = canvas2.getContext("2d"); canvas1.width = img1.width; canvas1.height = img1.height; canvas2.width = img2.width; canvas2.height = img2.height; ctx1.drawImage(img1, 0, 0); //將圖片繪制到canvas上 ctx2.drawImage(img2, 0, 0); var imgData1 = ctx1.getImageData(0,0,canvas1.width,canvas1.height); //獲取canvas中的像素信息 var data1 = imgData1.data; var imgData2 = ctx2.getImageData(0,0,canvas2.width,canvas2.height); var data2 = imgData2.data; var res = null; for(var i=0;i<data1.length;i+=4) { if(data1[i]!=data2[i] || data1[i+1]!=data2[i+1] || data1[i+2]!=data2[i+2]) { res = (i/4)%img1.width; //尋找缺口的位置 break; } } return res; }
通過計算滑塊缺口的位置,我們就可以在不人工干預的情況下自動識別滑塊驗證碼。
但是,由于驗證碼技術的不斷發展,當前已經出現了可以完全抵抗JS識別的驗證碼。例如,圖片驗證碼的驗證碼圖片可能有扭曲變形,有時還會存在干擾線、噪聲點等影響識別的因素。這時候,我們需要通過其他技術手段,如機器學習、深度學習等來解決這個問題。
總而言之,JS驗證碼識別對于一般的驗證碼而言是可行的。但當驗證碼越來越復雜時,我們需要采用更加高級的技術手段來解決這個問題。