הבלוג של ינון פרק

טיפים קצרים וחדשות למתכנתים

אמא שלך שברה את המיילים

06/01/2023

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

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

<input type="email" />

אבל בגירסה החדשה (עד אתמול) היא היתה מסוג טקסט:

<input type="text" />

עכשיו תיאורטית זה לא אמור להשפיע על שום דבר - הרי ממילא כל האקר חובב יודע לפתוח את כלי הפיתוח של הדפדפן עם F12 ולשנות את ה type של התיבה. אבל מאיזושהי סיבה כל עוד התיבה היתה מסוג email (וגם קצת אחרי), אף אחד לא ניסה לשלוח בה טקסט חופשי.

עד לפני שבוע בערך.

באותו בוקר מישהו או מישהי שחמדו לצון החליטו לכתוב את הטקסט ״אמא שלך״ בתור כתובת האימייל. לא משהו שהיה אמור לשבור שום דבר, אבל "אמור" זאת לא דרך לכתוב קוד.

מסתבר שספריית mailgun_rails בה אני משתמש כדי לשלוח את המיילים רגישה לכתובות אימייל לא חוקיות. כששלחתי דרכה למיילגאן את רשימת הכתובות להפצה של הפוסט היומי, הקוד התרסק כי "אמא שלך" היא לא כתובת מייל תקנית. הבאג ישן ומפורט בריטהאב כאן: https://github.com/jorgemanrubia/mailgun_rails/issues/48

שלושה לקחים מהסיפור הזה ששווה גם לכם ליישם:

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

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

  3. הבאג הזה נמצא במערכת מפברואר 2017, ממש מהגירסה הראשונה של מנגנון שליחת הפוסטים במייל. לקח לו כמעט שש שנים להתגלות. כל הזמן הזה המנגנון היה פגיע למתקפות Denial Of Service מאוד פשוטות על מנגנון המיילים (כל מה ש"האקר" היה צריך לעשות זה להירשם עם הכתובת "אמא שלך" לקבלת פוסטים במייל). רק בגלל שקוד עובד לא אומר שהוא נכון.

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

רק בגלל שזה נשמע משכנע

05/01/2023

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

בדוגמה לא טכנית ביקשתי מהחבר לייצר רשימה של מילים בנות 5 אותיות שמתחילות ב e ומכילות j, ככה נראתה השיחה:

Q:
please suggest some 5 letter words that start with an e and contain a j

A:
Here are five 5-letter words that start with an "e" and contain a "j":

    eject - to force out or expel, as by a sudden and vigorous thrust
    jumbo - very large in size or quantity
    jenny - a female donkey or ass
    jewry - the Jewish people or community, especially as a whole
    jowar - a type of sorghum grain that is commonly grown in arid regions of Africa and Asia.

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

If you want to download multiple images, you can use a loop to iterate over the URLs of the images and download them one at a time using one of the methods described above. You may also want to consider using threading or asyncio to download the images in parallel, which can improve performance if you are downloading a large number of images.

אף מילה על האפשרות להשתמש ב sessions בספריית requests (שברוב המקרים תתן תוצאה טובה יותר משימוש ב Thread-ים או ב async), ובלי הסביר איך לבדוק את הביצועים בעצמך.

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

יום 5 - מימוש שרת Echo ב Rust

31/12/2022

אחרי כל הדברים היפים שמצאתי ב Rust, היום גיליתי את שני הדברים שעדיין חסרים - תמיכה מובנית במודל תכנות אסינכרוני ותמיכה ב Green Threads. בואו נראה את שתי הבעיות דרך בניית שרת Echo.

המשך קריאה

יום 4 - מימוש tail ב Rust

30/12/2022

אם יש משהו שלמדתי מהתרגיל של אתמול זה החשיבות (והקושי) בפיענוח ארגומנטים שהגיעו משורת הפקודה. היום נדבר על הספריה clap שהופכת את הכתיבה של יישומי שורת פקודה למשימה הרבה יותר נעימה.

המשך קריאה