ÐезопаÑноÑÑÑ Ð²ÐµÐ±-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Django
ÐаÑиÑа полÑзоваÑелÑÑÐºÐ¸Ñ Ð´Ð°Ð½Ð½ÑÑ - Ð²Ð°Ð¶Ð½Ð°Ñ ÑаÑÑÑ Ð¿ÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð»Ñбого веб-ÑайÑа.Ранее Ð¼Ñ ÑаÑÑмаÑÑивали некоÑоÑÑе наиболее ÑаÑпÑоÑÑÑанÑннÑе ÑгÑÐ¾Ð·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи в Ñеме Ðеб безопаÑноÑÑÑ. Рданной ÑÑаÑÑе бÑÐ´ÐµÑ Ð¿ÑедÑÑавлена пÑакÑиÑеÑÐºÐ°Ñ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑÐ¸Ñ Ñого, как вÑÑÑоеннÑе Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ñ Ð·Ð°ÑиÑÑ Django's обÑабаÑÑваÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑгÑозÑ.
| ТÑебованиÑ: | ÐÑоÑиÑайÑе ÑÐµÐ¼Ñ Ðеб безопаÑноÑÑÑ. ÐавеÑÑиÑе изÑÑение пÑедÑдÑÑÐ¸Ñ ÑаÑÑей ÑÑководÑÑва до Ð ÑководÑÑво ÑаÑÑÑ 9: РабоÑа Ñ ÑоÑмами вклÑÑиÑелÑно. |
|---|---|
| ЦелÑ: | ÐонÑÑÑ, ÑÑо нÑжно делаÑÑ (или наобоÑÐ¾Ñ Ð½Ðµ делаÑÑ), Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи ваÑего веб-пÑиложениÑ. |
ÐбзоÑ
Тема Ðеб безопаÑноÑÑÑ ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð·Ð½Ð°Ñение безопаÑноÑÑи веб-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÑоекÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑеÑвеÑного пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸ некоÑоÑÑе из наиболее ÑаÑпÑоÑÑÑанÑннÑÑ ÑгÑоз, Ð¾Ñ ÐºÐ¾ÑоÑÑÑ Ð²Ð°Ð¼ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð·Ð°ÑиÑа. Ðдна из клÑÑевÑÑ Ð¸Ð´ÐµÐ¹ ÑÑой ÑÐµÐ¼Ñ ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо пÑакÑиÑеÑки вÑе аÑаки бÑдÑÑ ÑÑпеÑнÑ, еÑли веб-пÑиложение довеÑÑÐµÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑким даннÑм (напÑÐ¸Ð¼ÐµÑ Ð´Ð°Ð½Ð½Ñм из бÑаÑзеÑа).
ÐÑедÑпÑеждение: Ðаиболее важнÑй ÑÑок, коÑоÑÑй Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑвоиÑÑ, ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом - ÑÑо никогда не ÑÑÐ¾Ð¸Ñ Ð´Ð¾Ð²ÐµÑÑÑÑ Ð¿ÐµÑеданнÑм полÑзоваÑелем даннÑм. Ðни вклÑÑаÑÑ Ð² ÑÐµÐ±Ñ GET паÑамеÑÑÑ Ð² URL, Ñело POST запÑоÑа, HTTP заголовки, cookies, загÑÑженнÑе полÑзоваÑелем даннÑе и Ñ.д. ÐÑегда пÑовеÑÑйÑе и обÑабаÑÑвайÑе вÑе Ð²Ñ Ð¾Ð´Ð½Ñе даннÑе. ÐÑегда гоÑовÑÑеÑÑ Ðº Ñ ÑдÑемÑ.
ХоÑоÑей новоÑÑÑÑ Ð´Ð»Ñ Ð²ÑÐµÑ ÑазÑабоÑÑиков, иÑполÑзÑÑÑÐ¸Ñ Django, ÑвлÑеÑÑÑ Ñо, ÑÑо болÑÑинÑÑво извеÑÑнÑÑ Ð°Ñак обÑабаÑÑваеÑÑÑ ÑÑеймвоÑком! СÑаÑÑÑ ÐезопаÑноÑÑÑ Ð² Django (Django docs) опиÑÑÐ²Ð°ÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи Django и ÑÑÑаÑегии заÑиÑÑ Ð²ÐµÐ±-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑазÑабоÑанного на данном ÑÑеймвоÑке.
РаÑпÑоÑÑÑанÑннÑе ÑгÑозÑ/меÑÐ¾Ð´Ñ Ð·Ð°ÑиÑÑ
ÐÑ Ð½Ðµ бÑдем дÑблиÑоваÑÑ Ð´Ð¾ÐºÑменÑаÑÐ¸Ñ Django и в данной ÑÑаÑÑе пÑодемонÑÑÑиÑÑем некоÑоÑÑе оÑновнÑе меÑÐ¾Ð´Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи в конÑекÑÑе ÑазÑабаÑÑваемого в данном ÑÑководÑÑве пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LocalLibrary.
ÐежÑайÑовÑй ÑкÑипÑинг (XSS)
XSS ÑÑо ÑеÑмин, пÑименÑÑÑийÑÑ Ð´Ð»Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÐºÐ»Ð°ÑÑа аÑак, позволÑÑÑего аÑакÑÑÑемÑ, ÑеÑез веб-ÑÐ°Ð¹Ñ Ð²Ð½ÐµÐ´ÑиÑÑ ÑкÑипÑÑ, коÑоÑÑе бÑдÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð½Ð° ÑÑÑÑойÑÑве заÑедÑего на ÑÑÑаниÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. ЧаÑÑо ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑеÑез ÑÐ¾Ñ Ñанение вÑедоноÑного кода в базе даннÑÑ , оÑкÑда даннÑй код бÑÐ´ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÑн и вÑполнен Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑивÑего некие даннÑе полÑзоваÑÐµÐ»Ñ (ÑипиÑнÑй пÑÐ¸Ð¼ÐµÑ - ÑÐ¾Ñ Ñанение Ñега <script> Ñ Ð²ÑедоноÑнÑм кодом в комменÑаÑии, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑвидеÑÑ Ð´ÑÑгой полÑзоваÑелÑ). ÐÑÑгой векÑÐ¾Ñ Ð°Ñаки - в Ñом ÑÑÐ¾Ð±Ñ ÑгенеÑиÑоваÑÑ Ð¾Ð¿ÑеделÑннÑÑ ÑÑÑлкÑ, пÑи клике на коÑоÑÑÑ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð·Ð°Ð¿ÑÑÑÐ¸Ñ Ð²Ñполнение некоего замаÑкиÑованного кода JavaScript в ÑвоÑм бÑаÑзеÑе.
СиÑÑема Ñаблонов Django заÑиÑÐ°ÐµÑ Ð¾Ñ Ð±Ð¾Ð»ÑÑинÑÑва XSS-аÑак, ÑкÑаниÑÑÑ Ð¾Ð¿ÑеделÑннÑе ÑимволÑ, ÑÑиÑаÑÑиеÑÑ "опаÑнÑми" в HTML. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пÑодемонÑÑÑиÑоваÑÑ ÑÑо, попÑÑавÑиÑÑ Ð²Ð½ÐµÐ´ÑиÑÑ Ð¿ÑоизволÑнÑй JavaScript-код в наÑе пÑиложение LocalLibrary ÑеÑез ÑоÑÐ¼Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð²ÑоÑа, ÑозданнÑÑ Ð² Ð ÑководÑÑво ÑаÑÑÑ 9: РабоÑа Ñ ÑоÑмами.
-
ÐапÑÑÑиÑе веб-ÑайÑ, иÑполÑзÑÑ ÑеÑÐ²ÐµÑ ÑазÑабоÑки (
python3 manage.py runserver). -
ÐÑкÑойÑе ÑÐ°Ð¹Ñ Ð² ваÑем бÑаÑзеÑе и войдиÑе под аккаÑнÑом ÑÑпеÑ-полÑзоваÑелÑ.
-
ÐеÑейдиÑе на ÑÑÑаниÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°Ð²ÑоÑа (она должна бÑÑÑ Ð´Ð¾ÑÑÑпна по URL:
http://127.0.0.1:8000/catalog/author/create/). -
ÐведиÑе даннÑе об имени и Ñамилии, даÑÐ°Ñ ÑÐ¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ ÑмеÑÑи авÑоÑа. ÐаÑем добавÑÑе ÑледÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð² поле Ñамилии:
<script>alert('Test alert');</script>.
ÐÑимеÑание: ÐÑо безобиднÑй ÑкÑипÑ, коÑоÑÑй, еÑли бÑÐ´ÐµÑ Ð²Ñполнен, оÑобÑÐ°Ð·Ð¸Ñ Ð¾ÐºÐ½Ð¾ Ñ ÑообÑением "Test alert" в ваÑем бÑаÑзеÑе. ÐÑли данное окно оÑобÑажаеÑÑÑ Ð¿Ñи оÑкÑÑÑии ÑÑÑаниÑÑ Ñ Ñозданной подобнÑм обÑазом запиÑÑÑ - знаÑÐ¸Ñ ÑÐ°Ð¹Ñ ÑÑзвим пеÑед аÑаками XSS.
-
ÐажмиÑе Submit Ð´Ð»Ñ ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи.
-
ÐоÑле ÑÐ¾Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð°Ð²ÑоÑа - он должен бÑÑÑ Ð¾ÑобÑажÑн, как показано ниже. Так как ÑÑабоÑала заÑиÑа Ð¾Ñ XSS - команда
alert()не бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑена. ÐмеÑÑо ÑÑого ÑкÑÐ¸Ð¿Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑобÑажаÑÑÑÑ ÐºÐ°Ðº обÑÑнÑй ÑекÑÑ.
ÐÑли Ð²Ñ Ð¿Ð¾ÑмоÑÑиÑе иÑÑ
однÑй HTML код, Ð²Ñ ÑвидиÑе, ÑÑо "опаÑнÑе" ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ - напÑÐ¸Ð¼ÐµÑ Ñакие как Ñкобки Ñегов - бÑли Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ Ð½Ð° иÑ
безопаÑнÑе ÑквиваленÑнÑе html ÑÑÑноÑÑи (к пÑимеÑÑ > на >)
<h1>
Author: Boon<script>alert('Test alert');</script>, David
(Boonie)
</h1>
ÐÑполÑзование Ñаблонов Django заÑиÑÐ°ÐµÑ Ð²Ð°Ñ Ð¾Ñ Ð±Ð¾Ð»ÑÑинÑÑва XSS-аÑак. Ðднако ÑÑÑеÑÑвÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ заÑиÑÑ, пÑи коÑоÑом ÑкÑаниÑование не бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки пÑименÑÑÑÑ ÐºÐ¾ вÑем полÑм, коÑоÑÑе не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑдÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелем(к пÑимеÑÑ, поле help_text обÑÑно заполнÑеÑÑÑ Ð½Ðµ полÑзоваÑелем, поÑÑÐ¾Ð¼Ñ Django не бÑÐ´ÐµÑ ÑкÑаниÑоваÑÑ ÐµÐ³Ð¾ знаÑение).
Так же XSS-аÑаки могÑÑ Ð±ÑÑÑ Ð¾ÑÑÑеÑÑÐ²Ð»ÐµÐ½Ñ ÑеÑез дÑÑгие ненадÑжнÑе иÑÑоÑники даннÑÑ , Ñакие как cookies, ÑÑоÑонние ÑеÑвиÑÑ Ð¸Ð»Ð¸ загÑÑженнÑе ÑÐ°Ð¹Ð»Ñ (и пÑоÑие иÑÑоÑники, даннÑе коÑоÑÑÑ Ð½Ðµ бÑли ÑпеÑиалÑно обÑабоÑÐ°Ð½Ñ Ð¿ÐµÑед оÑобÑажением на ÑÑÑаниÑе). ÐÑли Ð²Ñ Ð¾ÑобÑажаеÑе даннÑе из ÑÑÐ¸Ñ Ð¸ÑÑоÑников, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð²Ð°Ñ ÑобÑÑвеннÑй обÑабоÑÑик Ð´Ð»Ñ ÑилÑÑÑаÑии даннÑÑ .
ÐежÑайÑÐ¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÐ»ÐºÐ° запÑоÑа (CSRF)
CSRF аÑаки позволÑÑÑ Ð°ÑакÑÑÑÐµÐ¼Ñ Ð²ÑполнÑÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ дÑÑгого полÑзоваÑÐµÐ»Ñ Ð±ÐµÐ· его ÑоглаÑиÑ. ÐапÑимеÑ, пÑедположим ÑÑо еÑÑÑ Ñ Ð°ÐºÐµÑ, коÑоÑÑй Ñ Ð¾ÑÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð°Ð²ÑоÑов в наÑе пÑиложение LocalLibrary.
ÐÑимеÑание: ÐÑевидно, ÑÑо Ð½Ð°Ñ Ñ Ð°ÐºÐµÑ Ð´ÐµÐ»Ð°ÐµÑ ÑÑо не Ñади денег! Ðолее амбиÑиознÑе Ñ Ð°ÐºÐµÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð¿Ð¸ÑÑваемÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ опаÑнÑÑ Ð·Ð°Ð´Ð°Ñ (напÑимеÑ, пеÑÐµÐ²Ð¾Ð´Ñ Ð´ÐµÐ½ÐµÐ³ полÑзоваÑелей на Ð¸Ñ Ð»Ð¸ÑнÑе ÑÑеÑа и Ñ.д).
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑделаÑÑ ÑÑо, Ñ Ð°ÐºÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑоздаÑÑ HTML Ñайл, подобнÑй пÑодемонÑÑÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ Ð½Ð¸Ð¶Ðµ, коÑоÑÑй бÑÐ´ÐµÑ ÑодеÑжаÑÑ ÑоÑÐ¼Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð°Ð²ÑоÑа (Ð¿Ð¾Ñ Ð¾Ð¶ÑÑ Ð½Ð° ÑÑ, ÑÑо Ð¼Ñ ÑазÑабаÑÑвали в пÑедÑдÑÑÐ¸Ñ ÑаÑÑÑÑ ÑÑководÑÑва), коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑпÑавлена как ÑолÑко даннÑй Ñайл бÑÐ´ÐµÑ Ð·Ð°Ð³ÑÑжен в бÑаÑзеÑ. Ð¥Ð°ÐºÐµÑ Ð¾ÑпÑÐ°Ð²Ð¸Ñ Ð´Ð°Ð½Ð½Ñй Ñайл вÑем ÐиблиоÑекаÑÑм и бÑÐ´ÐµÑ Ð¶Ð´Ð°ÑÑ Ð¿Ð¾ÐºÐ° кÑо-либо из Ð½Ð¸Ñ Ð¾ÑкÑÐ¾ÐµÑ Ñайл (он ÑодеÑÐ¶Ð¸Ñ ÑолÑко безобиднÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑеÑÑно!). ÐÑли Ñайл бÑÐ´ÐµÑ Ð¾ÑкÑÑÑ Ð»ÑбÑм залогиненнÑм полÑзоваÑелем, Ñ Ð¿Ñавами ÐиблиоÑекаÑÑ - Ñогда ÑоÑма бÑÐ´ÐµÑ Ð¾ÑпÑавлена Ð¾Ñ ÐµÐ³Ð¾ имени и ÑоздаÑÑ Ð½Ð¾Ð²Ð¾Ð³Ð¾ полÑзоваÑелÑ.
<html>
<body onload="document.EvilForm.submit()">
<form
action="/proxy/127.0.0.1:8000/catalog/author/create/"
method="post"
name="EvilForm">
<table>
<tr>
<th><label for="id_first_name">First name:</label></th>
<td>
<input
id="id_first_name"
maxlength="100"
name="first_name"
type="text"
value="Mad"
required />
</td>
</tr>
<tr>
<th><label for="id_last_name">Last name:</label></th>
<td>
<input
id="id_last_name"
maxlength="100"
name="last_name"
type="text"
value="Man"
required />
</td>
</tr>
<tr>
<th><label for="id_date_of_birth">Date of birth:</label></th>
<td>
<input id="id_date_of_birth" name="date_of_birth" type="text" />
</td>
</tr>
<tr>
<th><label for="id_date_of_death">Died:</label></th>
<td>
<input
id="id_date_of_death"
name="date_of_death"
type="text"
value="12/10/2016" />
</td>
</tr>
</table>
<input type="submit" value="Submit" />
</form>
</body>
</html>
ÐапÑÑÑиÑе веб-ÑеÑÐ²ÐµÑ ÑазÑабоÑки и войдиÑе в аккаÑÐ½Ñ ÑÑпеÑ-полÑзоваÑелÑ. СкопиÑÑйÑе пÑиведÑннÑй вÑÑе ÑекÑÑ Ð² Ñайл и заÑем оÑкÑойÑе его в бÑаÑзеÑе. ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð»ÑÑиÑÑ CSRF оÑибкÑ, поÑÐ¾Ð¼Ñ ÑÑо Ñ Django еÑÑÑ Ð·Ð°ÑиÑа Ð¾Ñ Ð°Ñак данного вида!
ÐеÑ
анизм заÑиÑÑ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑо Ð²Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑе Ñег Ñаблона {% csrf_token %} в ваÑÑ ÑоÑмÑ. ÐÑÐ¾Ñ Ñокен бÑÐ´ÐµÑ Ð¾ÑобÑажÑн в ваÑем HTML как показано ниже, Ñо знаÑением, ÑникалÑнÑм Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запÑаÑиваÑÑего ÑоÑÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
<input
type="hidden"
name="csrfmiddlewaretoken"
value="0QRWHnYVg776y2l66mcvZqp8alrv4lb8S8lZ4ZJUWGZFA5VHrVfL2mpH29YZ39PW" />
Django генеÑиÑÑÐµÑ ÑникалÑнÑй Ð´Ð»Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ/бÑаÑзеÑа Ñокен и оÑклонÑÐµÑ Ð²Ñе ÑоÑмÑ, коÑоÑÑе не ÑодеÑÐ¶Ð°Ñ ÐµÐ³Ð¾ или ÑодеÑÐ¶Ð°Ñ ÐµÐ³Ð¾ невеÑное знаÑение.
ÐÐ»Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ вида аÑак, Ñ Ð°ÐºÐµÑ ÑепеÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ найÑи и добавиÑÑ Ð²ÐµÑнÑй CSRF Ñокен Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ вÑбÑанного ÑелÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑ. ÐÑо ознаÑаеÑ, ÑÑо Ñ Ð°ÐºÐµÑ ÑепеÑÑ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¼Ð°ÑÑовÑе ÑаÑÑÑлки одного вÑедоноÑного Ñайла вÑем ÐиблиоÑекаÑÑм, Ñак как Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из Ð½Ð¸Ñ CSRF Ñокен бÑÐ´ÐµÑ ÑникалÑнÑм.
ÐаÑиÑа Django Ð¾Ñ CSRF аÑак по ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÐºÐ»ÑÑена. Ðам вÑегда ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ñег{% csrf_token %} в ваÑиÑ
ÑоÑмаÑ
и иÑполÑзоваÑÑ POST Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, коÑоÑÑе могÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸ÑÑ Ð¸Ð»Ð¸ добавиÑÑ Ð´Ð°Ð½Ð½Ñе в ваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
ÐÑÑгие аÑаки
Django Ñак же пÑедоÑÑавлÑÐµÑ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ð²Ð¸Ð´Ð¾Ð² аÑак ( демонÑÑÑаÑÐ¸Ñ Ð±Ð¾Ð»ÑÑинÑÑва из коÑоÑÑÑ Ð±Ñла Ð±Ñ Ñложна новиÑкам Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¸ не ÑлиÑком полезна ):
- ÐаÑиÑа Ð¾Ñ SQL инÑекÑии
-
УÑзвимоÑÑÑ SQL инÑекÑии позволÑÐµÑ Ð°ÑакÑÑÑÐµÐ¼Ñ Ð²ÑполниÑÑ Ð¿ÑоизволÑнÑй SQL код в базе даннÑÑ Ð¸ полÑÑиÑÑ Ð´Ð¾ÑÑÑп к даннÑм (пÑоÑиÑаÑÑ, оÑÑедакÑиÑоваÑÑ Ð¸ измениÑÑ) незавиÑимо Ð¾Ñ ÑекÑÑÐ¸Ñ Ð¿Ñав доÑÑÑпа полÑзоваÑелÑ. РболÑÑинÑÑве ÑлÑÑаев Ð²Ñ Ð±ÑдеÑе полÑÑаÑÑ Ð´Ð¾ÑÑÑп к даннÑм Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , иÑполÑзÑÑ ÑÑÑноÑÑи queryset/model Django. ÐÑполÑзÑÑ Ð¸Ñ Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑаÑии SQL запÑоÑов, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе коÑÑекÑно ÑÑоÑмиÑованнÑй и ÑкÑаниÑованнÑй запÑÐ¾Ñ Ð´Ð»Ñ Ð²ÑбÑанной Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ . ÐÑли вам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ пиÑаÑÑ "ÑÑÑÑе" запÑоÑÑ, вам Ñак же нÑжно бÑÐ´ÐµÑ Ð¿ÑодÑмаÑÑ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð¸Ð½ÑекÑий.
- ÐаÑиÑа Ð¾Ñ Ðликджекинга
-
Рданном виде аÑак аÑакÑÑÑий пеÑÐµÑ Ð²Ð°ÑÑÐ²Ð°ÐµÑ Ð²Ð²Ð¾Ð´ на видимом Ñлое ÑÑÑаниÑÑ Ð¸ пеÑенапÑавлÑÐµÑ Ð¸Ñ Ð½Ð° ÑкÑÑÑÑй Ñлой под ним. ÐÑÐ¾Ñ Ð¼ÐµÑод Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован к пÑимеÑÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¾ÑиÑиалÑного ÑайÑа банка, Ñ Ð¿ÐµÑÐµÑ Ð²Ð°Ñом даннÑÑ Ð´Ð»Ñ Ð²Ñ Ð¾Ð´Ð° в невидимом
<iframe>, коÑоÑÑй конÑÑолиÑÑÐµÑ Ð°ÑакÑÑÑий. Django ÑодеÑÐ¶Ð¸Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ ÐºÐ»Ð¸ÐºÐ´Ð¶ÐµÐºÐ¸Ð½Ð³Ð° в видепÑомежÑÑоÑного пÑогÑамного обеÑпеÑÐµÐ½Ð¸Ñ (middleware) X-Frame-Options,коÑоÑÑй поддеÑживаеÑÑÑ Ð±ÑаÑзеÑами и Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿ÑеÑиÑÑ Ð¾ÑобÑажение ÑÑÑаниÑÑ Ð²Ð½ÑÑÑи<iframe>. - SSL/HTTPS
-
SSL/HTTPS Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзован на веб-ÑеÑвеÑе Ð´Ð»Ñ ÑиÑÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñего ÑÑаÑика Ð¼ÐµÐ¶Ð´Ñ ÑеÑвеÑом и полÑзоваÑелем, вклÑÑÐ°Ñ Ð´Ð°Ð½Ð½Ñе Ð²Ñ Ð¾Ð´Ð°, коÑоÑÑе инаÑе бÑдÑÑ Ð¾ÑпÑавлÑÑÑÑÑ ÐºÐ°Ðº обÑÑнÑй ÑекÑÑ (коÑоÑÑй ÑÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑиÑаÑÑ Ð»Ñбой пеÑÐµÑ Ð²Ð°ÑивÑий запÑÐ¾Ñ Ñеловек). ÐÑполÑзование HTTPS вÑÑоко Ñекомендовано. ÐÑли иÑполÑзÑеÑÑÑ HTTPS, Django позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑледÑÑÑие меÑÐ¾Ð´Ñ Ð·Ð°ÑиÑÑ:
SECURE_PROXY_SSL_HEADERÐ¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ÑполÑзовано Ð´Ð»Ñ Ð¿ÑовеÑки ÑÑо вÑегда иÑполÑзÑеÑÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñное подклÑÑение, даже еÑли даннÑе поÑÑÑпаÑÑ Ð¸Ð· пÑокÑи, иÑполÑзÑÑÑего пÑоÑокол оÑлиÑнÑй Ð¾Ñ HTTP.SECURE_SSL_REDIRECTиÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑенапÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑÐµÑ Ð·Ð°Ð¿ÑоÑов Ñ HTTP на HTTPS.- ÐÑполÑзÑйÑе HTTP Strict Transport Security (HSTS). ÐÑÐ¾Ñ HTTP заголовок инÑоÑмиÑÑÐµÑ Ð±ÑаÑÐ·ÐµÑ Ð¾ Ñом, ÑÑо вÑе поÑледÑÑÑие запÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²Ñегда иÑполÑзоваÑÑ HTTPS. СовмеÑÑно Ñ Ð¿ÐµÑенапÑавлением HTTP запÑоÑов на HTTPS, ÑÑа опÑÐ¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾Ð±ÐµÑпеÑиÑÑ Ð¸ÑполÑзование HTTPS в каждом запÑоÑе. HSTS Ð¼Ð¾Ð¶ÐµÑ Ñак же бÑÑÑ Ð½Ð°ÑÑÑоен опÑиÑми
SECURE_HSTS_SECONDSиSECURE_HSTS_INCLUDE_SUBDOMAINSили на веб-ÑеÑвеÑе. - ÐÑполÑзÑйÑе 'безопаÑнÑе' cookies вÑÑÑавив
SESSION_COOKIE_SECUREиCSRF_COOKIE_SECUREвTrue. ÐÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð¾Ð±ÐµÑпеÑиÑÑ Ð¿ÐµÑеÑÑÐ»ÐºÑ Ð´Ð°Ð½Ð½ÑÑ cookies ÑолÑко ÑеÑез пÑоÑокол HTTPS.
- ÐалидаÑÐ¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Host
-
ÐÑполÑзÑйÑе
ALLOWED_HOSTSÑÑÐ¾Ð±Ñ Ð¿ÑинимаÑÑ ÑолÑко запÑоÑÑ Ð¾Ñ Ð´Ð¾Ð²ÐµÑеннÑÑ Ñ Ð¾ÑÑов.
Так же ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво дÑÑÐ³Ð¸Ñ ÑÐµÑ Ð½Ð¸Ðº заÑиÑÑ Ð¸ Ñказаний по Ð¸Ñ Ð¸ÑполÑзованиÑ. ÐÑ Ð½Ð°Ð´ÐµÐµÐ¼ÑÑ, ÑÑо Ð´Ð°Ð½Ð½Ð°Ñ ÑÑаÑÑÑ Ð´Ð°Ð»Ð° вам понимание, какие ÑÐµÑ Ð½Ð¸ÐºÐ¸ Django пÑÐµÐ´Ð»Ð°Ð³Ð°ÐµÑ Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи. ÐÑ Ð½Ð°Ð´ÐµÐµÐ¼ÑÑ, ÑÑо Ð²Ñ Ð¿ÑодолжиÑе изÑÑение ÑÑого вопÑоÑа по докÑменÑаÑии Django.
Ðодводим иÑоги
Django Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÐ¾Ð´Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ ÑаÑпÑоÑÑÑанÑннÑÑ Ð²Ð¸Ð´Ð¾Ð² аÑак, вклÑÑÐ°Ñ XSS и CSRF аÑаки. Рданной ÑÑаÑÑе Ð¼Ñ Ð¿ÑодемонÑÑÑиÑовали, как ÑазлиÑнÑе Ð²Ð¸Ð´Ñ Ð°Ñак обÑабаÑÑваÑÑÑÑ Django на пÑимеÑе наÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ LocalLibrary. ÐÑ Ñак же кÑаÑко ÑаÑÑмоÑÑели дÑÑгие Ð²Ð¸Ð´Ñ ÑÑзвимоÑÑей и меÑÐ¾Ð´Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð½Ð¸Ñ .
ÐÑо бÑло оÑÐµÐ½Ñ ÐºÑаÑкое погÑÑжение в вопÑÐ¾Ñ Ð²ÐµÐ±-безопаÑноÑÑи. ÐÑ ÐºÑайне ÑекомендÑем вам пÑоÑиÑаÑÑ ÐезопаÑноÑÑÑ Ð² Django Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ глÑбокого пониманиÑ.
СледÑÑÑим и поÑледним Ñагом в данном ÑÑководÑÑве бÑÐ´ÐµÑ Ð²Ñполнение ÑамоÑÑоÑÑелÑной ÑабоÑÑ.
СмоÑÑиÑе Ñакже
In this module
- Django introduction
- Setting up a Django development environment
- Django Tutorial: The Local Library website
- Django Tutorial Part 2: Creating a skeleton website
- Django Tutorial Part 3: Using models
- Django Tutorial Part 4: Django admin site
- Django Tutorial Part 5: Creating our home page
- Django Tutorial Part 6: Generic list and detail views
- Django Tutorial Part 7: Sessions framework
- Django Tutorial Part 8: User authentication and permissions
- Django Tutorial Part 9: Working with forms
- Django Tutorial Part 10: Testing a Django web application
- Django Tutorial Part 11: Deploying Django to production
- Django web application security
- DIY Django mini blog