Aplikacje WWW Krzysztof Ciebiera 3 kwietnia 2014
Bezpieczeństwo Clickjacking CSRF Cross site scripting (XSS) Migracje ContentType Tłumaczenia Testowanie - RequestFactory
Clickjacking Użytkownik odwiedza zła stronę. Strona zawiera przezroczyste tło w postaci iframe. Użytkownik klika na link z z-index = -1. Zobaczmy przykład (clickjacking.html)
Jak się możemy zabezpieczyć Możemy używać nagłówka X-Frame-Options DENY - strona nie może być wyświetlana w ramce SAMEORIGIN - strona może być wyświetlana w tej samej domenie ALLOW-FROM uri - strona może być wyświetlana z uri (uwaga!! to nie jest jeszcze wspierane)
Technicznie MIDDLEWARE_CLASSES = (... django. middleware. c l i c k j a c k i n g. XFrameOptionsMiddleware,... ) ========= from django. h t t p import HttpResponse from django. views. decorators. c l i c k j a c k i n g xframe_ options_ exempt import @xframe_options_exempt def ok_to_load_in_a_frame ( request ) : return HttpResponse ( " This page i s safe to load " " i n a frame on any s i t e. " )
Jak działa CSRF Ciasteczko CSRF jest ustawiane na losowa wartość. Ukryte pole formularza csrfmiddlewaretoken jest ustawiane przez programistę w szablonie. Dla wszystkich żadań nie używajacych HTTP GET, HEAD, OPTIONS lub TRACE ciasteczko CSRF musi być ustawione przez przegladarkę i musi się pokrywać z polem csrfmiddlewaretoken. W przeciwnym wypadku mamy bład 403.
Cross site scripting (XSS) name = " < s c r i p t > a l e r t ( h e l l o ) < / s c r i p t > " Hello, { { name } }. > Hello, < s c r i p t > a l e r t ( h e l l o ) </ s c r i p t > Zmiany: < < > > (single quote) ' "(double quote) " & & Uwaga Nie zadziała dla: var = class1 onmouseover= j a v a s c r i p t : func ( ) ; ==== < s t y l e class = { { var } } >... < / s t y l e >
Migracje Migracje to sposób na zarzadzanie zmianami w strukturze modeli w ORM. migrate, zastosowuje migrację, wycofuje migrację wypisuje status migracji. makemigrations, tworzy nowa migrację w oparciu o zmiany w modelach. Migracje s a oddzielne dla każdej z aplikacji (więc część aplikacji może ich nie używać).
Przebieg pracy $ python manage. py makemigrations M i g r a t i o n s for books : 0003_auto. py : A l t e r f i e l d author on book $ python manage. py migrate Operations to perform :... Synchronizing apps w i t h o u t m i g r a t i o n s : Creating t a b l e s... Running m i g r a t i o n s : Applying books.0003 _auto... OK
Jak wyglada migracja schemat from django. db import migrations, models class M i g r a t i o n ( m i g r a t i o n s. M i g r a t i o n ) : dependencies = [ ( " m i g r a t i o n s ", " 0001 _ i n i t i a l " ) ] operations = [ m i g r a t i o n s. DeleteModel ( " T r i b b l e " ), m i g r a t i o n s. AddField ( " Author ", " r a t i n g ", models. I n t e g e r F i e l d ( d e f a u l t =0)) ]
Jak wyglada migracja dane from django. db import models, m i g r a t i o n s def combine_names ( apps, schema_ editor ) : Person = apps. get_model ( " app ", " Person " ) for person in Person. o b j e c t s. a l l ( ) : person. name = "%s %s " % ( person. first_name, person. last_name ) person. save ( ) class M i g r a t i o n ( m i g r a t i o n s. M i g r a t i o n ) : dependencies = [ ( app, 0001 _ i n i t i a l ), ] operations = [ m i g r a t i o n s. RunPython ( combine_names ), ]
ContentType model ContentType Aplikacja contenttypes definiuje model ContentType. Jego instancje reprezentuja informacje o innych modelach. Sa tworzone automatycznie wraz z modelami. ContentType pozwala na tworzenie generycznych aplikacji (np. admin) jak również generycznych dowiazań (np. komentarze)
ContentType przykład >>> from django. c o n t r i b. contenttypes. models import >>> user_type = ContentType. o b j e c t s. get ( app_label= " >>> user_type <ContentType : user > >>> user_type. g e t _ o b j e c t _ f o r _ t h i s _ t y p e ( username= Gu >>> user_type. model_class ( ) <class django. c o n t r i b. auth. models. User > <User : Guido >
Tłumaczenia Aby projekt w Django był automatycznie tłumaczony oznaczamy część tekstów jako przeznaczone do tłumaczenia. Django udostępnia mechanizmy pozwalajace na zapisanie oznaczonych tekstów w plikach messages. Po przetłumaczeniu tych plików translacja następuje automatycznie.
Tłumaczenia przykład from django. u t i l s. t r a n s l a t i o n import u g e t t e x t as _ from django. h t t p import HttpResponse def my_view ( request ) : output = _ ( " Welcome to my s i t e. " ) return HttpResponse ( output ) def my_view ( request ) : words = [ Welcome, to, my, s i t e. ] output = _ (. j o i n ( words ) ) return HttpResponse ( output ) def my_view ( request ) : # T r a n s l a t o r s : This message appears on the home output = u g e t t e x t ( " Welcome to my s i t e. " )
Tłumaczenia przykład szablony < t i t l e >{% t r a n s " This i s the t i t l e. " %}</ t i t l e > < t i t l e >{% t r a n s myvar %}</ t i t l e > {% b l o c k t r a n s %} This s t r i n g w i l l have { { value } } i n s i d e. {% endblocktrans %} {% b l o c k t r a n s w ith amount= a r t i c l e. p r i c e count years= That w i l l cost $ { { amount } } per year. {% p l u r a l %} That w i l l cost $ { { amount } } per { { years } } years {% endblocktrans %}
Tłumaczenia proces tłumacznia django admin. py makemessages l p l p l i k. po # : path / to / python / module. py :23 msgid " Welcome to my s i t e. " msgstr " " django admin. py compilemessages
Testowanie HTTP from django. c o n t r i b. auth. models import User from django. t e s t import TestCase from django. t e s t. c l i e n t import RequestFactory class SimpleTest ( TestCase ) : def setup ( s e l f ) : s e l f. f a c t o r y = RequestFactory ( ) s e l f. user = User. o b j e c t s. create_user ( username= jacob, email= jacob@..., password= top_secret ) def t e s t _ d e t a i l s ( s e l f ) : request = s e l f. f a c t o r y. get ( / customer / d e t a i l s ) request. user = s e l f. user response = my_view ( request ) s e l f. assertequal ( response. status_code, 200)