אבטחה
========

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

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

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

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

ניתן להשתמש ברכיב [CHtmlPurifier] [כוידג'ט](/doc/guide/basics.view#widget) או [כפילטר](/doc/guide/basics.controller#filter). כשמשתמשים בו כוידג'ט, [CHtmlPurifier] יטהר את התוכן הנמצא בתוכו בקובץ תצוגה. לדוגמא,

~~~
[php]
«?php $this-»beginWidget('CHtmlPurifier'); ?»
הצגת הודעות שהגיעו מהמשתמש כאן שיש לסנן אותם מקוד זדוני
«?php $this-»endWidget(); ?»
~~~

מניעת התקפות 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] [בהגדרות האפליקציה](/doc/guide/basics.application#application-configuration) בצורה הבאה,

~~~
[php]
return array(
    'components'=»array(
        'request'=»array(
            'enableCsrfValidation'=»true,
        ),
    ),
);
~~~

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


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

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

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


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

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

אפשרות בדיקת העוגיות כבויה כברירת מחדל. בכדי להפעילה, יש להגדיר את רכיב האפליקציה [CHttpRequest] [בהגדרות האפליקציה](/doc/guide/basics.application#application-configuration) בצורה הבאה,

~~~
[php]
return array(
    'components'=»array(
        'request'=»array(
            'enableCookieValidation'=»true,
        ),
    ),
);
~~~


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


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


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