20
פבר' 11

זיהוי משתמש לפי מייל בdjango

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

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

שני דברים הנחו אותי בכתיבה:

1. אפשר לזהות מייל בכל מיני שיטות שונות ומתוחכמות. לא הכרחי ולא תמיד יעיל – החלטתי לחפש @ בשם המשתמש – דבר שאסור לפי החוקים במערכת שלי.

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

הנה הקוד:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class EmailUserBackend(ModelBackend):

    def authenticate(self, username=None, password=None):

        if '@' in username:

            try:

                user = User.objects.get(email=username)

                if user.check_password(password):

                    return user

            except User.DoesNotExist:

                pass

        return super(EmailUserBackend,self).authenticate(username, password)

בנוסף, צריך להחליף את הקוד הנוכחי בsettings.py:

AUTHENTICATION_BACKENDS = (

'gifts.giftuser.backend.EmailUserBackend',

#'django.contrib.auth.backends.ModelBackend',

)

בהערה: הקוד הקודם.


16
פבר' 11

תיקון אבטחה בdjango משנה קריאות ajax (אין תאימות אחורה)

אם אתם משתמשים בdjango עדכני ולפתע מקבלים שגיאת 403 לקריאות הajax שלכם ולא מבינים למה, כדאי שתקראו את זה.

ב8 בפברואר שוחרר תיקון אבטחה בdjango שכלל גרסאות 1.1, 1.2 וגרסת הקוד האחרונה. הסיפור הוא די פשוט, אבל כדי להבין אותו כדאי לדעת כמה פרטים כללים על CSRF, למה משתמשים בזה ואיך. אם אתם יודעים אתם יכולים לקפוץ על הפסקאות הבאות הישר לפתרון.

מה זה CSRF

csrf הם ראשי התיבות לCross-site request forgery, פירצת אבטחה המאפשרת שליחת פקודות לאתר בשמו של משתמש שהאתר מכיר ובוטח. בניגוד לxss המפורסמת קצת יותר, שבה מנצלים את האימון שהמשתמש נותן באתר. הרעיון בבסיסו פשוט מאוד: אם התוקף יודע שמשתמש מסויים מחובר לאתר, הוא שותל קוד באתר או באתר אחר, המפנה לפעולה מסויימת ושולח אותו במספר דרכים זדוניות למשתמש, אשר ביודעין או לא מפעיל את הקוד הזה. מכיוון שהמשתמש מחובר, האתר בוטח בו ובזהות שלו ומפעיל את הפקודה.

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

<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">

השיטה הפופלרית ביותר להתמודדות (זו שdjango משתמשת בה, וכן wordpress וruby) היא הוספת קוד סודי לפני קריאות אפשריות לשרת. אם הקוד לא שם אז השרת מתיחס לקריאה כפריצת אבטחה ומחזיר קוד 403.

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

מהי ההתקפה האפשרית החדשה

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

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

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie && document.cookie != '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) == (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }
        if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
            // Only send the token to relative URLs i.e. locally.
            xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
        }
    }
});

תיאור הפתרון:

בעזרת jquery אנחנו תופסים כל בקשת ajax, ובודקים אם יש לנו עוגיה המכילה את המילה csrftoken, ומוסיפים אותה לבקשה.


01
פבר' 11

Django's get_model וסדר טעינת מודולים

היום היה יום עמוס במיוחד. הוא התחיל עם באג קטן שמצאתי בDjango, המשיך בכמה תיקונים בשתי חבילות חדשות שהתחלתי להשתמש (django-registration ו-django-social-auth) והמשיך הלאה משם. את התיקון בdjango לקח לי קצת זמן למצא פשוט מהסיבה שלא האמנתי שיש ממש באג בבסיס, אבל התיקון בsocial-auth היה מענין יותר.

social-auth הוא תוסף המאפשר הרשמה של משתמשים מרשתות חברתיות לאפליקלציה שלך. אני משתמש בפייסבוק, טוויטר ואולי גוגל בהמשך, אבל התוסף עצמו תומך גם ביאהו, אורקוט וopen id של גוגל – לא רע בכלל.

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

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

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

הבעיה היתה שמכיוון ששני השימושים הנ"ל (הסיגנל והמודל המקומי) התיחסו למודל שלי של המשתמש, אפשרתי את שניהם באותו הקובץ, לפני ההגדרה של מודל המשתמש שלי. כל אחד מהנ"ל יכל לעבוד, אבל ביחד – השימוש בסיגנל הכניס את המודל לזכרון, וברגע שהוא נכנס לזכרון הוא קרא לget_model כדי להעלות את המשתמש שלי – אבל זה עדיין לא היה נגיש בשלב הזה. התוצאה: התרסקות.

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


24
ינו' 11

מבחן פולי קפה – מלכה אפריקאית של פאולס

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

מחיר הקפה: למיטב זכרוני, ממוצע.

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

ארומה: אגוזית קלה מאוד. זה לא קפה שמפיץ ריח חזק סביבו

גוף: מאוזן ומלא.

טעם: מריר בהתחלה ושוקולדי בהמשך, רב טעמי ומאוד מאוזן.

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


19
ינו' 11

sight : תוסף כרום למתכנתים

תוספי דפדפן למתכנתים יש הרבה. כולם מכירים את firebug לפיירפוקס, והתוספים הנוספים שלו: yslow, וgoogle page speed שכתבתי עליו בעבר. Sight (מראה) הוא תוסף המאפשר לראות בצורה נוחה את כל הפרטים הטכניים המעצבנים שלפעמים קשה להבין בתוך דף: json, xml ואפילו קוד ממשי – הוא תומך ברשימה ארוכה של שפות וכמה מבנים שונים (themes) אם רק מתחשק לכם.

