نوشته های من !

راجع به تجربه های شخصی از دنیای برنامه نویسی می نویسم، یا از روزمرگی هام …
استفاده از تکنیک HONEYPOT ( جایگزینی برای CAPTCHA )
نویسنده:
۱۷ بهمن ۹۳

تصویر کپچا

بعد از خوندن مطلب “وقت کاربر ها رو تلف نکنیم!” ( نوشته شده توسط Paul Boag و ترجمه دوست عزیزم، خانم ریحانی ) با یک روش برای مقابله با اسپم آشنا شدم به اسم Honeypot. ( که ترجمه‌ای براش به ذهنم نمیرسه، به نظرم بعضی کلمه‌ها بهتره ترجمه نشن اصلا )

HONEYPOT چیست ؟

این روش در عین سادگی باعث میشه تعداد اسپم‌های سایت شما بسیار کم بشه( براساس نظر افرادی که از این روش استفاده کردن میگن حدود ۹۹٪ اسپم‌ها تشخیص داده میشن ). مزیت عمده این روش، بر خلاف کپچا، این هست که کاربران سایت مجبور به اثبات هویت خودشون نیستن، از سوال‌های خسته کننده و درخواست از کاربر برای وارد کردن حروف و .. خبری نیست. همچنین استفاده از این روش ( در این وضعیتی که اکثر سایت‌های ایرانی برای ابتدایی ترین کارها، کاربرها رو مجبور به وارد کردن کپچا میکنن ) باعث بهبود تجربه کاربری سایت شما میشه.

روش استفاده

روش کار ربات‌هایی که اسپم ارسال میکنند به این صورت هست که با خواندن سورس کد‌های سایت و پیدا تگ‌های <form> و <input> و .. اقدام به پر کردن فیلد‌های فرم میکنند، در واقع ربات‌ها هیچ درکی از این فیلدها ندارن و تمام فیلدها را پر میکنند.

در روش ‌HONEYPOT، ما در فرم مورد نظر یک فیلد ( با یک نام ترجیحا واقعی مثل remail یا gender ) ایجاد میکنیم، اما با استفاده از CSS این فیلد رو از دید کاربر مخفی میکنیم، سپس در سمت سرور فیلد مورد نظر را چک میکنیم، اگر این فیلد دارای مقدار بود پس قطعا ما با ربات طرف هستیم. ( زیرا کاربرها توانایی مشاهده فیلد مورد نظر را نداشته چه برسد به پر کردن، پس این فیلد باید همیشه خالی باشد. )

طرز پیاده سازی

در زیر مثالی از فرم تماس با ما میبینید، ایتدا فایل HTML.

<form method="post">
 <p>
   <label for="name">نام</label>
   <input name="name" type="text" id="name">
 </p>
 <p>
   <label for="mail">پست الکترونیکی</label>
   <input name="mail" type="text" id="maile">
 </p>
 <p>
   <label for="text">پیام</label>
   <textarea name="text" id="text"></textarea>
 </p>
 <p class="remail">
   <label for="remail">
     اگر این فیلد را میبینید آنرا خالی بگذارید
   </label>
   <input name="remail" type="text">
 </p>
 <p>
   <input type="submit">
 </p>
</form>

سپس برای مخفی سازی فیلد مورد نظر، در CSS سایت خود کد زیر را قرار دهید.

.remail {display: none;}

و در نهایت، در سمت سرور، با استفاده از کد PHP زیر اعتبار سنجی انجام میدهیم.

$remail = $_POST['remail'];

if ($remail){
	echo "اعتبار سنجی ناموفق.";
	exit();
}
افزایش کارایی

برای افزایش کارایی این روش می توانیم از چک کردن زمان استفاده کنیم، در این روش، ما چک میکنیم که اگر فاصله زمانی باز شدن صفحه، تا ارسال فرم ( برای مثال ) زیر ۵ ثانیه بود، فرم مورد نظر توسط ربات ارسال شده است. برای پیاده سازی این روش زمان بارگذاری صفحه را با زمان ارسال فرم مقایسه میکنیم، برای مثال کدهای زیر را مشاهده کنید.

کد HTML.

<input name="pageLoad" type="hidden" value="<?php echo time();?>" />

و در سمت سرور با استفاده از کد زیر اختلاف زمانی را مشخص میکنیم.

$pageLoad = $_POST["pageLoad"];

$totalLoadTime = time() - $pageLoad;

if($totalLoadTime < 5) {
    echo "اعتبار سنجی ناموفق";
    exit();
}
نتیجه

