Home > Security > ใช้ selenium+tesseract ทดสอบ Captchar

ใช้ selenium+tesseract ทดสอบ Captchar

January 23rd, 2015

ส่วนใหญ่พวก web app เราจะใส่พวก captchar ด้วยในหน้า login หรือฟอร์มต่าง ๆ เพื่อกันบอทโพสข้อมูลหรือ login ซ้ำ ๆ จนได้ password ใช่ไหมครับ แต่เราเคยสงสัยไหมครับว่า captchar ของเรานี่ดีในระดับไหน

 

ผมขอเล่าวิธีการทดสอบง่าย ๆ โดยใช้ selemiun กับ tesseract ละกันครับ โดยขอบเขตของการทดสอบคือใช้กับ captchar ที่เป็นตัวอังกฤษภาษาอังกฤษผสมตัวเลขเท่านั้นครับ ภาษาที่ใช้เป็น python ครับ นี่เป็นหน้าตาของส่วน login ที่เราจะทดสอบนะครับ captchar เป็นตัวเลขล้วนครับ

login

 

ผมจะอธิบายโค้ดทีละบรรทัดนะครับ

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import sys, string, os, time

#ด้านบนเป็นการ import lib ทั้งหมดครับ


driver = webdriver.Firefox()
driver.get(“http://www.xxx.com/login”)

#เลือก driver ที่เราจะใช้ในการทดสอบตามโค้ดเป็น firefox เมื่อ run จะเปิด firefox ขึ้นมาครับ

assert “Login” in driver.title

#ดูว่า title ของ page มีคำว่า Login หรือไม่ครับ

driver.save_screenshot(‘screenshot.png’)

#ทำ ss ของหน้าเว็ป ตรงนี้สังเกตว่าต้องใช้ ss เพราะ captchar จะเปลี่ยนมี refresh ใหม่ทุกครั้งครับ

os.chdir(‘C:\Program Files\ImageMagick-6.9.0-Q16’)
os.system(‘”convert -crop 145×45+750+270 c:\screenshot.png c:\ss.png”‘)
os.chdir(‘C:\\’)
os.system(‘tesseract ss.png test -psm 7’)

#หลังจากที่ได้ ss แล้วเราก็ crop ภาพให้เหลือแต่ส่วนที่เป็น captchar ครับ แล้วใช้ tesseract ที่เป็น opensource orc แกะตัวอักษรออกมา -psm 7 คือให้อ่านออกมาเหมือนว่ามีบรรทัดเดียวครับ

f = open(‘C:\\test.txt’,’r’)
captchar = f.read()
output = ”
for char in captchar:
if ‘0’<= char <= ‘9’:
output=output+char

#หลังจากได้ captchar มาแล้วจะมีบางส่วนที่อ่านไม่ได้ครับแล้วออกมาเป็นตัวอักษรแปลก ๆ ครับ เราจะต้องกรองให้เหลือแค่ตัวเลขครับ

s = ‘ren ss.png ‘+output+”.png”
os.system(s)

#พอได้ตัวเลขแล้วก็เปลี่ยนชื่อไฟล์เพื่อเช็คว่า captchar ที่อ่านได้ถูกกี่เปอร์เซ็นต์ โค้ดตัวอย่างไม่ได้ทำ for loop นะครับ แต่ผมทดสอบไป 100 ครั้งได้ผลตามสรุปครับ

สรุปแล้วผลที่ผมได้คือ 63% อ่านได้ถูกต้องตัวเลขครบทั้งหกตัว 24% ตัวเลขครบหกตัวแต่จะอ่านตัวเลขผิดส่วนที่ผิดมาก ๆ จะเป็นอ่านเลขแปดเป็นเลขสามครับ อีก 13% อ่านตัวเลขได้ไม่ครบทั้งหกตัวครับ

ซึ่งถ้าเราปรัปเปลี่ยนให้อีก 13% ที่อ่านตัวเลขได้ไม่ครบกลับไป recursive อีกครั้งความเป็นไปได้ที่เราจะอ่าน captchar ได้อย่างถูกต้องจะอยู่ที่ 71% ครับ

จริง ๆ ผมไม่แน่ใจว่า captchar นี่ควรจะกันบอทได้อย่างน้อยกี่ % แต่เข้าใจว่าเกิน 60% ถือว่ามากเกินไปและควรจะเปลี่ยน อ้างอิงจาก recaptchar ของ google ที่มีคนแกะจนอ่านได้เกิน 60% แล้วเริ่ม implement มาใช้ภาพแทนครับ

–วิธีลง PhantomJS บน ubuntu https://gist.github.com/julionc/7476620

Categories: Security Tags:
Comments are closed.