PDA

View Full Version : آموزش: آموزش کامل تصاویر امنیتی به همراه پروژه



sasanrstm
پنج شنبه 11 مهر 1392, 22:52 عصر
سلام به همه دوستان برنامه نویس گرچه تایپکهای زیادی در این مورد در سایت هست حتی dll آماده اما چون تو سایت پخش شده ویه تایپک کامل وجود نداره این تایپک رو زدم امیدوارم دوستان ازش استقبال کنند.
برای شروع کار اول یه فایل generichandler به پروژه اضافه میکنیم با یه صفحه فایل هندلر رو باز میکنیم وکد زیر رو در آن مینویسیم

public void ProcessRequest(HttpContext context)
{
//ایجاد شیء گرافیک و دیگر ملزومات
Bitmap objBMP = new System.Drawing.Bitmap(60, 20);
Graphics objGraphics = System.Drawing.Graphics.FromImage(objBMP);
objGraphics.Clear(Color.Green);
objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

//تنظیم فونت نوشته روی عکس
Font objFont = new Font("Arial", 11, FontStyle.Bold);

//ساخت رشته تصادفی 5 رقمی
string randomStr = "";
Random autoRand = new Random();
randomStr = Convert.ToString(autoRand.Next(12345, 99999));

//اضافه کردن متن در جلسه
context.Session.Add("randomStr", randomStr);

//نوشتن متن
objGraphics.DrawString(randomStr, objFont, Brushes.White, 6, 3);

//تنظیم نوع عکس و برگرداندن آن به عنوان خروجی
context.Response.ContentType = "image/jpeg";
objBMP.Save(context.Response.OutputStream,System.D rawing.Imaging.ImageFormat.Gif);

//آزاد کردن منابع
objFont.Dispose();
objGraphics.Dispose();
objBMP.Dispose();
//►--------------------

}

public bool IsReusable {
get {
return false;
}


using هایی که باید استفاده بشه رو اضافه میکنیم در نهایت فایل هنلر باید به این شکل باشد


<%@ WebHandler Language="C#" Class="Captcha" %>
using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

public class Captcha : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
//ایجاد شیء گرافیک و دیگر ملزومات
Bitmap objBMP = new System.Drawing.Bitmap(60, 20);
Graphics objGraphics = System.Drawing.Graphics.FromImage(objBMP);
objGraphics.Clear(Color.Green);
objGraphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;

//تنظیم فونت نوشته روی عکس
Font objFont = new Font("Arial", 11, FontStyle.Bold);

//ساخت رشته تصادفی 5 رقمی
string randomStr = "";
Random autoRand = new Random();
randomStr = Convert.ToString(autoRand.Next(12345, 99999));

//اضافه کردن متن در جلسه
context.Session.Add("randomStr", randomStr);

//نوشتن متن
objGraphics.DrawString(randomStr, objFont, Brushes.White, 6, 3);

//تنظیم نوع عکس و برگرداندن آن به عنوان خروجی
context.Response.ContentType = "image/jpeg";
objBMP.Save(context.Response.OutputStream,System.D rawing.Imaging.ImageFormat.Gif);

//آزاد کردن منابع
objFont.Dispose();
objGraphics.Dispose();
objBMP.Dispose();
//►--------------------

}

public bool IsReusable {
get {
return false;
}
}

}

این کدی که بنده گذاشتم فقط عدد تولید میکند شما میتوانید حروف بزارید یا ترکیبی از عدد وحرف بستگی به سلیقه خودتون دارد

sasanrstm
پنج شنبه 11 مهر 1392, 22:58 عصر
حالا میریم سراغ استفاده از فایل هندلر یه صفحه به پروژه اضافه کنید با یه تکست ودگمه و و تگ ایمیج که آدرسش میشه همون فایل هنلر به این شکل


<body>
<form id="form1" runat="server">
<div>

<img alt="" src="Handler.ashx" width="150px" height="100px" id="cpt_img" />

<a href="javascript:reloadImg()">Refrash</a><br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>

sasanrstm
پنج شنبه 11 مهر 1392, 23:03 عصر
حالا میام قسمت کد نویسی ومیخوائیم از برناممون استفاده کنیم ولذت برنامه نویسی رو تجربه کنیم. رو دگمه کلیک میکنیم و کد زیر و در آن قرار میدیم


protected void Button1_Click(object sender, EventArgs e)
{
try
{
if (TextBox1.Text == Session["randomStr"].ToString())
{
Response.Redirect("Default2.aspx");
// Label1.Text = "State : OK Test";
}
else
{
Label1.Text = "State : Try Again";
}
}
catch { Label1.Text = "State : Session is Closed"; }
}


به اضافه using ها


using System.IO;
using System.Drawing;
using System.Text;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Security.Cryptography;

