در HTML یک فروشگاه اینترنتی پیوندی هست که هرگز در صفحه دیده نمیشود: با display: none پنهان شده، متنی ندارد و به /product/special-offer-7781 اشاره میکند. هیچ انسانی که صفحه را در مرورگر میبیند این پیوند را نمیبیند و روی آن نمیزند. اما اسکرپری که همه تگهای <a href> صفحه را جمع میکند و به نوبت بازدید میکند، آن را مییابد و باز میکند. در همان لحظه سایت با اطمینان میداند این بازدید از انسان نیامده است. این پیوند یک تله هانیپات است.
در این نوشته توضیح میدهیم اصطلاح هانیپات در امنیت و در وب اسکرپینگ چه معنایی دارد، تلههای پیوند پنهان و فرم چگونه کار میکنند، بر سر اسکرپری که در آنها بیفتد چه میآید و چرا اسکرپرها در آنها میافتند. چارچوب از ابتدا روشن است: هدف «دور زدن» هانیپات نیست، بلکه دنبال نکردن مسیرهایی است که سایت نمیخواهد بازدید شوند. خزندهای که قواعد را رعایت کند و دامنهاش را محدود نگه دارد از قبل از این تلهها دور است؛ چگونگی آن را با نمونهای در Playwright نشان میدهیم.
هانیپات چیست؟
اصطلاح «هانیپات» از امنیت اطلاعات آمده است. هانیپاتی که تیمهای امنیتی به کار میبرند سامانهای است که عمداً برای جذب مهاجمان راهاندازی شده و کارکرد واقعی ندارد: سروری که بیمحافظ به نظر میرسد، پایگاه داده جعلی یا حساب کاربری که هرگز استفاده نمیشود. کاربر مشروع دلیلی برای دسترسی به چنین سامانهای ندارد، پس هر دسترسی مشکوک است و درباره روشهای مهاجم اطلاعات میدهد.
هانیپات در وب اسکرپینگ همین فکر را در مقیاس یک صفحه وب به کار میبرد:
| ویژگی | هانیپات امنیتی | هانیپات اسکرپینگ |
|---|---|---|
| چه کسی را هدف میگیرد؟ | مهاجمانی که میکوشند به شبکه نفوذ کنند | خزندههای خودکار و رباتهای فرم |
| شکل | سرور، سرویس یا حساب جعلی | پیوند پنهان، فیلد پنهان فرم، صفحه تله |
| منطق تشخیص | کاربر مشروع هرگز به سامانه دسترسی نمییابد | انسان هرگز پیوند را نمیبیند و روی آن نمیزند |
| نتیجه | ردگیری مهاجم، هشدار | علامتگذاری IP یا نشست، مسدودسازی، داده جعلی |
| چه کسی راه میاندازد؟ | تیمهای امنیتی | صاحبان سایت، سرویسهای مدیریت ربات |
هانیپات یکی از روشهای دفاعی در برابر حملههای خودکاری مانند اسکرپینگ، ساخت حساب و هرزنامه است که OWASP در پروژه Automated Threats to Web Applications دستهبندی کرده است. قدرت این دفاعها در ارزان بودنشان است: یک سطر HTML تشخیص ربات با اطمینان بالا میدهد.
تلههای پیوند پنهان چگونه کار میکنند؟
تله پیوند پنهان در چهار گام کار میکند:
- سایت پیوندی در صفحه میگذارد و آن را از بازدیدکنندگان انسانی پنهان میکند.
- آدرس پیوند در هیچ جای دیگری به کار نمیرود. معمولاً در robots.txt هم بسته شده تا رباتهای موتور جستوجویی که قواعد را رعایت میکنند هم به آنجا نروند.
- اسکرپری که همه پیوندهای صفحه را جمع میکند این آدرس را به فهرستش میافزاید و بازدید میکند.
- سایت درخواست به این آدرس را ثبت میکند و آدرس IP، نشست یا اثر انگشت مرورگری را که آن را فرستاده ربات علامت میزند.
روشهای رایج پنهان کردن پیوند:
display: none: عنصر هیچ جایی در صفحه نمیگیرد.visibility: hidden: عنصر جا میگیرد اما دیده نمیشود.- اندازه صفر: پهنا و ارتفاع صفر، بدون متن.
opacity: 0: کاملاً شفاف.- جایگیری بیرون از صفحه:
position: absolute; left: -9999px. - همرنگ با پسزمینه: متن سفید روی پسزمینه سفید.
- پنهان پشت عنصری دیگر: پیوندی که با
z-indexپوشانده شده است.
چون برخی از این روشها ممکن است بر بازدیدکنندگانی که صفحهخوان به کار میبرند هم اثر بگذارند، سایتهای دقیق ویژگیهایی مانند aria-hidden="true" و tabindex="-1" را به پیوندهای تله میافزایند تا کاربران صفحهکلید و فناوریهای کمکی هم به آنها نرسند.
هانیپات در فرمها
هانیپات فرم رایجترین روش در برابر رباتهای هرزنامه است. فیلدی که انسان نمیتواند ببیند به فرم تماس، نظر یا ثبتنام افزوده میشود:
<form action="/contact" method="post">
<input type="text" name="name">
<input type="email" name="email">
<!-- Humans don't see this field; if it arrives filled in, the submission is rejected -->
<input type="text" name="website" class="hidden" tabindex="-1" autocomplete="off">
<button type="submit">Send</button>
</form>انسانی که فرم را پر میکند فیلد website را نمیبیند و خالی میگذارد. رباتی که همه فیلدهای صفحه را خودکار پر میکند آنجا هم مقداری مینویسد. وقتی فیلد پرشده برسد، سرور ارسال را بیصدا رد میکند یا آدرس IP فرستنده را علامت میزند.
برخی فرمها بررسی زمانی هم میافزایند: ارسالهایی که چند ثانیه پس از باز شدن صفحه فرم میرسند مشکوک دانسته میشوند، با این فرض که انسان نمیتواند در آن مدت فرم را بخواند و پر کند.
برای اسکرپینگ نتیجه روشن است: اسکرپری که داده جمع میکند معمولاً دلیلی برای پر کردن فرم ندارد. اسکریپتی که فرمها را خودکار ارسال کند دقیقاً مانند ربات هرزنامه رفتار میکند.
صفحههای تله و هزارتوها
هانیپات همیشه یک پیوند نیست. برخی دفاعها هم ربات را تشخیص میدهند و هم با کشاندن آن به صفحههای بیپایان منابعش را هدر میدهند:
- مسیرهایی که صفحه بیپایان میسازند: صفحههای تقویم، فیلتر یا جستوجو که در هر بازدید پیوندهای تازه تولید میکنند. حتی اگر تله عمدی نباشند، خزنده بدون سقف عمق را به حلقه بیپایان میفرستند.
- هزارتوهای محتوای تولیدشده: در قابلیت AI Labyrinth که Cloudflare در 2025 اعلام کرد، رباتهایی که دستورهای منع خزش را نادیده میگیرند به صفحههای پیوندداری که با هوش مصنوعی تولید شدهاند فرستاده میشوند. بر اساس این اعلام، این صفحهها همچون هانیپات نسل تازه هم عمل میکنند: هیچ انسانی در هزارتویی از محتوای بیمعنا چهار پیوند پیش نمیرود، پس بازدیدکنندهای که تا آنجا برسد به احتمال زیاد ربات است.
- داده جعلی: رباتی که شناسایی شده بهجای قیمتهای واقعی مقدارهای تغییریافته، محصولات ناموجود یا نتایج خالی میگیرد. اسکرپر خطایی نمیگیرد، اما دادهای که جمع میکند غیرقابلاعتماد میشود.
داده جعلی خطرناکترین پیامد است، چون متوجه شدنش دشوار است. ممکن است اسکرپر ماهها کار کند و گزارشهایی با قیمتهای نادرست بسازد.
اگر در هانیپات بیفتید چه میشود؟
سامانه مدیریت ربات سایت درخواست به آدرس تله را نشانهای قوی میداند. آنچه پس از آن رخ میدهد از سایتی به سایت دیگر متفاوت است:
- آدرس IP مسدود میشود: همه درخواستهای همان آدرس
403میگیرند. - نشست علامت میخورد: کوکی یا توکن نشست ربات برچسب میخورد؛ حتی اگر IP عوض شود نشست شناخته میشود.
- اثر انگشت ثبت میشود: ویژگیهای مرورگر یا کلاینت ذخیره میشود و همان اثر انگشت از IPهای دیگر هم مشکوک دانسته میشود. شیوه ساخته شدن اثر انگشت را در اثر انگشت مرورگر توضیح دادهایم.
- صفحههای بررسی: در درخواستهای بعدی صفحه بررسی نمایش داده میشود.
- داده جعلی یا پاسخ خالی: اسکرپر به کار ادامه میدهد اما داده نادرست جمع میکند.
- فهرستهای شهرت مشترک: سرویسهای مدیریت ربات ممکن است منبعهایی را که در یک سایت شناسایی شدهاند در سایتهای مشتریان دیگرشان هم در نظر بگیرند.
برخی از این پیامدها ممکن است نه فقط اسکرپر، بلکه کاربران دیگر همان آدرس IP را هم متأثر کنند. این نکتهای است که با آدرسهای IP مشترک باید در نظر داشت.
چرا اسکرپر شما در آنها میافتد؟
هانیپاتها رفتار مشخصی را هدف میگیرند و آن رفتار معمولاً از یک اشتباه طراحی میآید:
- منطق «همه پیوندها را دنبال کن». افزودن همه تگهای
<a href>صفحه به صف بدون بررسی قابلدیدن بودن. - خزش بیدامنه. وارد شدن به همه مسیرهای سایت در حالی که فقط صفحههای محصول لازم است.
- نخواندن robots.txt. آدرسهای تله اغلب در robots.txt بستهاند؛ خزندهای که از فایل پیروی کند هرگز به آنجا نمیرود.
- دنبال کردن پیوندهای
rel="nofollow". پیوندهایی که سایت صراحتاً گفته دنبال نشوند. - نبودن سقف عمق و تعداد صفحه. خزنده در مسیرهایی که صفحه بیپایان میسازند متوقف نمیشود.
- پر کردن خودکار فرمها. نوشتن مقدار در همه فیلدها، حتی فیلدهای پنهان.
- بازدید پیاپی یک آدرس با پارامترهای گوناگون. هزاران آدرس ساختهشده از ترکیب فیلتر و مرتبسازی.
خزنده مشروع چگونه از هانیپات دور میماند؟
قاعدههای زیر برای «دور زدن» هانیپات نیستند؛ برای ایناند که مسیرهایی را که سایت نمیخواهد دنبال نکنید. طراحی خزنده به این شیوه، دوری از تلهها را همچون اثر جانبی به همراه دارد.
- از robots.txt پیروی کنید. پیش از خزش فایل سایت را بخوانید و مسیرهای بسته را به صف نیفزایید. شیوه خواندن آن را در فایل robots.txt چیست و چگونه آن را بخوانیم؟ توضیح دادهایم.
- دامنه را با الگوی URL محدود کنید. اگر فقط داده محصول لازم دارید، فقط آدرسهایی را که با
/product/آغاز میشوند دنبال کنید. - در صورت امکان بهجای جمع کردن پیوند از نقشه سایت استفاده کنید.
sitemap.xmlآدرسهایی را فهرست میکند که سایت میخواهد خزیده شوند. - پیوندهای قابلدیدن را دنبال کنید. اگر مرورگر به کار میبرید، پیوندهایی را که کاربر نمیبیند به صف نیفزایید.
- از پیوندهای
rel="nofollow"بگذرید. - سقف عمق، تعداد صفحه و تکرار بگذارید. گونههای پارامتری یک مسیر را یکسانسازی کنید.
- برای جمعآوری داده فرم ارسال نکنید. اگر ارسال فرم واقعاً لازم است (برای نمونه ورود به حساب خودتان)، فقط فیلدهایی را که میشناسید پر کنید.
- سرعت خود را محدود کنید. تلهها بیشتر رباتهایی را میگیرند که سریع و گسترده میخزند.
در خودکارسازی مرورگر، بررسی «پیوند قابلدیدن» میتواند چنین باشد:
from urllib.parse import urljoin, urlsplit
from playwright.sync_api import sync_playwright
def visible_links(page, base, allowed_prefix="/product/"):
addresses = set()
for link in page.locator("a[href]").all():
href = link.get_attribute("href")
rel = (link.get_attribute("rel") or "").lower()
if not href or "nofollow" in rel or not link.is_visible():
continue
url = urljoin(base, href)
parts = urlsplit(url)
if parts.netloc != urlsplit(base).netloc or not parts.path.startswith(allowed_prefix):
continue
addresses.add(url)
return sorted(addresses)
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com/deals")
for address in visible_links(page, "https://example.com"):
print(address) # also check robots.txt before queuing
browser.close()این تابع چهار فیلتر اعمال میکند: از پیوندهای nofollow میگذرد، از پیوندهای قابلدیدننبودن میگذرد، از پیوندهای دامنههای دیگر میگذرد و فقط پیوندهای منطبق با پیشوند آدرس مجاز را برمیدارد.
باید مرزهای بررسی قابلدیدن بودن را بدانید. تابع is_visible() در Playwright عنصرهای دارای display: none، visibility: hidden و اندازه صفر را قابلدیدن نمیداند. اما عنصرهایی که با روشهایی مانند opacity: 0، جایگیری بیرون از صفحه یا همرنگی با پسزمینه پنهان شدهاند ممکن است از این بررسی قابلدیدن بگذرند. پس بررسی قابلدیدن بودن بهتنها تضمین نیست؛ محافظت واقعی پیروی از robots.txt و محدود کردن خزش به الگوهای URL لازم است. تقریباً همه پیوندهای تله بیرون از این دو قاعده قرار میگیرند.
اسکرپری که بدون مرورگر با کلاینت HTTP کار میکند نمیتواند قابلدیدن بودن را مستقیم بسنجد؛ برای آن الگوهای URL، robots.txt و قواعد نقشه سایت اهمیت بیشتری دارند.
انواع هانیپات
| نوع | سازوکار | چه کسی را میگیرد؟ | خزنده مشروع چگونه دور میماند؟ |
|---|---|---|---|
| پیوند پنهانشده با CSS | پیوندی که انسان نمیبیند و اغلب در robots.txt بسته است | رباتهایی که همه پیوندها را دنبال میکنند | robots.txt، الگوی URL، بررسی قابلدیدن بودن |
| فیلد پنهان فرم | اگر فیلدی که باید خالی بماند پر برسد رد میشود | رباتهای فرمی که همه فیلدها را پر میکنند | ارسال نکردن فرم هنگام جمعآوری داده |
| بررسی زمانی | فرمهایی که بیش از حد سریع ارسال شوند مشکوکاند | رباتهایی که بیدرنگ ارسال میکنند | ارسال نکردن فرم |
| مسیر صفحههای بیپایان | صفحههایی که در هر بازدید پیوند تازه میسازند | خزندههای بدون سقف عمق | سقف عمق و صفحه، یکسانسازی پارامتر |
| هزارتوی محتوای تولیدشده | صفحههای تولیدشده برای رباتهایی که دستور منع خزش را نادیده میگیرند | رباتهایی که از robots.txt پیروی نمیکنند | پیروی از robots.txt |
| داده جعلی | محتوای تغییریافته برای رباتهای شناساییشده | IP یا نشستهای علامتخورده | علامت نخوردن؛ تأیید داده با نمونهبرداری |
کاربردها
- خزنده در مقیاس بزرگ: کش robots.txt برای هر سایت، فهرست مجاز الگوهای URL، سقف عمق و کشف با اولویت نقشه سایت. بخش مقیاسپذیری در صفحه راهحل وب کراولر آمده است.
- خزش برای حفاظت از برند: خزشهایی که برای یافتن سایتهای فروشنده کالای تقلبی انجام میشوند، دامنه را به صفحههای محصول مربوط محدود نگه میدارند؛ رفتار در چارچوب قواعد برای گردآوری مدرک بدون فعال کردن دفاعهای سایت خزیدهشده ضروری است. ساختار آن در صفحه راهحل حفاظت از برند آمده است.
- تشخیص ربات در جایگاه صاحب سایت: هانیپات فرم در سایت خودتان و پیوند تلهای که در robots.txt بسته شده، راههای ارزانی برای تشخیص زودهنگام خودکارسازی مخرباند. بخش حفاظت از داده در صفحه راهحل امنیت داده آمده است.
- بررسی کیفیت داده: بررسی دستی و منظم نمونهای از قیمتهای جمعشده در مرورگر نشان میدهد داده جعلی ارائه میشود یا نه.
اشتباهات رایج
- دیدن هانیپات همچون مانع فنی برای دور زدن. تله نشانه ترجیح آشکار سایت است؛ مشکل واقعی خزش بیدامنه است.
- تکیه فقط بر بررسی قابلدیدن بودن. عنصرهای شفاف یا بیرون از صفحه ممکن است از آن بگذرند.
- خواندن robots.txt فقط یک بار در آغاز. در خزشهای طولانی فایل ممکن است تغییر کند؛ برای هر سایت در بازههایی آن را تازه کنید.
- در نظر نگرفتن داده جعلی. خطا نگرفتن به معنای گرفتن داده درست نیست.
- ارسال فرم «محض احتیاط». جمعآوری داده تقریباً هرگز به ارسال فرم نیاز ندارد.
- آدرس جداگانه دانستن گونههای پارامتری. صفحههای فیلتری که ترکیبهای بیپایان میسازند خزنده را به تله میکشانند.
خطاهای دیگر در سرعت، هدر و IP را در وب اسکرپینگ بدون مسدود شدن گرد آوردهایم.
راهنمای انتخاب
| وضعیت شما | پیشنهاد |
|---|---|
| فقط برخی گونههای صفحه لازم است | فهرست مجاز الگوهای URL، نقشه سایت |
| گسترده میخزید | robots.txt، سقف عمق، یکسانسازی پارامتر |
| خودکارسازی مرورگر به کار میبرید | پیوندهای قابلدیدن و بدون nofollow همراه robots.txt |
| کلاینت HTTP به کار میبرید | الگوهای URL و robots.txt (قابلدیدن بودن سنجشپذیر نیست) |
| باید فرمی پر شود | فقط فیلدهای شناختهشده؛ برای جمعآوری داده فرم ارسال نکنید |
| به درستی داده شک دارید | نمونهای بردارید و دستی در مرورگر تأیید کنید |
| میخواهید از سایت خودتان محافظت کنید | هانیپات فرم همراه پیوند تله بستهشده در robots.txt |
پرسشهای متداول
آیا استفاده سایتها از هانیپات قانونی است؟
معمولاً بله؛ افزودن پیوند یا فیلدی که بازدیدکنندگان نمیبینند به صفحه خود سایت یک روش دفاعی است. اما محتوای تله نباید گمراهکننده باشد یا دسترسپذیری را خراب کند و داده شخصی که در این میان جمع میشود تابع قانونهای مربوط است.
اسکرپر من از کجا بفهمد در هانیپات افتاده است؟
مستقیم نمیفهمد؛ آدرس تله ممکن است مانند صفحهای عادی پاسخ دهد. نشانهها غیرمستقیماند: پاسخهای 403 که کمی بعد آغاز میشوند، صفحههای بررسی، دادهای که ناگهان تغییر میکند یا ناسازگار میشود. در لاگهای خزش به دنبال درخواستهایی به آدرسهای بسته در robots.txt یا آدرسهایی که انتظارشان را نداشتید باشید.
آیا عوض کردن IP مسدودسازی پس از هانیپات را برمیدارد؟
وقتی مسدودسازی فقط به IP بسته باشد ممکن است موقتاً کمک کند، اما رفتار خزشی را که مشکل را ساخته تغییر نمیدهد. وقتی علامتگذاری بر پایه نشست یا اثر انگشت باشد اصلاً کمک نمیکند. راهحل درست اصلاح دامنه خزنده و پایبندی آن به قواعد است.
چرا رباتهای موتور جستوجو در هانیپات نمیافتند؟
رباتهای مشروع موتور جستوجو از robots.txt پیروی میکنند و به نشانههایی مانند nofollow احترام میگذارند. صاحبان سایت معمولاً آدرسهای تله را در robots.txt میبندند، پس این رباتها هرگز به آنجا نمیروند. همین منطق برای هر خزندهای که قواعد را رعایت کند صادق است.
تفاوت هانیپات و CAPTCHA چیست؟
CAPTCHA صراحتاً از بازدیدکننده تأیید میخواهد و کاربران انسانی را هم متأثر میکند. هانیپات دیده نمیشود؛ کاربران انسانی چیزی متوجه نمیشوند و فقط کسانی که رفتار خودکار مشخصی دارند در تله میافتند.
آیا به سایت خودم هانیپات بیفزایم؟
روش فیلد پنهان در فرمهای تماس و نظر راهی کمهزینه برای کاهش هرزنامه است و بر تجربه کاربر اثری ندارد. هنگام افزودن پیوندهای تله پنهان، بستن آدرس تله در robots.txt را فراموش نکنید؛ در غیر این صورت ممکن است رباتهای موتور جستوجویی را که قواعد را رعایت میکنند به اشتباه علامت بزنید.
خلاصه
هانیپات تلهای است که طوری ساخته شده که بازدیدکنندگان انسانی آن را نبینند، اما رباتهایی که هر پیوند و فیلد فرم را خودکار پردازش میکنند در آن گیر بیفتند: پیوندهای پنهانشده با CSS، فیلدهای فرمی که باید خالی بمانند، صفحههای بیپایان و هزارتوهای محتوای تولیدشده. اسکرپری که در تله بیفتد مسدود میشود، با صفحه بررسی روبهرو میشود یا بیآنکه بداند داده جعلی جمع میکند. راه در امان ماندن از هانیپات تلاش برای دور زدن آن نیست، بلکه طراحی خزندهای است که از robots.txt پیروی کند، فقط الگوهای URL لازم را دنبال کند، سقف عمق داشته باشد و فرم ارسال نکند. برای کارهای جمعآوری داده در چارچوب قواعد، نگاهی به خدمات پروکسی ما بیندازید.




