بازگشت به وبلاگ

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

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

📅۲۰ دی ۱۴۰۴
```html

حملات زمان‌بندی — روشی برای شناسایی ربات‌ها است که بر اساس تحلیل زمان اجرای اقدامات در مرورگر بنا شده است. سیستم‌های ضد تقلب مدرن مانند Facebook، Google، TikTok و دیگر پلتفرم‌ها نه تنها آنچه را که انجام می‌دهید، بلکه سرعت آن را نیز تحلیل می‌کنند. کلیک‌های بسیار سریع، بارگذاری فوری صفحات، و عدم وجود وقفه‌های طبیعی — همه اینها خودکارسازی را فاش می‌کند. در این مقاله روش‌های فنی حفاظت در برابر حملات زمان‌بندی برای توسعه‌دهندگانی که با Selenium، Puppeteer و مرورگرهای ضد شناسایی کار می‌کنند، بررسی خواهیم کرد.

حملات زمان‌بندی چیست و چگونه کار می‌کنند

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

معیارهای زمانی اصلی که سیستم‌های حفاظتی تحلیل می‌کنند:

  • زمان تا اولین تعامل (TTFI) — زمان از بارگذاری صفحه تا اولین اقدام (کلیک، اسکرول، وارد کردن متن). ربات‌ها معمولاً بلافاصله پس از بارگذاری DOM اقدام می‌کنند، در حالی که انسان‌ها بین 0.5 تا 3 ثانیه زمان می‌برند.
  • الگوهای زمان‌بندی کلیک — زمان‌های بین کلیک‌ها. اسکریپت‌های خودکار معمولاً با فرکانس یکسان کلیک می‌کنند (مثلاً دقیقاً هر 2 ثانیه)، در حالی که انسان‌ها به صورت تصادفی کلیک می‌کنند.
  • ثبات سرعت تایپ — سرعت وارد کردن متن. ربات‌ها متن را بلافاصله یا با تأخیر ثابت بین کاراکترها وارد می‌کنند، در حالی که انسان‌ها با سرعت متغیر و وقفه‌ها تایپ می‌کنند.
  • سرعت حرکت ماوس — سرعت حرکت نشانگر. Selenium به طور پیش‌فرض نشانگر را بلافاصله به نقطه مورد نظر منتقل می‌کند، در حالی که انسان ماوس را با شتاب و کاهش حرکت می‌دهد.
  • رفتار اسکرول — الگوهای اسکرول صفحه. ربات‌ها معمولاً به طور دقیق به مقدار مشخصی از پیکسل‌ها اسکرول می‌کنند، در حالی که انسان‌ها به صورت نامنظم و با توقف‌ها اسکرول می‌کنند.

سیستم‌های شناسایی از یادگیری ماشین برای تحلیل این معیارها استفاده می‌کنند. آن‌ها پروفایل رفتاری ایجاد می‌کنند و احتمال اینکه کاربر یک ربات باشد را محاسبه می‌کنند. اگر الگوهای زمانی بسیار ایده‌آل یا بسیار سریع باشند — این یک علامت قرمز است.

مهم: حملات زمان‌بندی به ویژه در برابر خودکارسازی انبوه مؤثر هستند. اگر شما 100 مرورگر با الگوهای زمانی یکسان راه‌اندازی کنید، سیستم ضد تقلب به راحتی می‌تواند آن‌ها را از طریق ناهنجاری‌های آماری شناسایی کند.

روش‌های شناسایی خودکارسازی از طریق الگوهای زمانی

سیستم‌های ضد تقلب مدرن از چندین لایه تحلیل ویژگی‌های زمانی استفاده می‌کنند. بیایید تکنیک‌های خاصی که Facebook، Google، Cloudflare و دیگر پلتفرم‌ها استفاده می‌کنند را بررسی کنیم.

1. تحلیل Performance API

مرورگرها Performance API را ارائه می‌دهند که تلمتری دقیق از بارگذاری صفحه جمع‌آوری می‌کند. سیستم‌های ضد تقلب تحلیل می‌کنند:

// مثال داده‌های Performance API
performance.timing = {
  navigationStart: 1234567890000,
  domLoading: 1234567890150,      // +150ms
  domInteractive: 1234567890300,  // +300ms
  domComplete: 1234567890500,     // +500ms
  loadEventEnd: 1234567890600     // +600ms
}

// الگوهای مشکوک برای ربات‌ها:
// - بارگذاری بسیار سریع (domComplete < 200ms)
// - زمان‌های کاملاً یکنواخت بین رویدادها
// - عدم وجود تأخیر در بارگذاری منابع خارجی

مرورگرهای بدون سر (به ویژه نسخه‌های قدیمی Puppeteer و Selenium) معمولاً مقادیر غیرطبیعی سریع برای navigationStart و domLoading را نشان می‌دهند، زیرا تصاویر، فونت‌ها و دیگر منابع را مانند یک مرورگر عادی بارگذاری نمی‌کنند.

2. تحلیل زمان‌بندی رویدادها

ردیاب‌های JavaScript زمان‌های همه رویدادها (کلیک‌ها، حرکات ماوس، فشار دادن کلیدها) را پیگیری می‌کنند و الگوها را تحلیل می‌کنند:

// مثال جمع‌آوری تلمتری رویدادها
const events = [];

document.addEventListener('click', (e) => {
  events.push({
    type: 'click',
    timestamp: performance.now(),
    x: e.clientX,
    y: e.clientY
  });
});

// تحلیل الگوهای مشکوک:
// - کلیک‌ها دقیقاً هر N میلی‌ثانیه اتفاق می‌افتند
// - هیچ حرکت میکرو ماوس قبل از کلیک وجود ندارد
// - اولین کلیک بلافاصله پس از بارگذاری صفحه اتفاق می‌افتد

3. دینامیک فشار کلیدها

هنگام پر کردن فرم‌ها، سیستم‌های ضد تقلب دینامیک فشار کلیدها را تحلیل می‌کنند — یک نشانگر بیومتریک منحصر به فرد برای هر فرد:

  • زمان نگه‌داشتن — زمان نگه‌داشتن کلید (از keydown تا keyup). برای انسان‌ها بین 50 تا 200 میلی‌ثانیه متغیر است، در حالی که برای ربات‌ها ثابت است.
  • زمان پرواز — زمان بین رها کردن یک کلید و فشار دادن کلید بعدی. برای انسان‌ها — از 100 تا 500 میلی‌ثانیه با تغییرات، برای ربات‌ها — تأخیر ثابت.
  • ریتم تایپ — ریتم کلی تایپ. انسان‌ها در نشانه‌های نگارشی وقفه دارند، اشتباهات را اصلاح می‌کنند، اما ربات‌ها این کار را نمی‌کنند.

مثال شناسایی: اگر شما از element.send_keys("متن") در Selenium استفاده کنید، تمام متن در 1-2 میلی‌ثانیه وارد می‌شود — این به راحتی خودکارسازی را فاش می‌کند.

شبیه‌سازی تأخیرهای انسانی در کد

اولین سطح حفاظت در برابر حملات زمان‌بندی — افزودن تأخیرها بین اقدامات است. اما مهم است که فقط time.sleep(2) را وارد نکنید، بلکه رفتار طبیعی را شبیه‌سازی کنید.

شبیه‌سازی پایه تأخیرها در Python (Selenium)

import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By

def human_delay(min_sec=0.5, max_sec=2.0):
    """تأخیر تصادفی که شبیه انسان است"""
    delay = random.uniform(min_sec, max_sec)
    time.sleep(delay)

driver = webdriver.Chrome()
driver.get("https://example.com")

# تأخیر قبل از اولین اقدام (انسان صفحه را می‌خواند)
human_delay(1.5, 4.0)

# کلیک بر روی عنصر
button = driver.find_element(By.ID, "submit-btn")
button.click()

# تأخیر قبل از اقدام بعدی
human_delay(0.8, 2.5)

شبیه‌سازی پیشرفته با توزیع نرمال

توزیع یکنواخت (uniform) غیرطبیعی به نظر می‌رسد. تأخیرهای انسانی تابع توزیع نرمال با ناهنجاری‌ها هستند:

import numpy as np

def realistic_delay(mean=1.5, std_dev=0.5, min_val=0.3, max_val=5.0):
    """
    تأخیر با توزیع نرمال
    mean: میانگین زمان تأخیر
    std_dev: انحراف معیار
    min_val, max_val: حدود (برای جلوگیری از مقادیر افراطی)
    """
    delay = np.random.normal(mean, std_dev)
    delay = max(min_val, min(max_val, delay))  # محدود کردن دامنه
    time.sleep(delay)
    return delay

# استفاده
realistic_delay(mean=2.0, std_dev=0.7)  # میانگین 2 ثانیه، اما با تغییرات

تأخیرهای متنی

اقدامات مختلف زمان‌های متفاوتی را می‌طلبند. پروفایل‌های تأخیر برای سناریوهای مختلف ایجاد کنید:

class HumanBehavior:
    """پروفایل‌های تأخیر برای انواع مختلف اقدامات"""
    
    @staticmethod
    def page_load_delay():
        """تأخیر پس از بارگذاری صفحه (خواندن محتوا)"""
        return realistic_delay(mean=2.5, std_dev=1.0, min_val=1.0, max_val=6.0)
    
    @staticmethod
    def before_click():
        """تأخیر قبل از کلیک (جستجوی عنصر با چشم)"""
        return realistic_delay(mean=0.8, std_dev=0.3, min_val=0.3, max_val=2.0)
    
    @staticmethod
    def before_typing():
        """تأخیر قبل از شروع وارد کردن متن"""
        return realistic_delay(mean=1.2, std_dev=0.5, min_val=0.5, max_val=3.0)
    
    @staticmethod
    def between_form_fields():
        """تأخیر بین فیلدهای فرم"""
        return realistic_delay(mean=0.6, std_dev=0.2, min_val=0.2, max_val=1.5)

# استفاده در اسکریپت
driver.get("https://example.com/login")
HumanBehavior.page_load_delay()

username_field = driver.find_element(By.ID, "username")
HumanBehavior.before_typing()
# ... وارد کردن نام کاربری ...

HumanBehavior.between_form_fields()

password_field = driver.find_element(By.ID, "password")
HumanBehavior.before_typing()
# ... وارد کردن رمز عبور ...

تصادفی‌سازی زمان اجرای اقدامات

تأخیرهای یکسان بین اقدامات — یک ناهنجاری آماری است. اگر شما 100 نمونه از اسکریپت را اجرا کنید و همه آن‌ها دقیقاً 2.5 ثانیه پس از بارگذاری بر روی دکمه کلیک کنند — این به راحتی شناسایی می‌شود. نیاز به تصادفی‌سازی در چندین سطح است.

1. تصادفی‌سازی ترتیب اقدامات

تنوعی در توالی اقدامات اضافه کنید. به عنوان مثال، قبل از پر کردن فرم گاهی صفحه را اسکرول کنید، گاهی — نه:

def fill_form_naturally(driver):
    # 30% احتمال اسکرول کردن صفحه قبل از پر کردن
    if random.random() < 0.3:
        driver.execute_script("window.scrollBy(0, 200)")
        human_delay(0.5, 1.5)
    
    # 20% احتمال کلیک کردن در یک مکان تصادفی (شبیه‌سازی خواندن)
    if random.random() < 0.2:
        body = driver.find_element(By.TAG_NAME, "body")
        body.click()
        human_delay(0.3, 0.8)
    
    # اقدام اصلی — پر کردن فرم
    username_field = driver.find_element(By.ID, "username")
    type_like_human(username_field, "myusername")

2. سرعت تایپ متغیر

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

def type_like_human(element, text):
    """وارد کردن متن با شبیه‌سازی سرعت انسانی تایپ"""
    for char in text:
        element.send_keys(char)
        
        # تأخیر پایه بین کاراکترها
        base_delay = random.uniform(0.05, 0.15)
        
        # تأخیرهای اضافی بر روی فاصله‌ها و نشانه‌های نگارشی
        if char in [' ', '.', ',', '!', '?']:
            base_delay += random.uniform(0.1, 0.3)
        
        # "فکر کردن" تصادفی (احتمال 5% برای تأخیر طولانی)
        if random.random() < 0.05:
            base_delay += random.uniform(0.5, 1.5)
        
        time.sleep(base_delay)
    
    # گاهی اشتباه تایپی انجام می‌دهیم و اصلاح می‌کنیم (احتمال 10%)
    if random.random() < 0.1:
        time.sleep(random.uniform(0.2, 0.5))
        element.send_keys(Keys.BACKSPACE)
        time.sleep(random.uniform(0.1, 0.3))
        element.send_keys(text[-1])  # آخرین کاراکتر را دوباره وارد می‌کنیم

3. Puppeteer: وارد کردن متن به آرامی

در Puppeteer گزینه داخلی delay برای متد type() وجود دارد، اما باید آن را تصادفی‌سازی کنید:

// استفاده پایه (توصیه نمی‌شود — تأخیر ثابت)
await page.type('#username', 'myusername', { delay: 100 });

// رویکرد صحیح — تصادفی‌سازی برای هر کاراکتر
async function typeWithVariableSpeed(page, selector, text) {
  await page.click(selector);
  
  for (const char of text) {
    await page.keyboard.type(char);
    
    // تأخیر تصادفی از 50 تا 150 میلی‌ثانیه
    let delay = Math.random() * 100 + 50;
    
    // تأخیر اضافی بر روی فاصله‌ها
    if (char === ' ') {
      delay += Math.random() * 200 + 100;
    }
    
    // تأخیرهای طولانی تصادفی (احتمال 5%)
    if (Math.random() < 0.05) {
      delay += Math.random() * 1000 + 500;
    }
    
    await page.waitForTimeout(delay);
  }
}

// استفاده
await typeWithVariableSpeed(page, '#username', 'myusername');

حرکت طبیعی ماوس و سرعت اسکرول

Selenium و Puppeteer به طور پیش‌فرض نشانگر ماوس را حرکت نمی‌دهند — آن‌ها بلافاصله آن را به نقطه مورد نظر منتقل می‌کنند و کلیک می‌کنند. این یکی از واضح‌ترین نشانه‌های خودکارسازی است. برای شبیه‌سازی حرکت طبیعی ماوس به کتابخانه‌های خاصی نیاز است.

کتابخانه pyautogui برای حرکت نرم ماوس

کتابخانه pyautogui اجازه می‌دهد تا نشانگر را به صورت منحنی بزیه با شتاب و کاهش حرکت دهید:

import pyautogui
from selenium.webdriver.common.action_chains import ActionChains

def move_mouse_naturally(driver, element):
    """حرکت نرم ماوس به سمت عنصر با شبیه‌سازی انسان"""
    # دریافت مختصات عنصر
    location = element.location
    size = element.size
    
    # نقطه هدف (مرکز عنصر + کمی تصادفی)
    target_x = location['x'] + size['width'] / 2 + random.randint(-5, 5)
    target_y = location['y'] + size['height'] / 2 + random.randint(-5, 5)
    
    # حرکت نرم با سرعت متغیر
    # duration — زمان حرکت (0.5-1.5 ثانیه برای واقع‌گرایی)
    duration = random.uniform(0.5, 1.5)
    
    # tweening — تابع شتاب (easeInOutQuad حرکت انسانی را شبیه‌سازی می‌کند)
    pyautogui.moveTo(target_x, target_y, duration=duration, tween=pyautogui.easeInOutQuad)
    
    # وقفه کوچک قبل از کلیک (انسان بلافاصله کلیک نمی‌کند)
    time.sleep(random.uniform(0.05, 0.15))
    
    # کلیک
    element.click()

مهم: این روش فقط در صورتی کار می‌کند که Selenium یک پنجره واقعی مرورگر را کنترل کند (نه بدون سر). برای حالت بدون سر حرکت ماوس بی‌فایده است، زیرا سیستم‌های ضد تقلب نشانگر را نمی‌بینند.

Puppeteer: شبیه‌سازی حرکت ماوس

در Puppeteer می‌توان از کتابخانه ghost-cursor برای حرکت واقعی نشانگر استفاده کرد:

// نصب: npm install ghost-cursor
const { createCursor } = require("ghost-cursor");
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  const cursor = createCursor(page);
  
  await page.goto("https://example.com");
  
  // حرکت نرم به سمت عنصر و کلیک
  const button = await page.$("#submit-btn");
  await cursor.click(button);  // نشانگر به صورت منحنی بزیه حرکت می‌کند!
  
  // به طور جایگزین — حرکت به مختصات
  await cursor.move("#username");  // فقط نشانگر را بدون کلیک حرکت می‌دهیم
  await page.waitForTimeout(300);
  await cursor.click();  // در موقعیت فعلی کلیک می‌کنیم
})();

شبیه‌سازی اسکرول

انسان‌ها صفحه را به طور دقیق 500 پیکسل در یک بار اسکرول نمی‌کنند. اسکرول باید نامنظم باشد، با وقفه‌ها و گاهی اسکرول به عقب:

def scroll_like_human(driver, target_position=None):
    """
    شبیه‌سازی اسکرول انسانی
    target_position: موقعیت هدف در پیکسل (اگر None — تا انتها اسکرول می‌کنیم)
    """
    current_position = driver.execute_script("return window.pageYOffset;")
    
    if target_position is None:
        # اسکرول تا انتهای صفحه
        target_position = driver.execute_script("return document.body.scrollHeight;")
    
    while current_position < target_position:
        # مرحله اسکرول تصادفی (100-400 پیکسل)
        scroll_step = random.randint(100, 400)
        current_position += scroll_step
        
        # اسکرول کردن
        driver.execute_script(f"window.scrollTo(0, {current_position});")
        
        # وقفه بین اسکرول‌ها (انسان محتوا را می‌خواند)
        time.sleep(random.uniform(0.3, 1.2))
        
        # گاهی کمی به عقب اسکرول می‌کنیم (احتمال 10%)
        if random.random() < 0.1:
            back_scroll = random.randint(50, 150)
            current_position -= back_scroll
            driver.execute_script(f"window.scrollTo(0, {current_position});")
            time.sleep(random.uniform(0.2, 0.6))

# استفاده
scroll_like_human(driver, target_position=2000)  # اسکرول تا 2000px

زمان بارگذاری صفحات و درخواست‌های AJAX

سیستم‌های ضد تقلب نه تنها اقدامات کاربر را تحلیل می‌کنند، بلکه ویژگی‌های بارگذاری صفحات را نیز بررسی می‌کنند. مرورگرهای بدون سر معمولاً به طور غیرطبیعی سریع بارگذاری می‌شوند، زیرا تصاویر را بارگذاری نمی‌کنند، برخی از اسکریپت‌ها را اجرا نمی‌کنند و CSS را رندر نمی‌کنند.

مشکل: بارگذاری بسیار سریع

مقادیر معمول Performance API را برای یک مرورگر عادی و بدون سر مقایسه کنید:

معیار مرورگر عادی بدون سر (مشکوک)
domContentLoaded 800-2000 میلی‌ثانیه 50-200 میلی‌ثانیه
loadEventEnd 2000-5000 میلی‌ثانیه 100-500 میلی‌ثانیه
تعداد منابع بارگذاری شده 50-200 (تصاویر، CSS، JS) 5-20 (فقط بحرانی)

راه‌حل: تأخیر مصنوعی بارگذاری

یک تأخیر مصنوعی پس از بارگذاری صفحه اضافه کنید تا معیارها طبیعی‌تر به نظر برسند:

def load_page_naturally(driver, url):
    """بارگذاری صفحه با شبیه‌سازی زمان بارگذاری طبیعی"""
    start_time = time.time()
    driver.get(url)
    
    # منتظر بارگذاری کامل DOM
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script("return document.readyState") == "complete"
    )
    
    # محاسبه زمان واقعی بارگذاری
    actual_load_time = time.time() - start_time
    
    # اگر بارگذاری بسیار سریع بود (< 1 ثانیه)، تأخیر اضافه کنید
    if actual_load_time < 1.0:
        additional_delay = random.uniform(1.0, 2.5) - actual_load_time
        time.sleep(additional_delay)
    
    # تأخیر اضافی برای "خواندن صفحه"
    time.sleep(random.uniform(0.5, 2.0))

# استفاده
load_page_naturally(driver, "https://example.com")

انتظار برای درخواست‌های AJAX

وب‌سایت‌های مدرن محتوا را به صورت ناهمزمان از طریق AJAX بارگذاری می‌کنند. اگر اسکریپت شما قبل از اتمام تمام درخواست‌های AJAX اقدام کند — این مشکوک است. از انتظارهای صریح استفاده کنید:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def wait_for_ajax(driver, timeout=10):
    """انتظار برای اتمام تمام درخواست‌های AJAX (jQuery)"""
    WebDriverWait(driver, timeout).until(
        lambda d: d.execute_script("return jQuery.active == 0")
    )

# برای وب‌سایت‌های بدون jQuery — انتظار برای عنصر خاص
def wait_for_dynamic_content(driver, selector, timeout=10):
    """انتظار برای ظهور عنصر بارگذاری شده به صورت دینامیک"""
    WebDriverWait(driver, timeout).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, selector))
    )
    # تأخیر اضافی پس از ظهور عنصر
    time.sleep(random.uniform(0.3, 0.8))

تنظیم حفاظت در مرورگرهای ضد شناسایی

اگر شما با آربیتراژ، چند حساب کاربری یا دیگر وظایفی که ناشناسی در آن‌ها حیاتی است کار می‌کنید، از مرورگرهای ضد شناسایی استفاده کنید: Dolphin Anty، AdsPower، Multilogin، GoLogin. آن‌ها دارای مکانیزم‌های داخلی برای حفاظت در برابر حملات زمان‌بندی هستند، اما باید به درستی تنظیم شوند.

Dolphin Anty: تنظیم Human Typing

در Dolphin Anty یک ویژگی "Human Typing" وجود دارد — شبیه‌سازی خودکار تایپ انسانی. تنظیمات:

  • پروفایل مرورگر را باز کنید → زبانه "Automation"
  • "شبیه‌سازی تایپ انسانی" را فعال کنید
  • تنظیمات را پیکربندی کنید:
    • سرعت تایپ متوسط: 150-250 کاراکتر در دقیقه (سرعت واقعی)
    • تنوع: 30-50% (تغییر سرعت بین کاراکترها)
    • تأخیر در نشانه‌های نگارشی: فعال (تأخیرها در نشانه‌های نگارشی)
    • اشتباهات تصادفی: 2-5% (اشتباهات تصادفی با اصلاح)

پس از این، هر ورودی متنی از طریق API Dolphin به طور خودکار شبیه‌سازی انسان خواهد بود.

AdsPower: تنظیم حرکت ماوس

AdsPower اجازه می‌دهد تا الگوهای حرکت ماوس یک کاربر واقعی را ضبط کرده و آن‌ها را بازتولید کند:

  1. پروفایل را باز کنید → "تنظیمات پیشرفته" → "رفتار ماوس"
  2. حالت "ضبط کاربر واقعی" را انتخاب کنید:
    • مرورگر را در حالت عادی باز کنید
    • اقدامات معمولی (کلیک‌ها، اسکرول، حرکات ماوس) را انجام دهید
    • AdsPower مسیرهای حرکتی را ضبط خواهد کرد
  3. هنگام خودکارسازی از طریق API، AdsPower الگوهای ضبط شده را با تغییرات بازتولید خواهد کرد

Multilogin: نویز Canvas و زمان‌بندی WebGL

Multilogin نویز (noise) را به Canvas و WebGL fingerprints اضافه می‌کند که بر حملات زمان‌بندی مرتبط با رندرینگ تأثیر می‌گذارد:

  • پروفایل → "تنظیمات اثر انگشت" → "Canvas"
  • "نویز Canvas" را فعال کنید (میکرو تأخیرها را در رندرینگ Canvas اضافه می‌کند)
  • "ماسک کردن متاداده WebGL" را فعال کنید (ویژگی‌های GPU را که بر سرعت رندرینگ تأثیر می‌گذارد، ماسک می‌کند)

این از شناسایی از طریق تحلیل زمان اجرای Canvas.toDataURL() و عملیات WebGL محافظت می‌کند.

توصیه: اگر با چند حساب کاربری در Facebook، Instagram یا TikTok کار می‌کنید، حتماً از مرورگرهای ضد شناسایی به همراه پروکسی‌های مسکونی با کیفیت استفاده کنید — این خطر chain-ban و شناسایی از طریق IP را به حداقل می‌رساند.

تکنیک‌های پیشرفته دور زدن شناسایی زمان‌بندی

برای پلتفرم‌های بسیار محافظت شده (Google، Facebook، وب‌سایت‌های بانکی) ممکن است روش‌های پایه کافی نباشند. بیایید تکنیک‌های پیشرفته را بررسی کنیم.

1. تغییر Performance API

می‌توان متدهای Performance API را بازتعریف کرد تا مقادیر واقعی را به جای مقادیر واقعی بازگردانند:

// تزریق اسکریپت برای تغییر performance.now()
const script = `
  (function() {
    const originalNow = performance.now.bind(performance);
    let offset = 0;
    let lastValue = 0;
    
    performance.now = function() {
      const realValue = originalNow();
      // نویز تصادفی به زمان اضافه می‌کنیم
      const noise = Math.random() * 2 - 1; // از -1 تا +1 میلی‌ثانیه
      let fakeValue = realValue + offset + noise;
      
      // اطمینان از یکنواختی (زمان به عقب نمی‌رود)
      if (fakeValue <= lastValue) {
        fakeValue = lastValue + 0.1;
      }
      
      lastValue = fakeValue;
      return fakeValue;
    };
  })();
