Güvenlik Kodu Oluşturma

Bu derste form girişlerimiz ve kayıt işlemlerimiz için güvelik resmi uygulaması yapacağız. Öncelikle neyi ne için yaptığımızı bilmemiz gerekiyor.

Bu derste form girişlerimiz ve kayıt işlemlerimiz için güvelik resmi uygulaması yapacağız.

Öncelikle neyi ne için yaptığımızı bilmemiz gerekiyor. Bu uygulamadaki amaç, sitemize yapılan bot saldırılarını engellemek ya da kısmen en aza indirgemek; çünkü artık bunlar programlar yardımı ile aşılabiliyor. Son zamanlarda benim de duymuş olduğum KittenAuth diye bir uygulama var. Bizim burada yaptığımızın daha gelişmiş hali.

Güvenlik konu başlığından gerekli bilgileri alabilirsiniz.

Şimdi biz çok sık karşılaştığımız bu yapıyı ASP ile yapalım. [Örnek: Sanalkurs.net Yorum Ekle]

İlk ASP sayfamız kombinasyonları ve fonksiyonları oluşturduğumuz alan. Açıklamaları kod içine ekledim.

Guvenlik.asp


<%@LANGUAGE="VBSCRIPT"%>

<!--Burada Güvenlik resmi içinde oluşacak karakter ve rakamları belirliyoruz.-->

<%

FontMap = Array(_

split("13,A,B,C,D,E,F,0,1,2,3,4,5,6,7,8,9",",") ,_

split("14,*5#4*5,*4#6*4,&2,&2,*3#3*2#3*3,&5,*2#4*2#4*2,*2#3*4#3*2,*2#10*2,*1#12*1,*1#3*6#3*1,&11,#3*8#3",",") ,_

split("11,#8*3,#10*1,#3*4#3*1,&3,&3,&1,&2,#3*4#4,#3*5#3,&9,&8,&2,#9*2",",") ,_

split("11,*4#6*1,*2#9,*1#4*4#2,*1#3*6#1,#3*8,&5,&5,&5,&5,&4,&3,&2,&1",",") ,_

split("12,#8*4,#10*2,#3*4#4*1,#3*5#3*1,#3*6#3,&5,&5,&5,&5,&4,&3,&2,&1",",") ,_

split("9,#9,&1,#3*6,&3,&3,#8*1,&6,&3,&3,&3,&3,&1,&1",",") ,_

split("9,#9,&1,#3*6,&3,&3,&1,&1,&3,&3,&3,&3,&3,&3",",") ,_

split("11,*3#5*3,*1#9*1,*1#3*3#3*1,#3*5#3,&4,&4,&4,&4,&4,&4,&3,&2,&1",",") ,_

split("9,*3#3*3,&1,#6*3,&3,*3#3*3,&5,&5,&5,&5,&5,&5,#9,&12",",") ,_

split("10,*1#6*3,#8*2,#2*3#4*1,#1*5#3*1,*6#3*1,&5,*5#3*2,*4#4*2,*3#4*3,*2#4*4,*1#4*5,#10,&12",",") ,_

split("11,*1#8*2,#10*1,#3*5#3,#1*7#3,*7#3*1,*3#6*2,*3#7*1,*7#4,*8#3,&4,#3*4#4,&2,*1#7*3",",") ,_

split("12,*6#4*2,*5#5*2,&2,*4#2*1#3*2,*3#3*1#3*2,*2#3*2#3*2,*1#3*3#3*2,#3*4#3*2,#12,&9,*7#3*2,&11,&11",",") ,_

split("11,*1#10,&1,*1#3*7,&3,*1#8*2,*1#9*1,*7#4,*8#3,&8,#1*7#3,#3*4#3*1,#10*1,*1#7*3",",") ,_

split("11,*4#6*1,*2#8*1,*1#4*6,*1#3*7,#3*1#5*2,#10*1,#3*4#4,#3*5#3,&8,&8,*1#3*3#3*1,*1#9*1,*3#5*3",",") ,_

split("11,#11,&1,*7#4,*7#3*1,*6#4*1,*6#3*2,*5#3*3,*4#4*3,*4#3*4,*3#4*4,*3#3*5,*2#3*6,*1#4*6",",") ,_

split("11,*2#7*2,*1#9*1,#3*4#4,#3*5#3,#4*3#3*1,*1#8*2,&1,*1#3*1#5*1,&4,&4,#4*3#4,&2,*2#6*3",",") ,_

split("11,*3#5*3,*1#9*1,*1#3*3#3*1,#3*5#3,&4,&4,#4*4#3,*1#10,*2#5*1#3,*7#3*1,*6#4*1,*1#8*2,*1#6*4",",") _

)'Previous row must end with _



