PracticU

קאפצ'ה נגד בוטים - CAPTCHA Against Bots

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › קאפצ'ה נגד בוטים - CAPTCHA Against Bots
מילון מושגים:
DoS - מתקפת מניעת שירות: הצפת שירות בבקשות כדי להעמיס עליו ולמנוע ממשתמשים לגיטימיים לקבל אותו.
AJAX - טכניקה שמאפשרת לדף אינטרנט לשלוח ולקבל נתונים מהשרת ברקע ולעדכן את התצוגה בלי לטעון מחדש.
npm - מנהל החבילות של Node.js, המשמש להתקנה ולניהול ספריות JavaScript בפרויקט.
עוגייה - קובץ קטן שאתר שומר בדפדפן כדי לזכור מידע על המשתמש בין בקשות, למשל מצב התחברות או העדפות.
JWT - אסימון חתום בפורמט JSON שמעביר נתוני זהות והרשאה בין צדדים באופן קומפקט ומאומת.
ראוט - הגדרה שמקשרת כתובת בקשה לקוד שמטפל בה באפליקציה. גם מסלול שדרכו עוברות חבילות ברשת.
GET - שיטת HTTP לבקשת מידע מהשרת בלי לשנות אותו. הפרמטרים מועברים בדרך כלל בכתובת.
Middleware - שכבת תוכנה שמתווכת בין רכיבים ומטפלת בבקשות בדרכן, למשל לאימות, רישום לוג או עיבוד נתונים.

קאפצ'ה נגד בוטים - CAPTCHA Against Bots
בוט אוטומטי יכול לשלוח בקשות הרשמה חוזרות ולמלא את מסד הנתונים בחשבונות מזויפים, גם כשיש הגנה מפני DOS. ההרצאה מדגימה את הבעיה ומוסיפה CAPTCHA להרשמה בצד השרת והלקוח.
מה הבעיה
סקריפט ששולח בקשת Ajax כל שנייה לנתיב ההרשמה עם נתונים אקראיים יוצר משתמשים חדשים בטבלה, והמספר עולה במהירות. מכיוון שהקצב איטי, ההגנה מפני DOS לא חוסמת אותו.
מה זה CAPTCHA
קיצור של Completely Automated Public Turing Test to Tell Computers and Humans Apart. הרעיון מבוסס על מבחן טיורינג: בדיקה אם מולנו אדם או מחשב. כאן נבדוק אם מולנו בוט שמבצע בקשות אוטומטיות.
השלבים העיקריים
1. התקנות: npm i express-session ו-npm i svg-captcha. הסשן מוגדר ב-server.use(session({...})) עם שם cookie, secret ו-resave / saveUninitialized. אפשר גם להשתמש ב-JWT במקום.
2. ראוט שמחזיר תמונה: ב-auth controller מוסיפים router.get("/captcha"). הוא מבצע svgCaptcha.create() שמחזיר טקסט ותמונה, שומר את הטקסט ב-request.session.captchaText, ושולח ללקוח רק את התמונה כ-SVG עם סוג תוכן מתאים. הטקסט עצמו לא נשלח ללקוח.
3. middleware לאימות: verifyCaptcha משווה את request.body.captchaText לטקסט השמור בסשן. אם שונה, מחזיר סטטוס 400 עם "captcha not valid". הוא מוצמד לראוט ההרשמה בלבד.
4. צד הלקוח: בדף ההרשמה מוסיפים div להצגת התמונה ותיבת טקסט עם placeholder, בשדה חובה. ב-JavaScript של ההרשמה שולחים את הערך גם בשם captchaText, ומבצעים בתחילה בקשת $.ajax לנתיב ה-captcha כדי להציג את התמונה בתוך ה-div.
5. בדיקה: מנקים את הטבלה (מחיקת משתמשים לפי ID), נרשמים עם קוד שגוי ומקבלים "captcha not valid", ועם קוד נכון ההרשמה מצליחה. כשמריצים את סקריפט הבוט, השרת מחזיר bad request בכל שנייה ואין משתמשים מזויפים חדשים.
שימו לב
יש סוגי CAPTCHA רבים, כמו בחירת תמונות או סימון "I am not a robot". כאן נבחרה ספרייה פשוטה שמציגה תמונת טקסט, ואפשר להחליף אותה בספרייה אחרת.
אפשר עכשיו להגן על טופס הרשמה מפני יצירת חשבונות מזויפים אוטומטית.
השיעור הבא בקורס: מפות בזמן אמת של תקיפות סייבר שמתבצעות עכשיו - Cyber Maps

פרקי ההרצאה: קאפצ'ה נגד בוטים - CAPTCHA Against Bots

  1. 00:00

    הבעיה של חשבונות פיקטיביים

  2. 00:45

    דימוי בוט שיוצר חשבונות

  3. 03:49

    יצירת נתונים רנדומליים ליוזר

  4. 05:11

    היוזרים הפיקטיביים בדאטאבייס

  5. 07:08

    מה זה CAPTCHA

  6. 07:50

    הסבר על מבחן טיורינג

  7. 09:03

    התקנה והגדרה של express-session

  8. 11:09

    התקנת svg-captcha וראוט לתמונה

תמלול ההרצאה: קאפצ'ה נגד בוטים - CAPTCHA Against Bots

