亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

exchange郵箱系統增加驗證碼機制

2019-11-14 14:24:10
字體:
來源:轉載
供稿:網友

首先背景是exchange的郵箱系統沒有后臺源代碼。因為這個原因,生成驗證碼的機制放在aspx的runat="sever"后臺代碼里面。

首先需要找到iis中logon.aspx文件。在這里找到輸入郵箱名和密碼的input元素,對應增加上輸入驗證碼的input和顯示驗證碼圖片的img元素。

需要增加兩個文件:VerifyCode.aspx是用戶輸入進行輸入的驗證碼驗證操作的代碼;GetImg.aspx是用于顯示驗證碼圖片的,即將之前添加的img的src設置為這個GetImg.aspx即可。至于點擊img之后自動刷新,則屬于體驗性的改進。

代碼具體執行邏輯是GetImg在load的時候,將隨機生成的驗證碼加密之后,存在客戶端瀏覽器的cookie中,同時創建一個Img對象,將4位驗證碼字符按順序輸出到img對象上,同時img隨機分布一些點pixel,之后圖片的stream返回到瀏覽器上。

而VerifyCode的驗證則是則根據輸入的內容和之前的cookie存的密文解密之后進行比較,如果一致,則通過驗證。

VerifyCode.aspx代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" Debug="true" %><%@ Import Namespace="System.Security.Cryptography" %><script runat="server">    PRotected void Page_Load(object sender, EventArgs e)    {        if (Request.Cookies["yzmCode"] != null && Request.QueryString["yzmc"] != null)        {            string code = Decrypt(Request.Cookies["yzmCode"].Value).ToUpper();            //Response.Write("code"+code+"/n");            //Response.Write("code"+code+"/n");            //Response.End();            string ucode = Request.QueryString["yzmc"].ToUpper();            if (code == ucode)            {                Response.Write("ok");                Response.End();            }            else            {                Response.Write("error");                Response.End();            }        }        else        {            Response.Write("error2");            Response.End();        }    }    public static string Decrypt(string Text)    {        string sKey = "Exchange";        DESCryptoServiceProvider des = new DESCryptoServiceProvider();        int len;        len = Text.Length / 2;        byte[] inputByteArray = new byte[len];        int x, i;        for (x = 0; x < len; x++)        {            i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);            inputByteArray[x] = (byte)i;        }        des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPassWordForStoringInConfigFile(sKey, "md5").Substring(0, 8));        des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));        System.IO.MemoryStream ms = new System.IO.MemoryStream();        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);        cs.Write(inputByteArray, 0, inputByteArray.Length);        cs.FlushFinalBlock();        return Encoding.Default.GetString(ms.ToArray());    }</script>

GetImg.aspx代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" %><%@ Import Namespace="System.Drawing" %><%@ Import Namespace="System.Drawing.Imaging" %><%@ Import Namespace="System.IO" %><%@ Import Namespace="System.Security.Cryptography" %><script runat="server">    public static string Encrypt(string Text)    {        string sKey = "Exchange";        DESCryptoServiceProvider des = new DESCryptoServiceProvider();        byte[] inputByteArray;        inputByteArray = Encoding.Default.GetBytes(Text);        des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));        des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));        System.IO.MemoryStream ms = new System.IO.MemoryStream();        CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);        cs.Write(inputByteArray, 0, inputByteArray.Length);        cs.FlushFinalBlock();        StringBuilder ret = new StringBuilder();        foreach (byte b in ms.ToArray())        {            ret.AppendFormat("{0:X2}", b);        }        return ret.ToString();    }    public static string Decrypt(string Text)    {        string sKey = "Exchange";        DESCryptoServiceProvider des = new DESCryptoServiceProvider();        int len;        len = Text.Length / 2;        byte[] inputByteArray = new byte[len];        int x, i;        for (x = 0; x < len; x++)        {            i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);            inputByteArray[x] = (byte)i;        }        des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));        des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));        System.IO.MemoryStream ms = new System.IO.MemoryStream();        CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);        cs.Write(inputByteArray, 0, inputByteArray.Length);        cs.FlushFinalBlock();        return Encoding.Default.GetString(ms.ToArray());    }    protected void Page_Load(object sender, EventArgs e)    {        int codeW = 80;        int codeH = 22;        int fontSize = 16;        string chkCode = string.Empty;        Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };        string[] font = { "Times New Roman", "Verdana", "Arial", "Gungsuh", "Impact" };        char[] character = { '2', '3', '4', '5', '6', '8', '9', 'a', 'b', 'd', 'e', 'f', 'h', 'k', 'm', 'n', 'r', 'x', 'y', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' };        Random rnd = new Random();        for (int i = 0; i < 4; i++)        {            chkCode += character[rnd.Next(character.Length)];        }        //session["yzmCode"] = chkCode;        HttpCookie cook = new HttpCookie("yzmCode", Encrypt(chkCode));        cook.Expires = DateTime.Now.AddMinutes(20);        Response.Cookies.Add(cook);        Bitmap bmp = new Bitmap(codeW, codeH);        Graphics g = Graphics.FromImage(bmp);        g.Clear(Color.White);        for (int i = 0; i < 1; i++)        {            int x1 = rnd.Next(codeW);            int y1 = rnd.Next(codeH);            int x2 = rnd.Next(codeW);            int y2 = rnd.Next(codeH);            Color clr = color[rnd.Next(color.Length)];            g.DrawLine(new Pen(clr), x1, y1, x2, y2);        }        for (int i = 0; i < chkCode.Length; i++)        {            string fnt = font[rnd.Next(font.Length)];            Font ft = new Font(fnt, fontSize);            Color clr = color[rnd.Next(color.Length)];            g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 18 + 2, (float)0);        }        for (int i = 0; i < 100; i++)        {            int x = rnd.Next(bmp.Width);            int y = rnd.Next(bmp.Height);            Color clr = color[rnd.Next(color.Length)];            bmp.SetPixel(x, y, clr);        }        Response.Buffer = true;        Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);        Response.Expires = 0;        Response.CacheControl = "no-cache";        Response.AppendHeader("Pragma", "No-Cache");        MemoryStream ms = new MemoryStream();        try        {            bmp.Save(ms, ImageFormat.Png);            Response.ClearContent();            Response.ContentType = "image/Png";            Response.BinaryWrite(ms.ToArray());        }        finally        {            bmp.Dispose();            g.Dispose();        }    }</script>

