如何擊敗滑動驗證碼

一、了解滑動驗證碼的工作原理

滑動驗證碼是一種常見的人機驗證方式,它要求用戶在指定時間內完成拖動一個圖片滑塊的操作,以證明該用戶是人而非機器程序。因此,想要打敗滑動驗證碼,首先要了解它的工作原理。具體來說,滑動驗證碼的驗證過程包括以下幾個步驟:

1、在頁面中生成一張含有特定標識的圖片,並將其切分成若干個大小相同的滑塊;

2、用戶在指定時間內,通過鼠標或手指拖動一個圖片滑塊,將其對齊到頁面中顯示的指定位置上;

3、系統比對用戶滑塊的特定標識和頁面中滑塊的特定標識,如果匹配則視為該用戶是可信的人類用戶,否則認為該用戶是機器程序。

二、破解滑動驗證碼的通用思路

雖然每個滑動驗證碼都會有一定的差異,但是我們可以總結出一些通用的破解思路,具體分為以下幾點:

1、分析滑動驗證圖片標識的生成方式,例如是否基於時間戳、部分採用靜態元素等;

2、分析滑塊位置計算的算法,例如是否固定或者模糊化,在這個基礎上針對驗證碼做合適的區塊劃分;

3、分析滑塊特徵提取及比對的算法,例如在目標區域內獲取特徵點、計算哈希等等,針對滑塊位置模糊及噪聲做合適的處理;

4、根據前三點的信息做合適的模擬,並通過模擬來破解滑動驗證碼。

三、破解滑動驗證碼的具體方法

接下來,我們分別從圖片標識、滑塊位置計算和滑塊特徵提取三個方面來具體介紹破解滑動驗證碼的方法。

1、破解圖片標識

滑動驗證碼的圖片標識通常是由一些字符、數字、線條等隨機生成的圖案拼接而成,包括靜態和動態元素。破解滑動驗證碼需要先對圖片進行處理,獲取圖片標識,並將其與後續的任務進行比對。在許多滑動驗證碼中,圖片標識是通過JS生成的。通過使用Selenium這樣的自動化測試工具可以獲取到JS返回內容中標識的值。如果驗證碼的圖片標識是由特定的時間戳生成的,可以先請求驗證碼的頁面獲取到相同時間戳的頁面,並通過正則表達式從頁面html中獲取標識。

“`python
# 使用Selenium來獲取驗證碼圖片標識的值
from selenium import webdriver

driver = webdriver.Chrome(executable_path=’chromedriver.exe’)
driver.get(url)
time.sleep(3)
# 通過JS獲取到圖片標識的值
style = driver.find_element_by_id(‘captcha’).get_attribute(‘style’)
pattern = re.compile(r”background-image: url\((.*?)\);.*background-position: (.*?) (.*?)px;”, re.S)
result = pattern.findall(style)
# result[0][0] 為圖片的url,result[0][1]為圖片x坐標,result[0][2]為圖片y坐標
“`

2、破解滑塊位置計算

滑塊驗證碼的關鍵是如何計算滑塊的位置。一些滑塊位置計算算法通常是基於時間戳,也有一些算法會包含一些複雜的邏輯。我們可以通過了解滑塊位置算法及其模糊化技巧來對其進行破解。

我們可以得到一個運動軌跡,然後根據運動軌跡進行分析。在大多數情況下,滑塊位置計算算法中的時間戳會出現偏差,因此需要做一些微調來彌補。可以通過對抗式生成網絡(GAN)訓練等方法,結合不同的算法,進行計算。

“`python
# Python 代碼示例
# 模擬獲取下滑滑塊的方法
def get_tracks(distance, seconds):
# 一個軌跡由多個軌跡段組成,每個軌跡段滑動的時間也不同,通過融合軌跡段達到時間累加的效果
# v0 為起始速度,vd 為結束速度,a為加速度,t為時間,S為位移,v為速度。加速部分與減速部分對稱
v0 = 0
vt = 0.5
a = 4
tracks = []
current = 0
mid = distance * 4 / 5
while current < distance:
if current < mid:
a = 4
else:
a = -4
t = random.randint(10, 50) / 100 * (1 + random.random())
s = v0 * t + 0.5 * a * (t ** 2)
vt = vt + a * t
current += s
tracks.append(round(vt * seconds))
return tracks
“`

3、破解滑塊特徵提取

滑動驗證碼通常在滑塊上添加了若干條噪線或者在滑塊周邊加入干擾物,來增加其難度,但這些也是可以破解的。我們可以通過對滑塊進行特徵點提取,計算哈希值等算法來破解滑塊的特徵識別,可以使用OpenCV等工具庫來提取特徵點(SIFT,SURF,ORB等算法)。