'#Renk Alanımız 

const BmpColorMap = "dffeff000c851700c0c0c0004d74de00e9dad100c9634d009cc9d600633d1f009600000078fcf500e1db92003132ac004763fe0033ffad00bcb9f10043480b00eceeee006c363600"



ColorMap = Array(_

split("00,01,01",",") ,_

split("02,03,03",",") ,_

split("04,05,05",",") ,_

split("06,07,07",",") ,_

split("08,09,09",",") ,_

split("0A,0B,0B",",") ,_

split("0C,0D,0D",",") ,_

split("00,05,05",",") ,_

split("0E,0F,0F",",") ,_

split("10,11,11",",") _

)'End ColorMap



'#Değişkenlerimiz otomatik olarak hesaplanıyor. Resim En Boy, Metin En boy Renkler ve yerleştirme.

dim ImageWidth, ImageHeight, arrTextWidth(), TextHeight, LeftMargin, arrTopMargin(), CursorPos

dim BmpEndLine, BColor, TColor, NColor

dim i, j, k, x, y



'#Manuel olarak belirleyebileceğimiz değerleri

'Arkadaşlar iptal etmek istediğimiz özelliği tek tırnak içine alabiliriz böylelikle pasifleşmiş olacak.



dim Bitmap(25,130) '[Height,Width]

const CodeLength = 5 'Güvenlik kodumuz kaç karakterden oluşmalı. [En Fazla 8 ayarlı.]

const CharTracking = 2 'Karakterler arası iz koyma.

const RndTopMargin = true 'Rasgele oluşturmak istiyoruz tabiki güvenlik kodumuzu.

const NoiseEffect = 2 '0[Hiç], 1[Normal], 2[Rasgele oluşturulmuş çizgiler], 3[Rasgele oluşturulmuş back çizgileri.], 4[Bu da 1 ve 3 karışımı en yuksek kademe.]

const NoiseLine = 8 'Low values make easy OCR, high values decrease readability

const MinLineLength = 6 'Çizgilerin maksimum uzunluğu.



'#Fonksiyonlarımız

function CreateGUID(valLength)

    const strValid = "ABCDEF1234567890"

    tmpGUID = vbNullString

    tmpChr = vbNullString

    Randomize(Timer)

    for cGUID=1 to valLength

        do 

            tmpChr = Mid(strValid, Int(Rnd(1) * Len(strValid)) + 1, 1)

        loop while CStr(tmpChr) = CStr(Right(tmpGUID,1))

        tmpGUID = tmpGUID & tmpChr

    Next

    CreateGUID = tmpGUID

end function



function RndInterval(valMin,valMax)

    Randomize(Timer)

    RndInterval = Int(((valMax - valMin + 1) * Rnd()) + valMin)

end function

'Şimdi resmimizin içine gelecek verileri döngüye sokuyoruz.

function GetCharMap(valChr)

    dim i, j

    j = 0

    for i=1 to UBound(FontMap(0))

        if CStr(FontMap(0)(i)) = CStr(valChr) then

            j = i

            exit for

        end if

    next



    if j > 0 then

        GetCharMap = FontMap(j)

    else

        GetCharMap = Array(0)

    end if

