שמירה על עוגיות היישום בעת שליחת טוקן שנפתר

מאת solvethree3 דקות קריאה

טוקן reCAPTCHA שנפתר אינו מחליף את קובצי ה-cookie של סשן האפליקציה או את ערך ה-CSRF. אחזרו את הטופס והגישו אותו דרך אותו requests.Session כדי שבקשת ה-POST תשמור את קובצי ה-cookie שהתקבלו בבקשת ה-GET.

השתמשו בכותרות הדפדפן שהחזיר שירות הפתרון ובאותו פרוקסי בשתי הבקשות לאפליקציה. בדוגמה הפתרון מתבצע תחילה, כדי שהכותרות יהיו זמינות לפני פתיחת הטופס.

בדף הזה

בצעו את בקשות ה-GET וה-POST של הטופס באותו סשן

השתמשו ב-Python 3.10+ עם requests ועם SDK ה-Python הרשמי של solvethree מותקנים. לשם המארח של היעד נדרש פרופיל פעיל בסביבת העבודה שלכם; שליחת שם המארח במשימה אינה יוצרת פרופיל. אם הוא אינו מוגדר, עיינו בהגדרת פרופיל אתר.

  • הגדירו את TARGET_URL לכתובת ה-URL של הטופס באפליקציה שלכם. הדגמה זו, שבבעלותנו, משתמשת באותה כתובת URL לבקשות ה-GET וה-POST.
  • הגדירו את SOLVETHREE_PROXY לפרוקסי היחיד המשמש לפתרון ולשתי הבקשות לאפליקציה.
  • הגדירו את SOLVETHREE_API_KEY למפתח ה-API של סביבת העבודה שלכם. הריצו את הקוד הזה בצד השרת.
requests.Session · שמירת עוגיות האפליקציה וערך CSRF
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree

class FormParser(HTMLParser):
    csrf = None
    def handle_starttag(self, tag, attributes):
        values = dict(attributes)
        if tag == "input" and values.get("name") == "csrf_token":
            self.csrf = values.get("value")

target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
    session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
    proxies = {"http": proxy, "https": proxy}
    page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
    page.raise_for_status()
    parser = FormParser(); parser.feed(page.text)
    if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
    response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
        data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
    print("Application HTTP status:", response.status_code)
    # Use the actual form's submit URL, fields and session rules. Inspect its result.

הקריאה solve של ה-SDK יוצרת את המשימה ומבצעת תשאול חוזר עד שהיא מוכנה או עד שנזרקת חריגה. לאחר מכן הדוגמה מחילה על הסשן את solution.userAgent ואת solution.secChUa. בקשת ה-GET ממלאת את מאגר קובצי ה-cookie שלו; בקשת ה-POST משתמשת שוב באותו מאגר ומגישה את solution.token לצד ערך ה-CSRF שחולץ מהטופס.

שנו את הפעולה login, את כתובת ה-URL להגשה ואת שדות הטופס בהדגמה כך שיתאימו לאפליקציה שלכם. csrf_token הוא שם השדה בטופס הזה, ולא דרישה של solvethree. התאימו את מנתח ה-HTML אם הטופס שלכם משתמש בשם או במבנה אחר, וכללו שדות נדרשים נוספים, כגון פרטי התחברות. אם כתובת ה-URL להגשה שונה מכתובת הטופס, עדיין השתמשו באותו סשן.

אם האפליקציה דוחה את בקשת ה-POST

סטטוס ה-HTTP המודפס הוא נקודת התחלה, לא הוכחה שההתחברות הצליחה. בדקו את תגובת האפליקציה ואת הבקשה היוצאת לפני שתשלמו על פתרון נוסף. משימה מוכנה פירושה שנוצר פתרון; האפליקציה עדיין מחליטה אם לקבל את ההגשה.

שדה הקלט של CSRF לא נמצא.

בדקו את הסטטוס ואת גוף התגובה של בקשת ה-GET. מעקב אחר הפניות מושבת, ולכן תגובת הפניה אינה הטופס הצפוי.

כדאי לנסות: אחזרו במכוון את הטופס הנכון דרך אותו סשן, ואז התאימו את המנתח לשדה ה-CSRF בפועל.

האפליקציה מדווחת על סשן חסר או על ערך CSRF לא תקין.

בדקו אם בקשת ה-GET קיבלה קובצי cookie, אם בקשת ה-POST שלחה את קובצי ה-cookie הרלוונטיים, ואם ערך ה-CSRF שלה הגיע מתגובת הטופס ההיא.

כדאי לנסות: בצעו את שתי הבקשות באותו requests.Session. אל תאחזרו את הטופס באמצעות לקוח אחד ותגישו אותו באמצעות לקוח אחר.

האפליקציה דוחה את ה-CAPTCHA.

בדקו את שדה הטוקן היוצא, את הפעולה, את הפרוקסי, את User-Agent ואת sec-ch-ua. ודאו שאתם שולחים את solution.token ולא את מזהה המשימה או טוקן ישן יותר.

כדאי לנסות: השתמשו בטוקן הנוכחי, באותו פרוקסי ששימש לפתרון ובכותרות הדפדפן שהוחזרו. אם תוקף הטוקן פג או שכבר בוצעה לו הערכה, השיגו טוקן חדש סמוך להגשה.

בקשת ה-POST מסתיימת, אך ההתחברות לא.

בדקו את גוף התגובה ואת יעד ההפניה, אם יש כזה, וכן את כתובת ה-URL בפועל להגשה ואת שדות הטופס הנדרשים.

כדאי לנסות: התאימו את נתוני הטופס בהדגמה לדרישות הממשק של האפליקציה. טוקן CAPTCHA אינו מספק פרטי הזדהות או שדות אפליקציה חסרים אחרים.

הפעלת המשימה הראשונה שלך.

התחילו עם $5 בקרדיט לסביבת העבודה.

יצירת סביבת עבודה
שמירה על עוגיות היישום בעת שליחת טוקן שנפתר · solvethree