כמובן שכל הקוד חשוף גם הוא, אז אם אתם רוצים לשנות משהו – בבקשה..

[ דרך הchangelog]


02
ינו' 11

לקחי טכנולוגיה – 30.12.10 – buildout

  • כשבונים buildout לפייטון, במיוחד בסביבת eclipse, משתנה הextra-path יגרום לסקריפט להכניס נתונים לbin/django שלכם הכוללים את הpath לחבילות המותקנות. אם יש לכם מודל ספציפי שאתם רוצים להשתמש בו ישירות, אתם חייבים להכניס את השורה הזו.
  • השוואה מצויינת של ביצועי ווב סרברז לפייטון שלא רק נכנסת לפרטי הבדיקות, בודקת הרבה סרסבים אלא גם מסבירה את ההבדלים, ממה הם נובעים וכו. לכל האנשים שמדברים ביצועים אבל לא תמיד סגורים למה thread pool שונה מthread per process, הנה.

30
דצמ' 10

משטרת ישראל – יש גבול למה שצריך לעשות במדיה חברתית (או צריך להיות אחד כזה)

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

היום, לעומת זאת, המשטרה לדעתי טעתה ועברה את הגבול:

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

אבל זה ממשיך בתגובות: "יענו עכשיו בכלא ישימו אותו עם עציר ערבי שיושב כמעט 5 שנים בלי סקס ויפיל לו כל חצי שעה ת'נקע 7 במקלחת " אתה רוצה לראות בולבול של בדואי …?! " – נכון לזמן זה, לפני 52 דקות (!) ואף אחד לא העיף את זה מהקיר..

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

רק דעתי.


22
דצמ' 10

קואניי (קואן) פייטון

קואן (Kōan)   –  הוא "סיפור, דיאלוג, שאלה או אמירה הנוגעת להיסטוריה או למסורת של הזן בודהיז וכוללת אספקטים שאינם מובנים באופן רציונלי, אלא בחשיבה אינטואיטיבית." (מתוך ויקיפידיה בעברית, למרות שהערך באנגלית טוב יותר). אחד הקואנים החביבים עלי ביותר הוא זה של הקול שעושה מחיאת כף יד אחת, מתוך אותה אפיסודה מצויינת של הסימסונים (עונה 2, פרק 6 אם אתם מחפשים).

הקואנים של פייטון (רעיון שבמקור נלקח מרובי למעשה) הם רשימה של 287 קואנים, או למעשה, Unit Test שנכשלים, והמטרה שלהם היא ללמד את השפה דרך הידיים – כדי לעבור את המבחן עליכם "לתקן" את הבדיקות שתעבורנה, וכך אתם לומדים את השפה. רעיון טוב, לא?

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

בהצלחה!


05
דצמ' 10

שימוש בwireshark תחת מקינטוש Snow Leopard

ווירשרק (wireshark), היורש של ethereal הישן והטוב, הוא כלי sniff המאפשר לראות מה קורה ברשת שלך. הוא אחד הכלים השימושיים ביותר כשמנסים לדבג בעיות ביצועים, תקשורת ועבודה מול API של שירותים שונים ומשונים, משום שהוא מראה תעבורה מהרמות הנמוכות ביותר עד הגבוהות ביותר, לפי הצורך.

משום מה תחת הגרסה האחרונה של המק, snow leopard, הוא אינו מצליח לגלות interfaces – את כרטיסי הרשת למעשה. מתברר שבצורה דיפולטיבית אין למשתמש גישה ישירה אליהם. כדי לאפשר את הגישה פתחו חלון console וכיתבו:

sudo chown {your account name} /dev/bpf*

27
נוב' 10

כיצד להתקין facebook places באייפון בישראל

facebook places היא שירות הצ'ק אין של פייסבוק שבא להלחם (וכרגע מנצח) שירותים כמו gowalla והשירות המוצלח יותר בארץ foursquare. לצערנו, כמו השירותים האחרים בתחילת דרכם, הפיצ'ר הזה לא חשוף למשתמשים ישראלים כרגע – אלא אם יש לכם חברים המבקרים בארה"ב. לאחרונה גילו מספר אנשים שדרך בלקברי אפשרי להשתמש בשירות, ומכאן הדרך כבר היתה מהירה, מכיוון שאני לא אוהד גדול של סרטי וידיאו, אני אסביר בקצרה כיצד יש לאפשר את הטלפון שלכם לגישה כזו. תודה לאריק שהציג לי את האפשרות..

שלב ראשון: לאפשר vpn בטלפון שלכם:

  1. לכו ל settings->general->network->vpn
  2. הוסיפו vpn עם הפרטים הבאים:
  • קודם כל עיברו לIPSec בטאב למעלה
  • תיאור (description):   Hotspotshield
  • Server: 68.68.107.101
  • Account: dqffmr
  • Password: dqffmr
  • Group Name: hss
  • Secret: hss

אני לא בטוח מה השמות בעברית, אבל הסדר זהה.

לחצו על Save וחזרו לדף הקודם.

שלב שני: פייסבוק

בכל פעם שתרצו להשתמש בפלייסס, לחצו על Settings->VPN (הפעם התפריט הזה מאופשר מהר יותר) – הכנסו לפייסבוק והופה! עובד!

לאחר השימוש מומלץ לכבות את הVPN.

הערה:

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