简单的验证码程序

 
 
给ASP.Net表单增加验证码
 
一、验证码
对于一个预防攻击的web表单来讲,验证码通常是一个常见的措施。因为如果对于一些public区域的页面内容来讲,譬如一个登录表单,如果没有必要的安全措施,很可能遭到模拟登录的暴力破解攻击,要么轻易获得特定账户的登录信息,要么给服务器增加了大量的负荷,影响正常的服务。解决的办法,一般就是在登录前给出一个随机的信息(验证码),显示在页面上,让用户填写,以确保用户是通过web页面来进行正常的登入,对于非法的非web途径登录者会看不到这个验证码从而拒绝其登录。虽然这样,往往很多攻击者会截获登录web页,从而也搜索出验证码,这样,验证保护措施也失去意义,一般情况下,我们可以通过将验证信息作为图像信息显示在web上,这样就既可以不阻碍合法用户登录,又使非法攻击者无法通过html搜索获得验证信息。这大抵上就是验证码的用途和意义了。
 
二、ASP.Net的验证码实现
一般传统的验证码图像一般采用一些CGI、ISAPI程序加上一些加密代码来动态生成图像,ASP大多采用COM组件实现,相当辛苦。
ASP.Net中欲实现动态验证码却相当容易,笔者大致的思路:
1、  了安全起见,一般存在于CGI程序的url中的验证码加密串最好不要出现在html表单中,而是采用session变量存储,这样验证码的校验会很容易。
2、  采用一个单独的aspx页面专门产生动态程序,要显示的图形验证码信息存在于session中,而一个系统中有可能存在多个表单,为满足整个系统要求可以在aspx后加一个确定的session key的名称,例如
<img src=”http://xxxx/Genimg/viewImg.aspx?sessionKeyName=abc”> 此处的abc就是登录页在第一次输出表单给客户端自动生成一个随机字符串存储在session中的key名称,在服务器端脚本中可以通过session(“abc”)获得生成的字符串(验证码)到底是多少,通过和用户在表单的验证码输入框中输入的内容比较来确定用户是否通过正常的ie浏览器来访问表单。
3、  在表单的第一次显示(get方法)时,生成一个随机数字符串,存入session(“abc”)中,同时将abc作为sessionKeyName的值加入到验证码图形显示生成程序viewImg.aspx的url串中。
4、  ViewImg.aspx分析sessionKeyName,获取session(“abc”)的具体值,利用GDI+产生内存图像,然后修改http header,按照content-type=images/png的格式输出二进制流,这样客户的浏览器会显示出一幅图像,图像表达的内容就是验证码。
5、  当用户填入验证码后,提交到表单验证程序,首先考察其中的验证码输入字段,发现不匹配session(“abc”)马上拒绝,甚至可以累计失败登录次数,乃至拒绝此IP连接,保护系统;匹配session中的存储值,可以进行进一步的其他处理(譬如登录处理,文章发表等),当然也注意销毁此session变量(如果以后不需要)。
6、  不同的表单,可以分配不同的session变量名,这样一个ViewImg.aspx可以为系统多个表单服务。
 
三、实例解说
重点列出viewImg.aspx吧,具体看清单:
 
Imports System.IO
 
Public Class viewImg
Inherits System.Web.UI.Page
 
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim img As Bitmap
        Dim gdiobj As Graphics
        Dim ms As MemoryStream      '--内存流,存放动态图形内存印象
        Dim vfycode As String       '--验证码
        Dim SessionKeyname As String
 
        If (Request("SessionKeyName") <> "") Then
            SessionKeyname = Request("SessionKeyName")
            If (Session(SessionKeyname) <> "") Then
                vfycode = Session(SessionKeyname)
            Else
                vfycode = ""
            End If
            img = New Bitmap(32, 16)    '--这个宽高可以根据需要确定
            gdiobj = Graphics.FromImage(img)
            gdiobj.DrawString(vfycode, (New Font("Arial", 9)), (New SolidBrush(Color.Black)), 0, 0)
            ms = New MemoryStream()
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Png)   '--选择透明格式
            Response.ClearContent()     '--原本是准备输出html流,现在输出图信数据,所以要修改http头
            Response.ContentType = "image/png"
            Response.BinaryWrite(ms.ToArray())   
        Else
        End If
        Response.End()        '--这个最好带上
 
    End Sub
 
End Class
 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java验证码识别程序需要用到一些图像处理的库,比如OpenCV或者JavaCV。以下是一个简单验证码识别程序的示例: ```java import org.bytedeco.opencv.opencv_core.*; import org.bytedeco.opencv.global.opencv_imgcodecs; import org.bytedeco.opencv.global.opencv_imgproc; import java.util.ArrayList; import java.util.List; public class CaptchaRecognition { public static void main(String[] args) { String captchaPath = "captcha.png"; // 验证码图片路径 Mat captcha = opencv_imgcodecs.imread(captchaPath); Mat gray = new Mat(); opencv_imgproc.cvtColor(captcha, gray, opencv_imgproc.COLOR_BGR2GRAY); Mat thresh = new Mat(); opencv_imgproc.threshold(gray, thresh, 0, 255, opencv_imgproc.THRESH_BINARY_INV | opencv_imgproc.THRESH_OTSU); List<MatOfPoint> contours = new ArrayList<>(); Mat hierarchy = new Mat(); opencv_imgproc.findContours(thresh, contours, hierarchy, opencv_imgproc.RETR_EXTERNAL, opencv_imgproc.CHAIN_APPROX_SIMPLE); StringBuilder captchaCode = new StringBuilder(); for (MatOfPoint contour : contours) { Rect rect = opencv_imgproc.boundingRect(contour); if (rect.width() < 10 || rect.height() < 10) { continue; } Mat roi = new Mat(thresh, rect); String code = recognizeCharacter(roi); captchaCode.append(code); } System.out.println("验证码:" + captchaCode.toString()); } private static String recognizeCharacter(Mat roi) { // 这里可以使用机器学习算法或者模板匹配来实现字符识别 // 这里为了简单起见,直接将roi转换成字符串返回 return roi.toString(); } } ``` 以上代码中,我们首先读取验证码图片,并将其转换成灰度图像。然后使用二值化算法对图像进行处理,使得字符的轮廓更加明显。接着使用OpenCV提供的`findContours`函数找到图像中所有的轮廓。对于每一个轮廓,我们使用`boundingRect`函数得到该轮廓的矩形框,并判断其是否是一个字符(这里通过简单的宽度和高度判断)。最后,我们将每一个字符的矩形框提取出来,并传入`recognizeCharacter`函数中进行识别。在`recognizeCharacter`函数中,我们可以使用机器学习算法或者模板匹配算法来实现字符识别。在这个示例中,我们直接将字符的像素矩阵转换成字符串返回,仅供参考。 这个示例只是一个简单验证码识别程序,实际上验证码的形式非常多样,有些验证码还会加入干扰线、干扰点等技巧来防止机器识别。因此,实际应用中还需要根据具体情况来选择合适的算法,并进行调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值