end function





sub WriteCanvas(byval valChr, byval valTopMargin)

    dim i, j, k, curPos, tmpChr, arrChrMap, strPixMap, drawPixel, pixRepeat



    'Güvenlik resmimizi buluyor.

    arrChrMap = GetCharMap(valChr)

    if UBound(arrChrMap) < 1 then

        exit sub

    end if



    'Şimdi karakterlerimizi yazdıralımi

    for i=1 to UBound(arrChrMap)

        'get pixel map active line

        strPixMap = arrChrMap(i)

        if Left(strPixMap,1) = "&" then

            j = Mid(strPixMap,2)

            if (IsNumeric(j) = true) then

                strPixMap = arrChrMap(CInt(j))

            else

                strPixMap = vbNullString

            end if

        end if

        strPixMap = Trim(strPixMap)



        'Pixellerini oluşturalım.

                curPos = CursorPos

        drawPixel = false

        pixRepeat = vbNullString

        for j=1 to Len(strPixMap)

            tmpChr = Mid(strPixMap,j,1)

            if (IsNumeric(tmpChr) = true) and (j < Len(strPixMap)) then

                pixRepeat = pixRepeat & tmpChr

            else

                'pixel kısmı bitiş.

                if IsNumeric(tmpChr) = true then

                    pixRepeat = pixRepeat & tmpChr

                end if



                'tekrar pixel çizdiriyoruz.

                if (drawPixel = true) and (IsNumeric(pixRepeat) = true) then

                    for k=1 to CInt(pixRepeat)

                        curPos = curPos + 1

                        Bitmap((valTopMargin + i),curPos) = TColor

                    next

                elseif IsNumeric(pixRepeat) = true then

                    curPos = curPos + CInt(pixRepeat)

                end if

                

                if tmpChr = "#" then

                    drawPixel = true

                else

                    drawPixel = false

                end if

                pixRepeat = vbNullString

            end if

        next

    next

end sub



sub PrepareBitmap(valSecureCode)

    dim i, j

    'resim boyutumuz

    ImageWidth = UBound(Bitmap,2)

    ImageHeight = UBound(Bitmap,1)



    'karakter ve metin genişlikleri.

    redim arrTextWidth(CodeLength)

    arrTextWidth(0) = 0

    for i=1 to CodeLength

        arrTextWidth(i) = CInt(GetCharMap(Mid(secureCode,i,1))(0))

        arrTextWidth(0) = arrTextWidth(0) + arrTextWidth(i)

    next

    arrTextWidth(0) = arrTextWidth(0) + ((CodeLength - 1) * CharTracking)



    'metin yüksekliği.

    TextHeight = CInt(FontMap(0)(0))



    'sol boşluğumuz.

    LeftMargin = Round((ImageWidth - arrTextWidth(0)) / 2)



    'tepe boşluğumuz.

    redim arrTopMargin(CodeLength)

    arrTopMargin(0) = Round((ImageHeight - TextHeight) / 2)

    if RndTopMargin = true then

        for i=1 to CodeLength

            arrTopMargin(i) = RndInterval(Int(arrTopMargin(0) / 2),(arrTopMargin(0) + Round(arrTopMargin(0) / 2)))

        next

    else

        for i=1 to CodeLength

            arrTopMargin(i) = arrTopMargin(0)

        next

    end if



    'renk seçimi kısmına geçelim.

    i = RndInterval(0,UBound(ColorMap))

    BColor = ColorMap(i)(0)

    NColor = ColorMap(i)(1)

    TColor = ColorMap(i)(2)



    'Background effect uyguluyoruz.

    if NoiseEffect = 3 then

        AddNoise()

    end if



    'Metnimizi yazalım.

    for i=1 to CodeLength

        'Yerleşim pozisyonunu hesaplatalım.

        CursorPos = 0

        for j=(i-1) to 1 step -1

            CursorPos = CursorPos + arrTextWidth(j) + CharTracking

        next

        CursorPos = LeftMargin + CursorPos



        'şimdi seçtiğimiz aktif karakterleri yazalım.

        WriteCanvas Mid(secureCode,i,1),arrTopMargin(i)

    next