با استفاده از ترکیب این دو روش شما می‌توانید تعداد اسپم‌های سایت خود را به نزدیک صفر برسانید و تجربه کاربری سایت خود را افزایش دهید.

10 پیام برای استفاده از تکنیک HONEYPOT ( جایگزینی برای CAPTCHA )

  1. سینا گفت:

    سلام
    ممکنه ربات جوری نوشته شده باشه که فقط فیلدهای خاص مثلا فیلدهایی با نام username و password رو پر کنه که بر اساس سایت هدف میشه تغییرش داد 🙂

    • علا عالم فلکی گفت:

      با سلام،
      اگر قرار باشه شخصی یک ربات برای یک سایت هدف طراحی کنه دیگه کپچا هم معنی نداره، کپچا هم تا زمانی امن هست که سایت اسپمر شخصی نداشته باشه.
      هم کپچا و هم HONEYPOT برای پیشگیری ربات‌های عمومی هستند، نه ربات‌هایی با هدف خاص.

  2. کپچا برای جلوگیری از روبات های اختصاصی هم کارایی داره و معمولا حداقل کاری که میکنه اینه که توانایی ارسال کاملا خودکار رو پرهزینه تر و کندتر میکنه، و در بیشتر موارد ارسال خودکار رو جلوگیری میکنه چون برای طرفها صرف نمیکنه دنبال راهش برن. مگر اینکه یکی تخصص و توان و انگیزش رو داشته باشه و برنامهء کرک کپچا رو هم بنویسه یا به هر نحوی بدست بیاره و در برنامش بذاره که اونوقت میتونه با سرعت و راحتی بیشتری ارسال کنه. بهرحال اینجا بحث افزایش هزینه و هرچه دشوارتر کردن استفاده از روبات و ارسال اسپم هست که بنظرم کپچا با همین کار در سایتهای معمولی جلوی 99% موارد رو میگیره، ولی اگر سایت و هدفی واقعا ارزشش رو داشته باشه و بطور خاص توسط موجودیت های حرفه ای هدف گرفته بشه اونوقت کار سخت میشه!
    این متد honey pot و چک کردن زمان هم که گفتی جالب بود، گرچه بنظرم هردو قابل دور زدن هستن و جلوی حمله های سفارشی رو نمیگیرن. شاید بعدا این روشها رو در پروژهء خودم بذارم؛ فکر کنم به قدری مفید باشه که صرف کنه!

    • علا عالم فلکی گفت:

      خب البته به نظر من هم هیچ‌کودوم از این روش‌ها کارایی صد در صد ندارن و حتما قابل دور زدن هستن. اگرم که ربات سفارشی باشه که دیگه بدتر.
      ولی من این مقاله رو بیشتر با هدف رسیدن به تجربه کاربری بهتر نوشتم، به نظر من این کپچاها خیلی رو اعصاب هستن و وقت کاربرا خیلی با ارزش‌تر از این هست که درگیر این مراحل بشن. حتما باید یه راه بهتری باشه، حالا الزاما منظورم honeypot نیست، ولی حتما یه راه بهتری هست.

  3. سلام
    به نظر بنده در حال حاضر بهترین راه مبارزه با روبات ها، استفاده از recaptcha گوگل هست، کاربری فوق العاده ساده و امنیت بسیار بالا، به قول خودش:
    Easy on Humans, Hard on Bots
    اینم لینکش:
    https://www.google.com/recaptcha/intro/index.html
    موفق باشید

    • علا عالم فلکی گفت:

      با سلام،
      بعله، راه حل برای این مسئله زیاد هست و من هم صرفا یک راهی رو بیان کردم که شاید از نظر تجربه کاربری راه حل بهتری باشه.
      ممنون، شما هم موفق باشین.

  4. mortaza7khat گفت:

    honeypot=ظرف(یا دیگ) عسل!
    جالب بود

    • علا عالم فلکی گفت:

      با سلام،
      ترجمه‌ای که شما نوشتی کلمه به کلمه هست، من فک می‌کنم این یک اصطلاح هست برای دوستان انگلیسی زبان، به معنی تله گذاشتن.

  5. reza گفت:

    کپچاهای تصویری (عکس) توسط نیروی انسانی سایت 2captcha
    قابل شکسته شدن هستن
    خیلی راحت لینک عکس رو میگیری میفرستی براشون و اونها هم زیر ده ثانیه میخونن جواب میدن 🙂
    هیچ کپچایی از دستشون در نمیره 95 درصدشو صحیح مینویسن

    البته چون خارجی هستن کپچاهای عددی فارسی رو نمیتونن بخونن :))))))

    اینو صرفا جهت اطلاع گفتم
    روش شما هم جالب بود

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *