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.