end sub



sub DrawLine(x0, y0, x1, y1, valClr)

    

    dim m, b, dx, dy



    if (NoiseEffect = 4) and (Bitmap(y0,x0) = TColor) then

        clrNoise = vbNullString

    else

        clrNoise = valClr

    end if

    Bitmap(y0,x0) = clrNoise



    dx = x1 - x0

    dy = y1 - y0

    if Abs(dx) > Abs(dy) then

        m = (dy / dx)

        b = y0 - (m * x0)



        if dx < 0 then

            dx = -1

        else

            dx = 1

        end if



        do while x0 <> x1

            x0 = x0 + dx



            if (NoiseEffect = 4) and (Bitmap(Round((m * x0) + b),x0) = TColor) then

                clrNoise = vbNullString

            else

                clrNoise = valClr

            end if

            Bitmap(Round((m * x0) + b),x0) = clrNoise

        loop

    elseif dy <> 0 then

        m = (dx / dy)

        b = x0 - (m * y0)



        if dy < 0 then

            dy = -1

        else

            dy = 1

        end if



        do while y0 <> y1

            y0 = y0 + dy



            if (NoiseEffect = 4) and (Bitmap(y0,Round((m * y0) + b)) = TColor) then

                clrNoise = vbNullString

            else

                clrNoise = valClr

            end if

            Bitmap(y0,Round((m * y0) + b)) = clrNoise

        loop

    end if

end sub



sub AddNoise()

    dim median, i, j, x0, y0, x1, y1, dx, dy, dxy



    if NoiseEffect = 1 then

        clrNoise = vbNullString

    else

        clrNoise = NColor

    end if



    for i=1 to NoiseLine

        x0 = RndInterval(1,ImageWidth)

        y0 = RndInterval(1,ImageHeight)

        x1 = RndInterval(1,ImageWidth)

        y1 = RndInterval(1,ImageHeight)



        'Check minimum line length

        dx = Abs(x1 - x0)

        dy = Abs(y1 - y0)

        median = Round(Sqr((dx * dx) + (dy * dy))/2)

        if median < MinLineLength then

            dxy = MinLineLength - median



            if x1 < x0 then

                dx = -1

            else

                dx = 1

            end if



            if y1 < y0 then

                dy = -1

            else

                dy = 1

            end if



            for j=1 to dxy

                if ((x1 + dx) < 1) or ((x1 + dx) > ImageWidth) or ((y1 + dy) < 1) or ((y1 + dy) > ImageHeight) then

                    exit for

                end if

                x1 = x1 + dx

                y1 = y1 + dy

            next

        end if



        'Karakterler üzerindeki çizgileri yapalım.

        DrawLine x0,y0,x1,y1,clrNoise

    next

end sub



function FormatHex(byval valHex,byval fixByte,fixDrctn,valReverse)

    fixByte = fixByte * 2

    tmpLen = Len(valHex)

    if fixByte > tmpLen then

        tmpFixHex = String((fixByte - tmpLen),"0")

        if fixDrctn = 1 then

            valHex = valHex & tmpFixHex

        else

            valHex = tmpFixHex & valHex

        end if

    end if



    if valReverse = true then

        tmpHex = vbNullString

        for cFrmtHex=1 to Len(valHex) step 2

            tmpHex = Mid(valHex,cFrmtHex,2) & tmpHex

        next

        FormatHex = tmpHex

    else

        FormatHex = CStr(valHex)

    end if

end function



sub SendHex(valHex)

    for cHex = 1 to Len(valHex) step 2

        Response.BinaryWrite ChrB(CByte("&H" & Mid(valHex,cHex,2)))

    next

end sub



