Posted 5/25/17
Recently I was working on a MUD, or Multi-user-dungeon with a friend. Like many multi-player games, MUDs are vulnerable to scripting and cheating. To prevent cheating many MUDs rate-limit commands from users, or have a concurrent turn-based system, where events occur at set intervals regardless of when commands were entered.
But what about preventing users from scripting account registration? On the web we often use CAPTCHAs to prevent automation, so what if we could do…
We want to reproduce this:
In a terminal like this:
Captcha:
_
| | | o
| | __| __, _ _ __, __ _
|/ / | | | / | / |/ | /\/ / | / \_| |/
|__/\_/|_/ \_/|_/\_/|/ | |_/ /\_/\_/|_/\__/ |_/|__/
/|
\|
Answer: ldugnxaoie
Correct!
Generating a captcha as ASCII art is pretty easy using figlet. The whole thing comes out to:
#!/usr/bin/env ruby Fonts = ["small", "mini", "script", "standard", "slant", "banner"] Letters = ('a'..'z').to_a.shuffle[0,rand(8..12)].join Text = `figlet -f #{Fonts.sample(1)[0]} #{Letters}` puts "Captcha:" puts "#{Text}" print "Answer: " response = gets unless( response.nil? ) response.rstrip! end if( response == Letters ) puts "Correct!" exit 0 else puts "Incorrect." exit 1 end
And there’s my terrible idea for the day.