הטקסט המלא של הדקות הראשונות בהרצאה «קאפצ'ה נגד בוטים - CAPTCHA Against Bots» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:04

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

  2. 00:50

    creation ובואו ניקח כאן create fake fake counts יש לנו פה את הפונקציה הזאת אנחנו רוצים לא לרוץ בבת אחת מפני שהאתר חוסם על ידי dos attack אז הגנה מפני מידוס הטאקס אז אנחנו רוצים to set interval ולהגיד לו תשמע כל שנייה תייצר לנו אג'קס ריקווסט בוא נשים את זה פה ובוא תגלוש רגע יש לי פה שגיאה לא לא לא תשים לי את זה באמת בצורה כזאת כל שנייה תבצע לי אג'אקס ריקווסט ל-API Authentication בואו

  3. 02:05

    נראה רגע בקונטרולרים איפה זה רג'יסטר אז יש לנו רג'יסטר נכון ב-API Authentication ורג'יסטר גלוש לכתובת הזאת ושלח לנו כאן איזשהו אובייקט דאטה שהאובייקט הזה מכיל את מה שאנחנו אמורים להכיל ב-registration הרגיל.

  4. 02:37

    בואו ניכנס רגע ל-register הרגיל, ולא ל-HTML שלו, ל-JavaScript שלו. האמת, בואו נעתיק את כל זה, זה יהיה רעיון טוב, כי האקר כן יכול להגיע, אפילו את כל זה, האקר כן יכול להגיע ל-JavaScript ולראות איך ה-JavaScript מתנהג, ה-JavaScript כמובן שנמצא ב-client side,

  5. 03:02

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

  6. 03:12

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

  7. 03:43

    כאן, בואו ניקח כאן איזושהי פונקציה כלשהי, function get function random string. תן לי איזה מכרוזת רנדומלית, const str שווה, בואו ניקח סתם math random ונבצע את זה עם מכרוזת ריקה.

  8. 04:14

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

  9. 04:32

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

  10. 04:50

    יש לנו יוזר, אנחנו שולחים את היוזר, הנה פה. בינתיים בואו ניגש לקונטרולרים, נלך ל-out ונדפיס פה console.log של requestBody, מה בעצם מגיע מהלקוח כל שנייה.

  11. 05:15

    בואו נעצור את הריצה וננקה, נריץ. ניגש לאתר שלנו, הנה הלחצן test fake account creation ונשים את זה האמת קצת בצד, נלחץ עליו וכל שנייה אנחנו רואים שיש לנו כאן איזה יוזר חדש שנוצר רנדומלי לחלוטין.

  12. 05:49

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

  13. 06:02

    כמה רשומות יש לנו כאן? 22 רשומות. אוקיי, בואו נרפרש עוד פעם. בום, כבר יש לנו 31 רשומות. עכשיו, אם הדבר הזה עובד בלי הפסקה, אנחנו מתחילים ליצור מלא מלא מלא מלא יוזרים.

  14. 06:19

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

  15. 06:39

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

  16. 06:58

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

  17. 07:13

    אז אנחנו רוצים להגן על זה מפני יצירת מידע פיקטיבי. השיטה היום שמאפשרת לבצע הגנה כזאת נקראת קפצ'ה. קפצ'ה זה קיצור של Completely Automated Public Turing Test to Tell Computers and Humans Apart.

  18. 07:38

    האמת שפספסתי פה טיפה מה זה. Completely automated public Turing test to tell computers and humans apart. מה זה בעצם הדבר הזה? אז קודם כל מה זה public Turing test?

  19. 07:55

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

  20. 08:21

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

  21. 08:46

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

  22. 09:05

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

  23. 09:25

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

  24. 09:34

    אז לצורך כך יש לנו npm i express session, בואו תתקייני לי את ה-session שנוכל לעבוד איתו, תכף אתם תראו למה אנחנו צריכים אותו. והדבר הבא, האמת בואו קודם כל, אם התקנו את ה-session, בואו נפעיל אותו.

  25. 09:59

    אז אנחנו רוצים לבוא לפה, const session require, ויש לנו כאן express session. בשביל להפעיל אותו, הדבר הבא שעשינו היה לשים, איפה זה?

  26. 10:21

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

  27. 11:10

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

  28. 11:48

    נתקין את זה svg זה קונספט של תמונה תמונה מסוג svg תמונה וקטורית כזאת good זה done הדבר הבעיה הבאה שאנחנו רוצים לבצע זה לגשת לאאות' קונטרולר ולהגיד דבר כזה:

  29. 12:08

    אנחנו רוצים שכאשר היוזר רוצה לעשות הרשמה, קודם כל צריך לקבל מאיתנו את אותה קפצ'ה. עכשיו, לא כל כך דיברתי על מה זה בעצם קפצ'ה.

  30. 12:22

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

  31. 12:40

    אז אנחנו רוצים להחזיר לו את אותה התמונה. אז כאן אנחנו בונים ראוט, router.get, כי אני מחזיר לו. בואו נקרא לו קפצ'ה קפצ'ה.

  32. 12:54

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

  33. 13:14

    אז אנחנו רוצים עכשיו להשתמש ולהשיג תמונה כזאת. אז בואו ניקח פה const svgCaptcha.require svgCaptcha. אנחנו רוצים לבוא לפה ולבצע constcaptcha שווה

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: הגנה מהתקפות DDOS

ההרצאה הבאה: מפות בזמן אמת של תקיפות סייבר שמתבצעות עכשיו - Cyber Maps

הרצאות קשורות מקורסים אחרים

  • הגנה נגד התקפה MITM
  • XSS - הגנה נגד פריצה לאתר
  • רשומת SPF - הגנה נגד פישינג - DNS

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React