注意:加密解密對應的sKey變量要一致。

 

判斷驗證碼是否輸入正確的js邏輯(簡單點描述就是發起get請求,地址是上面提到的VerifyCode.aspx,參數和代碼中對應上即可):

var codeVaule = $("#yzm").val();if(codeVaule == ""){    $("#yzm-tip").html("驗證碼不能為空");    return false;}else if(codeVaule.length!=4){    $("#yzm-tip").html("驗證碼位數不正確");    return false;}else{    $.get("VerifyCode.aspx?yzmc="+codeVaule,{},function(data){        if(data=="ok"){            $("#yzm-tip").html("驗證碼正確");            //$(".btnSignin").click();            clkLgn();//登錄邏輯            bo=true;        }else{            $("#yzm-tip").html("驗證碼錯誤!");        }    });}return bo;

(為了簡單,使用了jquery,引用即可)

觸發登錄操作的js函數是clkLgn(),這個放在flogon.js這個腳本文件里面,由于存在點擊登錄按鈕和直接回車(e.keyCode == 13)直接執行登錄的兩種場景,因此此處需要看清js代碼。具體倒沒什么難度。

可以修改clkLgn()的代碼邏輯,直接在里面增加對輸入驗證碼進行驗證的邏輯,然后確定是否走真正的登錄的代碼。也可以在點擊登錄按鈕或者回車的兩處邏輯上分別走驗證請求再處理。

本身加上驗證碼的目的只是為了防止密碼撞庫,快速達到要求即可。

點擊驗證碼圖片自動刷新的改進:

    function refreshImg(){        $("#yzmImg")[0].src="GetImg.aspx?"+Math.random();    }

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美性生交xxxxx久久久| 精品久久香蕉国产线看观看亚洲| 欧美一二三视频| 亚洲精品一区在线观看香蕉| 国产精品免费电影| 欧美日韩中文字幕在线视频| 亚洲最大成人免费视频| 亚洲天堂av在线免费观看| 欧美在线观看网站| 美女扒开尿口让男人操亚洲视频网站| 国内精品久久久久久中文字幕| 久久精视频免费在线久久完整在线看| 欧美激情按摩在线| 神马久久久久久| 久久99久久99精品免观看粉嫩| 日韩成人在线视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久精品亚洲精品| 日本在线精品视频| 大桥未久av一区二区三区| 久久香蕉频线观| 亚洲欧美一区二区三区久久| 久久精品99久久香蕉国产色戒| 欧美日韩不卡合集视频| 成人av在线天堂| 亚洲第一色中文字幕| 亚洲最大的av网站| 日韩av免费看网站| 亚洲精品久久久久久久久| 欧美国产日韩中文字幕在线| 日本久久久久久久久| 国产精品久久久久久久一区探花| 国产精品国产福利国产秒拍| 成人做爰www免费看视频网站| 国产欧美日韩91| 久久久久久久久久久av| 91亚洲国产精品| 欧美国产一区二区三区| 国产一区二区av| 日本一区二区三区在线播放| 国产亚洲aⅴaaaaaa毛片| 日韩国产高清污视频在线观看| 4p变态网欧美系列| 91精品国产自产在线老师啪| 久久精品夜夜夜夜夜久久| 最近中文字幕2019免费| 日韩欧美在线视频观看| 国产亚洲欧美日韩美女| 日本伊人精品一区二区三区介绍| 国产精品女视频| 在线看日韩av| 欧美激情国内偷拍| 欧美一性一乱一交一视频| 亚洲午夜未满十八勿入免费观看全集| 国内精品伊人久久| 狠狠躁夜夜躁人人爽超碰91| 亚洲人午夜色婷婷| 亚洲激情视频在线| 久久精品一偷一偷国产| 亚洲一区二区三区毛片| 日韩在线精品一区| 日韩在线视频免费观看高清中文| 97在线视频国产| 久久国内精品一国内精品| 亚洲女性裸体视频| 欧美性xxxx极品高清hd直播| 日韩av成人在线观看| 91精品国产91久久久久久| 欧美性高潮在线| 精品日韩视频在线观看| 亚洲国产精品人久久电影| 2024亚洲男人天堂| 日韩精品日韩在线观看| 一区二区三区无码高清视频| 欧美午夜丰满在线18影院| 色av吧综合网| 国产欧美一区二区三区久久| 欧美一区二区大胆人体摄影专业网站| 日韩69视频在线观看| 亚洲精品狠狠操| 丝袜美腿亚洲一区二区| 欧美视频13p| zzijzzij亚洲日本成熟少妇| 亚洲一区av在线播放| 国产精品激情av在线播放| 青青草99啪国产免费| 国产精品久久久久久搜索| 日韩精品极品在线观看| 亚洲香蕉伊综合在人在线视看| 久久九九国产精品怡红院| 久久久久久久久久久免费| 日韩在线视频免费观看高清中文| 热久久美女精品天天吊色| 亚洲欧美变态国产另类| 久久久久久久久久久免费| 亚洲qvod图片区电影| 日韩国产欧美精品在线| 亚洲美女av黄| 精品国内产的精品视频在线观看| 日韩精品在线电影| 中文字幕亚洲一区| 欧美性生交大片免网| 亚洲电影免费观看| 日韩最新在线视频| 91久久精品久久国产性色也91| 国产精品av在线播放| 亚洲一区亚洲二区亚洲三区| 日韩综合中文字幕| 国产精品青草久久久久福利99| 国产精品自拍视频| 成人黄色免费在线观看| 日韩精品福利网站| 国产在线不卡精品| xxav国产精品美女主播| 欧美大人香蕉在线| 91日韩在线播放| 大量国产精品视频| 日韩精品免费在线观看| 欧美午夜宅男影院在线观看| 成人黄色免费网站在线观看| 亚洲午夜久久久影院| 亚洲综合在线播放| 国产精品高精视频免费| 揄拍成人国产精品视频| 在线国产精品播放| 久久香蕉频线观| 亚洲片国产一区一级在线观看| 日韩欧美成人区| 国内精品视频一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩美女中文字幕| 欧美亚洲国产视频小说| www国产亚洲精品久久网站| 中文国产成人精品| 成人羞羞国产免费| 欧美黑人xxxx| 91av中文字幕| 亚洲一区亚洲二区亚洲三区| 国语自产精品视频在免费| 亚洲高清不卡av| 欧美大片在线免费观看| 欧美精品videos性欧美| 亚洲最新视频在线| 国产精品美乳一区二区免费| 亚洲欧美国产制服动漫| 国产香蕉一区二区三区在线视频| 麻豆成人在线看| 欧美怡春院一区二区三区| 九九热r在线视频精品| 久久精品99国产精品酒店日本| 美女扒开尿口让男人操亚洲视频网站| 国产一区红桃视频| 欧美在线精品免播放器视频| 美女精品视频一区| 国产精品盗摄久久久| 国产精品27p| 亚洲欧美日韩国产精品| 欧美激情精品久久久久久黑人| 日本久久中文字幕| 亚洲精品欧美日韩| 国产欧美精品一区二区三区-老狼| 亚洲无av在线中文字幕| 久久在精品线影院精品国产| 日韩美女av在线免费观看|