sub SendBitmap()

    if (ImageWidth mod 4) <> 0 then

        BmpEndLine = String((4-(ImageWidth mod 4))*2,"0")

    else

        BmpEndLine = vbNullString

    end if

    BmpInfoHeader = Array("28000000","00000000","00000000","0100","0800","00000000","00000000","120B0000","120B0000","00000000","00000000")

    BmpInfoHeader(1) = FormatHex(Hex(ImageWidth),4,0,true)

    BmpInfoHeader(2) = FormatHex(Hex(ImageHeight),4,0,true)

    BmpInfoHeader(6) = FormatHex(Hex((ImageHeight * ImageWidth) + (ImageHeight * (Len(BmpEndLine) / 2))),4,0,true)

    BmpInfoHeader(9) = FormatHex(Hex(Len(BmpColorMap)/8),4,0,true)

    BmpInfoHeader(10) = BmpInfoHeader(9)

    BmpHeader = Array("424D","00000000","0000","0000","00000000")

    BmpHeader(1) = FormatHex(Hex((Len(Join(BmpHeader,"")) / 2) + (Len(Join(BmpInfoHeader,"")) / 2) + (Len(BmpColorMap) / 2) + (ImageHeight * ImageWidth) + (ImageHeight * (Len(BmpEndLine) / 2))),4,0,true)

    BmpHeader(4) = FormatHex(Hex((Len(Join(BmpHeader,"")) / 2) + (Len(Join(BmpInfoHeader,"")) / 2) + (Len(BmpColorMap) / 2)),4,0,true)



    Response.Clear

    Response.Buffer = True

    Response.ContentType = "image/bmp"

    Response.AddHeader "Content-Disposition", "inline; filename=UTFIE.bmp"

    Response.CacheControl = "no-cache"

    Response.AddHeader "Pragma", "no-cache"

    Response.Expires = -1



    SendHex(Join(BmpHeader,""))

    SendHex(Join(BmpInfoHeader,""))

    SendHex(BmpColorMap)

    for y=ImageHeight to 1 step -1

        for x=1 to ImageWidth

            tmpHex = Bitmap(y,x)

            if tmpHex = vbNullString then

                SendHex(BColor)

            else

                SendHex(tmpHex)

            end if

        next

        SendHex(BmpEndLine)

    next

    Response.Flush

end sub

%>



<%

'#Güvenlik resmimiz oluşuyor.

secureCode = CreateGUID(CodeLength)

Session("UTFIE") = secureCode

PrepareBitmap(secureCode)

if (NoiseEffect > 0) and (NoiseEffect <> 3) then

    AddNoise()

end if

SendBitmap()

%>



Sıra ikinci sayfamızda yani oluşturduğumuz kodların çalıştırıldığı kısım.

Test.asp


<!--Önce bir session değişkeni atıyoruz. Ve doğrulamasını yaptırıyoruz. -->

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1254"%>

<%

Function CheckUTFIE(valUTFIE)

    SessionUTFIE = Trim(Session("UTFIE"))

    Session("UTFIE") = vbNullString

    if Len(SessionUTFIE) < 1 then

        CheckUTFIE = False

        exit function

    end if

    if CStr(SessionUTFIE) = CStr(valUTFIE) then

        CheckUTFIE = True

    else

        CheckUTFIE = False

    end if

End Function

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<!--Buradaki tanımlar için ASP ile Bir site yapalım dersinden bilgi alabilirsiniz. -->

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-9" />

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

<META HTTP-EQUIV="Expires" CONTENT="-1">

<title>Sanal Kurs Sitemizde Yorum Eklerken Girdiğiniz Güvenlik Kod Kısmını Düşünün.</title>

</head>



<body>

<form id="f_example" name="f_example" method="post" action="test.asp">

  <table width="350" height="187" border="1" align="center">

    <tr>

      <td width="152" height="32">Güvenlik Kodu</td>

      <td width="182"><img src="guvenlik.asp" alt="ASP Güvenlik Resmi" /></td>

    </tr>

    <!--Post methodu ile değerimizi gönderiyoruz. -->

