Merhabalar, alpha kardeş yeni bir mail atıp sorunu giderdigini anlatmış, sizde adım adım uygularsanız blogengine altyapısı kullanan blogunuza yorum ekleme kısmında captcha ( resim dogrulama) ile spam yorumlardan kurtula bilirsiniz.

Ben ciddi anlamda comment (yorum) kirliligi yaşıyorum.
Aşagıdaki adımları eksiksiz yaparsanız, bendeki gibi çalışan bir yapınız olur :

 1. Web.config den ajaz destegini açıyoruz

<pages enableSessionState="true" enableViewStateMac="true" enableEventValidation="true">

 2. Kök dizinde Image.aspx diye bir dosya oluşturuyoruz, içisi bu şekil :

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Image.aspx.cs" Inherits="Image" %>
     Kök dizinde yine Image.aspx.cs diye bir dosya yaratıyoruz, içisi :
using System;using System.Data;using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Drawing;using System.Drawing.Drawing2D;

public partial class Image : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

CreateCheckCodeImage(GenCode(4));

}

private string GenCode(int num)

{

string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E",

"F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

string code = "";

Random rd = new Random();

int i;for (i = 0; i < num; i++)

{

code += source[rd.Next(0, source.Length)];

}

return code;

}

private void CreateCheckCodeImage(string checkCode)

{

if (checkCode.Trim() == "" || checkCode == null)return;

Session["AlphaCaptchaCode"] = checkCode;System.Drawing.Bitmap image =

new System.Drawing.Bitmap((int)(checkCode.Length * 19), 22);Graphics g = Graphics.FromImage(image);

try{Random random = new Random();

g.Clear(Color.White);

int i;

for (i = 0; i < 25; i++)

{

int x1 = random.Next(image.Width);

int x2 = random.Next(image.Width);

int y1 = random.Next(image.Height);

int y2 = random.Next(image.Height);

g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);

}

Font font = new System.Drawing.Font("Arial", 14, (System.Drawing.FontStyle.Bold));

System.Drawing.Drawing2D.LinearGradientBrush brush =

new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);

g.DrawString(checkCode, font, brush, 4, 1);

g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

System.IO.MemoryStream ms = new System.IO.MemoryStream();

image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);

Response.ClearContent();Response.ContentType = "image/jpg";

Response.BinaryWrite(ms.ToArray());

}

catch

{

g.Dispose();

image.Dispose();

}

}

}

   3.1. Kök dizindeki /Users Control/ klasöründe bulunan CommenView.ascx i açıp, '<span class="bbcode" title="BBCode tags"><%=BBCodes() %></span>' yazan satırın üstüne aşagıdaki kodu ekleyip kaydedip geri yolluyoruz :

 <label for="<%=txtCaptcha.ClientID %>">Güvenlik *</label>

<img src="/Image.aspx" alt="Degistirmek için tıklayın" style="width: 82px; height: 23px" onclick="this.src=RefreshCaptcha(this.src)" />
<asp:TextBox runat="Server" ID="txtCaptcha" TabIndex="4" MaxLength="4" Width="60px" onblur="DoCheckCaptcha()"/><span id="CaptchaMsg"></span><asp:RequiredFieldValidator ID="RequiredFieldValidator4" runat="server" ControlToValidate="txtCaptcha" ErrorMessage="<%$Resources:labels, required %>" Display="dynamic" ValidationGroup="AddComment" /><br />

 

3.2. Birde sayfada ki 'Save' butonunu aşagıdaki kodla degiştiriyoruz :

<input type="button" id="btnSaveAjax" value="<%=Resources.labels.saveComment %>" onclick="if(Page_ClientValidate('AddComment')&&checkCaptchaResult){AddComment()}" tabindex="7" />

 

3.3. Ve  'lbCommentsDisabled' labelini buluyorsunuz sayfada, onun hemen üst satırına aşagıdaki kodu ekliyorsunuz :

 <script type="text/javascript">    

        function DoCheckCaptcha() {

            var code = document.getElementById("<%=txtCaptcha.ClientID %>").value;

            checkCaptcha(code);

        }

        var checkCaptchaResult=false;

        function ReceiveServerData(CheckResult) {

            document.getElementById("CaptchaMsg").innerHTML = "";

            if (CheckResult == 1) {

                checkCaptchaResult = true;

                document.getElementById("CaptchaMsg").innerHTML = "<font color=green>Captcha OK</font>";

            }

            else if (CheckResult == -1) {

                checkCaptchaResult = false;

                //document.getElementById("CaptchaMsg").innerHTML = "<font color=red>Captcha Error</font>";

            }

            else {

                checkCaptchaResult = false;

                document.getElementById("CaptchaMsg").innerHTML = "<font color=red>Captcha Error</font>";

            }

        }

        function RefreshCaptcha(url) {

            if (url.toString().indexOf("?",0) > 0) {

                url = url.toString().substring(0, url.toString().indexOf("?", 0)) + "?" + new Date().toUTCString();

            }

            else{

                url = url.toString() + "?" + new Date().toUTCString();

            }

            return url;            

        }

    </script>

4.1.  Neredeyse bitti, son olarak CommentView.ascx.cs de RaiseCallbackEvent, foksiyonunu buluyorsunuz o fonksiyonun en üstüne aşagıdaki kodu ekliyorsunuz :

 if (eventArgument.Length < 1)

  {

      _Callback = "-1";

      return;

  }

  if (eventArgument.LastIndexOf("-|-") < 0)

  {

      string img = Session["AlphaCaptchaCode"].ToString().ToLower(); ;

      if (eventArgument.ToLower().Equals(img))

      {

          _Callback = "1";

      }

      else

      {

          _Callback = "0";

      }            

      return;

  }

4.2. Sayfadaki Page_Load, methodunu buluyorsunuz '//InititializeCaptcha();' satırını hemen altına :

string cbReference = Page.ClientScript.GetCallbackEventReference(this, "CheckResult", "ReceiveServerData", "");
string callbackScript = "function checkCaptcha(CheckResult){" + cbReference + ";}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "checkCaptcha", callbackScript, true);
 

 

İşte bu kadar arkadaşlar, hepinize kolay gelsin, alpha ya teşekkürler.