אבטחה

1. מניעת פריצת האפליקציה בעזרת XSS

Cross-site scripting הידוע כ XSS קורה כשאפליקצית ווב אוספת נתונים זדוניים מהמשתמש. בדרך כלל התוקפים יזריקו קוד Javascript, VBScript, ActiveX, HTML או פלאש אל אפליקציה שאינה מוגנת כראוי וניתנת לחדירה על ידי התקפות מסוג זה בכדי לרמות משתמשים אחרים ולאסוף מידע מהם. לדוגמא, פורום שנכתב בצורה לא טובה יכול להציג את הודעות המשתמש בנושאים ללא שום בדיקה קודם לכן. תוקף יכול להזריק חתיכת קוד Javascript זדוני לתוך ההודעה ככה שברגע שמשתמשים יקראו את ההודעה הזו, קוד ה Javascript ירוץ באופן בלתי צפוי על גבי המחשב שלהם.

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

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

ניתן להשתמש ברכיב CHtmlPurifier כוידג'ט או כפילטר. כשמשתמשים בו כוידג'ט, CHtmlPurifier יטהר את התוכן הנמצא בתוכו בקובץ תצוגה. לדוגמא,

«?php $thisbeginWidget('CHtmlPurifier'); ?»
הצגת הודעות שהגיעו מהמשתמש כאן שיש לסנן אותם מקוד זדוני
«?php $thisendWidget(); ?»

2. מניעת התקפות CSRF

התקפות Cross-Site Request Forgery (CSRF) מתבצעות כשאתר זדוני גורם לדפדפן המשתמש לבצע פעולה לא רצויה על אתר אמין. לדוגמא, באתר הזדוני קיים עמוד המכיל תג תמונה («img .. ») שהערך src שלו מפנה לאתר בנקאי: http://bank.example/withdraw?transfer=10000&to=someone. במידה ולמשתמש יש עוגיה השומרת את פרטי ההתחברות שלו באתר הבנקאי ההוא והמשתמש מבקש בטעות בעמוד הזדוני, הפעולה של העברה של 10000 דולר למשהו תתבצע. בניגוד ל XSS אשר מנצל את האמון שיש למשתמש עבור אתר מסויים, CSRF מנצל את האמון של אתר למשתמש מסויים.

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

Yii מיישם אפשרות למניעת CSRF בכדי לנסות להביס התקפות מבוססות POST. אפשרות זו מבוססת על ידי כך שהיא שומרת ערך רנדומלי בעוגיה ומשווה את הערך הזה עם הערך שנשלח בעזרת בקשת ה POST.

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

return array(
    'components'array(
        'request'array(
            'enableCsrfValidation'true,
        ),
    ),
);

ובכדי להציג טופס, יש להשתמש ב CHtml::form במקום לכתוב את קוד ה HTML של הטופס ידנית. השימוש ב CHtml::form תשבץ את הערך הרנדומלי הרצוי בשדה נסתר בטופס כדי שיהיה ניתן לאמתו בעת הבדיקה עבור CSRF.

3. מניעת התקפות מבוססות עוגיות

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

ישנם כמה אמצעים למניעת התקפות על עוגיות.

  • אפליקציה יכולה להשתמש ב SSL בכדי ליצור ערוץ תקשורת מאובטח ולהעביר את העוגיות על גבי חיבור HTTPS שהינו חיבור מאובטח לשרת. לכן, תופקים לא יוכלו לפענח את התוכן הנמצא בעוגיות המועברות.
  • יש להגדיר את התפוגה של ה Sessions בהתאם, כולל כל העוגיות והסימונים הנשארים על ידי ה Sessions, בכדי להפחית את הסבירות של להיות מותקף.
  • יש למנוע XSS הגורם לקוד זדוני לרוץ על גבי הדפדפן של המשתמש ולחשוף את העוגיות שלו.
  • אימות נתוני העוגיות ולגלות אם הם שונו.

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

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

return array(
    'components'array(
        'request'array(
            'enableCookieValidation'true,
        ),
    ),
);

בכדי להשתמש באפשרות של בדיקת העוגיות הסופקת על ידי Yii, אנו גם צריכים לגשת לעוגיות על ידי שימוש באוסף cookies, במקום לגשת אליהם ישירות בעזרת COOKIES_$ לדוגמא,

// שליפת העוגיה עם שם ספציפי
$cookie=Yii::app()requestcookies[$name];
$value=$cookievalue;
......
// שמירת עוגיה
$cookie=new CHttpCookie($name,$value);
Yii::app()requestcookies[$name]=$cookie;

«div class="revision"»$Id: topics.security.txt 1458 2009-10-16 15:03:59Z qiang.xue $«/div»

Be the first person to leave a comment

Please to leave your comment.