“`python
# Python 代碼示例
# 使用OpenCV提取特徵點及哈希值
import cv2
import numpy as np

# 提供滑塊圖片和正確位置參數
def process_image(img, pos):
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 高斯模糊
blur = cv2.GaussianBlur(gray, (3, 3), 0)
# 邊緣提取
canny = cv2.Canny(blur, 100, 200)
# 找輪廓
contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 在輪廓中查找正確的輪廓
min_x = pos[0]
max_x = pos[0] + pos[2]
min_y = pos[1]
max_y = pos[1] + pos[3]
for contour in contours:
# 去除小輪廓
if cv2.contourArea(contour) < pos[-1] – 1:
continue
# 查找包含滑塊的輪廓
startX, startY, w, h = cv2.boundingRect(contour)
endX = startX + w
endY = startY + h
if startX max_x or startY max_y:
continue
# cv2.rectangle(canny, (startX, startY), (endX, endY), (0, 255, 0), 5)
# 提取特徵點
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp, des = sift.detectAndCompute(img_gray[startY:endY, startX:endX], None)
# 判斷特徵點是否符合條件
if len(kp) < 10:
continue
# 需要30個特徵點才能做出決策
m = hashlib.md5()
for point in np.float32([kp[i].pt for i in range(30)]):
m.update(str(point).encode())
return m.hexdigest()
“`

總結

以上是一些簡單的方法,可以欺騙大部分的滑動驗證碼。當然,也可以結合多種方法、多個工具、多個人工參數等技術手段,實現更好的自動破解效果。同時,也需要認識到,打敗滑動驗證碼是一個動態的過程,驗證碼設計者也在不斷升級相應的技術手段,因此,作為破解方,我們也需要不斷更新我們的技術手段,才能保持相對競爭的優勢。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/227738.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 16:31
下一篇 2024-12-09 16:31

相關推薦

  • 滑動驗證碼的實現與安全性

    一、滑動驗證碼的作用 滑動驗證碼最初是為了解決機器人或者腳本在網站上的惡意操作所產生的問題而出現。它通過普通驗證碼的數字或字符轉化為操作行為,提示用戶拖動滑塊以完成驗證。 滑動驗證…

    編程 2025-04-18
  • 短信驗證碼接口的實現

    一、基本介紹 短信驗證碼接口是在用戶註冊、忘記密碼等場景中常用的驗證方式之一。它通過將一個字符串以短信的方式發送到用戶手機上,用戶輸入這個字符串完成驗證,確保用戶的手機和註冊信息是…

    編程 2025-02-25
  • Vue滑塊驗證碼插件的詳細闡述

    一、插件簡介 Vue滑塊驗證碼插件可以滿足在註冊、登錄等涉及用戶安全驗證的場景下,對用戶進行驗證碼驗證。 使用者可以在項目中輕鬆地引入該插件,並進行自定義配置,以便適應不同的需求。…

    編程 2025-02-25
  • HTML驗證碼

    HTML驗證碼是通過HTML代碼生成的一種圖像形式,用來區分人類和機器的有效性。HTML驗證碼在web安全和用戶界面設計方面扮演着重要的角色,防止網絡爬蟲,垃圾郵件,惡意軟件和其他…

    編程 2025-02-05
  • Android驗證碼輸入框詳解

    一、驗證碼輸入框的基本功能 驗證碼輸入框一般用於驗證用戶的身份,例如登錄、註冊、找回密碼等場景。其主要功能是輸入驗證碼,發送驗證碼,以及實現驗證碼的自動填充功能。 1. 輸入驗證碼…

    編程 2025-02-01
  • php生成6位數驗證碼,python生成6位數驗證碼

    本文目錄一覽: 1、php怎麼實現驗證碼的 2、用PHP寫一個接口,隨機生成6位數字,然後以短信的形式發送到對應的手機號上。從來沒寫過接口不知道如何寫 3、Php中生成6位隨機數並…

    編程 2025-01-14
  • java手機驗證碼,java手機驗證碼短信接口

    本文目錄一覽: 1、java怎麼實現驗證碼識別? 2、Java短信驗證碼功能怎麼實現? 3、java如何實現發送短信驗證碼功能? 4、java怎麼開通短信驗證碼登錄功能? 5、ja…

    編程 2025-01-14
  • php登陸驗證碼,php模擬登錄識別驗證碼

    本文目錄一覽: 1、PHP 驗證碼 2、php 登陸驗證碼通不過 3、PHP中模擬登錄的驗證碼問題應該如何解決 4、php驗證碼怎麼實現 5、如何用PHP生成驗證碼 6、在Thin…

    編程 2025-01-13
  • 註冊表單驗證js代碼,表單驗證碼代碼

    本文目錄一覽: 1、JS表單註冊驗證 2、js表單驗證代碼怎麼寫 3、JS表單驗證代碼 4、asp表單提交註冊驗證js問題 5、js註冊表單驗證代碼 6、用html做的一個form…

    編程 2025-01-11
  • php驗證碼字體,PHP驗證

    本文目錄一覽: 1、求助thinkphp3.2.3驗證碼和字體庫使用 2、thinkphp的中文驗證碼?那些中文字符串放在哪個文件夾?或者說是怎麼引入的? 3、php驗證碼亂碼 4…

    編程 2025-01-11

發表回復

登錄後才能評論