`;

// Puppeteer: تزریق هنگام ایجاد صفحه
await page.evaluateOnNewDocument(script);

توجه: این روش ممکن است از طریق بررسی یکپارچگی متدهای نیتیو شناسایی شود. فقط در سایت‌های بدون حفاظت قوی استفاده کنید.

2. کاهش سرعت CPU و شبکه

پروتکل Chrome DevTools اجازه می‌دهد تا به طور مصنوعی CPU و شبکه را کاهش دهید تا معیارهای بارگذاری طبیعی‌تر به نظر برسند:

// Puppeteer: کاهش سرعت CPU به نصف
const client = await page.target().createCDPSession();
await client.send('Emulation.setCPUThrottlingRate', { rate: 2 });

// کاهش سرعت شبکه (شبیه‌سازی 3G)
await page.emulateNetworkConditions({
  offline: false,
  downloadThroughput: 1.5 * 1024 * 1024 / 8, // 1.5 Mbps
  uploadThroughput: 750 * 1024 / 8,          // 750 Kbps
  latency: 40                                 // تأخیر 40 میلی‌ثانیه
});

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

3. شبیه‌سازی فعالیت پس‌زمینه

کاربران واقعی در یک برگه نمی‌نشینند — آن‌ها بین برگه‌ها جابجا می‌شوند، پنجره‌ها را کوچک می‌کنند و حواسشان پرت می‌شود. این را شبیه‌سازی کنید:

async function simulateTabSwitch(page) {
  // شبیه‌سازی جابجایی به برگه دیگر (Page Visibility API)
  await page.evaluate(() => {
    Object.defineProperty(document, 'hidden', {
      get: () => true,
      configurable: true
    });
    
    document.dispatchEvent(new Event('visibilitychange'));
  });
  
  // وقفه (کاربر به برگه دیگری نگاه می‌کند)
  await page.waitForTimeout(Math.random() * 3000 + 2000);
  
  // بازگشت به برگه
  await page.evaluate(() => {
    Object.defineProperty(document, 'hidden', {
      get: () => false,
      configurable: true
    });
    
    document.dispatchEvent(new Event('visibilitychange'));
  });
}

// استفاده: به طور تصادفی "حواس‌پرتی" در حین کار
if (Math.random() < 0.15) {  // احتمال 15%
  await simulateTabSwitch(page);
}

4. استفاده از نشانه‌های واقعی زمان‌بندی کاربر

برخی از وب‌سایت‌ها نشانه‌های زمانی خود را از طریق User Timing API ایجاد می‌کنند. نشانه‌های واقعی اضافه کنید:

// ایجاد نشانه‌های زمان‌بندی واقعی
await page.evaluate(() => {
  // شبیه‌سازی "فکر کردن" کاربر قبل از اقدام
  performance.mark('user-started-reading');
  
  setTimeout(() => {
    performance.mark('user-found-button');
    performance.measure('reading-time', 'user-started-reading', 'user-found-button');
  }, Math.random() * 2000 + 1000);
});

5. چرخش پروکسی برای کاهش همبستگی آماری

حتی اگر هر نمونه از اسکریپت شما تأخیرهای تصادفی داشته باشد، سیستم‌های ضد تقلب ممکن است همبستگی را شناسایی کنند اگر همه درخواست‌ها از یک IP بیایند. از چرخش پروکسی استفاده کنید:

چرخش IP احتمال اینکه سیستم ضد تقلب بتواند داده‌های کافی برای تحلیل آماری الگوهای زمانی شما جمع‌آوری کند را کاهش می‌دهد.

نتیجه‌گیری

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

  • از تأخیرهای ثابت استفاده نکنید — همیشه زمان بین اقدامات را با استفاده از توزیع نرمال تصادفی‌سازی کنید
  • تأخیرهای متنی را شبیه‌سازی کنید — اقدامات مختلف زمان‌های متفاوتی را می‌طلبند (خواندن صفحه ≠ کلیک بر روی دکمه)
  • تنوعی در توالی اقدامات اضافه کنید — اسکرول‌های تصادفی، کلیک‌ها، جابجایی بین برگه‌ها
  • حرکت نرم ماوس را استفاده کنید — کتابخانه‌های ghost-cursor (Puppeteer) یا pyautogui (Selenium)
  • سرعت طبیعی تایپ را شبیه‌سازی کنید — وارد کردن کاراکتر به کاراکتر با تأخیرها در نشانه‌های نگارشی
  • مرورگرهای ضد شناسایی را تنظیم کنید — Dolphin Anty، AdsPower و Multilogin دارای مکانیزم‌های داخلی برای حفاظت در برابر حملات زمان‌بندی هستند
  • با پروکسی‌های با کیفیت ترکیب کنید — چرخش IP امکان تحلیل آماری را کاهش می‌دهد

به یاد داشته باشید: حفاظت ایده‌آل وجود ندارد. سیستم‌های ضد تقلب به طور مداوم در حال تحول هستند و روش‌های جدید شناسایی را اضافه می‌کنند. وظیفه شما این است که رفتار اسکریپت را به حداکثر به کاربر واقعی نزدیک کنید و به طور منظم روش‌های دور زدن را به‌روزرسانی کنید.

اگر با خودکارسازی مرورگرها برای پارس، تست یا دیگر وظایف کار می‌کنید، توصیه می‌کنیم از پروکسی‌های مسکونی استفاده کنید — آن‌ها حداکثر سطح ناشناسی را فراهم می‌کنند و خطر شناسایی از طریق IP را به حداقل می‌رسانند. برای پلتفرم‌های موبایل، پروکسی‌های موبایل بهتر است، زیرا آن‌ها کاربران واقعی اپراتورهای موبایل را شبیه‌سازی می‌کنند.

```