sasanrstm
پنج شنبه 11 مهر 1392, 23:14 عصر
کار نسبتا تمام شده وبرنامه ما در لوکال راحت اجرا میشه و حالا نوبت اینه که یه دگمه رفرش براش بزاریم و کاری کنیم که رو هاست هم کار کنه. اولا روهاست باید تو کنترل پنل هاست روی دامنه کلیک کنید وخاصیت خواندن ونوشتن بهش بدین read va rit)انگلیسیش یادم رفت
میائیم و یه تگ a میزاریم رو صفحه با یه کد جاوا اسکریپت که این کد باعث میشه خاصیت(چی بود یادم رفت) هاست رو قول بزنیم که دوباره فایل هندلر رو بار گذاری کنه
کد جاوا که باید در قسمت head صفحه بزاریم واونو به آیدی تگ ایمیچ نسبت دهیم

<script type="text/javascript">
function reloadImg() {
var obj = document.getElementById('cpt_img');
var src = obj.src;
var pos = src.indexOf('?');
if (pos >= 0) {
src = src.substr(0, pos);
}
var date = new Date();
obj.src = src + '?v=' + date.getTime();
}
</script>


و تگ a که باعث رفرش تصاویر میشه فانکشن تابع جاوارا به آدرس تگ a نسبت میدیم به این شگل


<img alt="" src="Handler.ashx" width="150px" height="100px" id="cpt_img" />

<a href="javascript:reloadImg()">Refrash</a><br />

در نهایت صفحه اچ تی امل شما باید به این شکل باشد


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!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 runat="server">
<title>Untitled Page</title>

<script type="text/javascript">
function reloadImg() {
var obj = document.getElementById('cpt_img');
var src = obj.src;
var pos = src.indexOf('?');
if (pos >= 0) {
src = src.substr(0, pos);
}
var date = new Date();
obj.src = src + '?v=' + date.getTime();
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>

<img alt="" src="Handler.ashx" width="150px" height="100px" id="cpt_img" />

<a href="javascript:reloadImg()">Refrash</a><br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br />
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
</div>
</form>
</body>
</html>

sasanrstm
پنج شنبه 11 مهر 1392, 23:29 عصر
اینم پرژه کامل این آموزش امیدوارم ازش استفاده کنید که خودم الان رو سایتم ازش دارم استفاده میکنم راستی به زودی چتروم سایتم هم افتححا میشه اگه خدا بخواد.111465

setareh2013
جمعه 12 مهر 1392, 00:24 صبح
با تشکر از شما
خیلی خوب بود .
فقط اگر حروف رو هم به زودی با این اعداد ترکیب کنید و یه کم حروف رو به هم ریخته و کج و بالاو پایین بگذارید ممنون میشم .

mohammad kafiyan
جمعه 12 مهر 1392, 01:28 صبح
function reloadImg() { var obj = document.getElementById('cpt_img'); var src = obj.src; var pos = src.indexOf('?'); if (pos >= 0) { src = src.substr(0, pos); } var date = new Date(); obj.src = src + '?v=' + date.getTime(); }

لطفا نحوه عملکرد تابع javascript را توضیح دهید

sasanrstm
جمعه 12 مهر 1392, 01:32 صبح
چشم اگه وقت کنم اما کدش آسونه خودتون هم بگردی پیدا میکنید فقط یه کمی دستکاری لازم داره تو فایل هندلر.

sasanrstm
جمعه 12 مهر 1392, 01:37 صبح
لطفا نحوه عملکرد تابع javascript را توضیح دهید
راستش اینکدو یکی از دوستان زحمت کشیدن و نوشتن اما کارش اینه که تاریخ سیستم رو قول میزنه یا عوض میکنه علت رفرش شدن کد امنیتی هم اینه چون بقول خودمون سات فکر میکنه که صفحه جدید داره لود میشه. زیاد تو جاوا حرفه ای نیستم فقط بلدم ازش استفاده کنم.

General-Xenon
جمعه 12 مهر 1392, 03:46 صبح
راستش اینکدو یکی از دوستان زحمت کشیدن و نوشتن اما کارش اینه که تاریخ سیستم رو قول میزنه یا عوض میکنه علت رفرش شدن کد امنیتی هم اینه چون بقول خودمون سات فکر میکنه که صفحه جدید داره لود میشه. زیاد تو جاوا حرفه ای نیستم فقط بلدم ازش استفاده کنم.
سلام وقت بخیر . روش به این صورت هست که شما از Generic Handler مورد نظرتون عکس مربوط به کد امنیتی رو دریافت میکنید ،اما بدلیل کش شدن عکس قبلی تابع به درستی سمت Client کار نمیکنه . پس برای اینکه بفهمونیم یک در خواست جدید از سمت کلاینت به سرور داده شده با یک Query غیر تکراری این عملیات رو تکرار میکنیم(مثلا عدد تصادفی یا تاریخ و ....) . در واقع هیچ ارتباطی با کد امنیتی شما نداره . موفق باشید

mohammad kafiyan
جمعه 12 مهر 1392, 19:45 عصر
اگر بخواهیم به صورت webuser control در بیاوریم و در ضمن به صورت ajax باشه که نیاز دارم refresh بشه ولی ajax به صورت jquery نه updatepanel????

General-Xenon
جمعه 12 مهر 1392, 22:10 عصر
اگر بخواهیم به صورت webuser control در بیاوریم و در ضمن به صورت ajax باشه که نیاز دارم refresh بشه ولی ajax به صورت jquery نه updatepanel????

مشکلی نیست . یکم تغییرات لازمه اما امکان پذیر هست