<%

if Request.ServerVariables("REQUEST_METHOD") = "POST" then

    strUTFIE = Trim(Request.Form("strUTFIE"))

    if CheckUTFIE(strUTFIE) = true then

        %>

    <tr>

    <!--Girdiğimiz kodlar doğru ise form bilgilerimiz gönderilecek. -->

      <td height="37" colspan="2" align="center"><span style="color: #00CC00">

      <b>Eşlememiz doğru</b></span><b style="color:#00CC00"> [<%=strUTFIE%>]</b></td>

    </tr>        

        <%

    else

        %>

    <tr>

    <!--Değilse yeni bir veri oluşturcak gerekli alanın güvenliği için. -->

      <td height="37" colspan="2" align="center"><span style="color: #FF0000">

      <b>Yanlış değerler girildi.</b></span></td>

    </tr>

        <%

    end if 

end if

%>

    <tr>

      <td height="66">Lütfen resimdeki karakterleri giriniz.[Büyük-Küçük harf 

      duyarlıdır.]</td>

      <td>

      <input name="strUTFIE" type="text" id="strUTFIE" maxlength="8" size="20" /></td>

    </tr>

    <tr>

      <td height="37" colspan="2" align="center"><input type="submit" name="Submit" value="Gönder" /></td>

    </tr>

    <tr>

    <!--Sayfamızı işlemden sonra göndermek istediğimiz yeri belirleyebiliriz. -->

      <td height="37" colspan="2" align="center"><a href="Default.asp">Geri</a></td>

    </tr>

  </table>

</form>

</body>

</html>

  • Etiketler;
Mustafa Coşkun
1982 yılında Aksaray'da dünyaya geldi. İlk ve orta öğrenimini burada tamamladı. <p>2001 yılında Gaziantep Üniversitesi Yabancı Diller Bölümünde eğitime başladı. Şu anda İngilizce ve Almanca olarak sadece özel ders ve çeviri hizmeti sunuyor. <p>2005 yılında internet ve web programcılığına geçti. Bir çok şirket için freelancer & home-office olarak proje geliştirdi. Aynı şekilde bu şirketlerin danışmanlıklarını ve site dil uygulamalarını sağlıyor. <p>Bilgisayar ile olan alakası ortaokulda QBasic ile başladı. Sonra normal internet kullanıcısı olarak devam etti. Şu an ASP, ASP.net, C#.net dilleri ile proje geliştirmektedir. Ayrıca grafik olarak da aktif bir Photoshop kullanıcısıdır.
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Merak ettiğim bir konuydu. Teşekkürler.
abi bu asp ye merak saldım ben de öğrenmek ıstıyorum ancak bu kodların hepsi elle mi yazılıyor yoksa hazır kodları mı war ben de bılgısayar prg 2. sınıf ogrencısıyım de ksü de yardımınız için şimdiden tşkler
Evet elle yazıyorsun sadece bazı fonksiyonlar vardır hazır kullanabileceğin ama şu bir gerçektir artık kodları rahatlıkla yazmaya başlarsan arşiv olarak kopyala yapıştır şeklinde kullanabilirsin. Kolay olur yani ASP de mantıklı bir başlangıç. Başarılar...
Gerçekten harikasınız. Çok teşekkürler
MERHABA ösym nin kullandığı kodlar da mı böyle
Genel olarak mantık aynıdır. Ama her programcının yoğurt yiyişi farklıdır olayı bilirsin ;)
paylaşım için teşekkürler gerçekten iyi bir konu ve işime yarayacak diye düşünüyorum çünkü 3 ay süresince asp ile ilgilendim ve okuldaki proje ödevim için sınav otomasyon sistemi yazdım...proje ödevime fayda sağlayabilecek.teşekkürler
usta tşk en merak edtiğim konudu
peki bu örneği daha önce yaptığımız siteye nasıl aktarıcaz ?
[b][center]sdasasdsa[/center][/b]

Yukarı Git