1.SOP
Same Origin Policy (SOP) - czyli natywny mechanizm przeglądarki polegający na zabezpieczeniu wymiany danych przez aplikację (stronę) w obrębie tej samej i tylko tej samej domeny (origin - tego samego pochodzenia).
Cross-Origin Resource Sharing (CORS) jest mechanizmem umożliwiającym współdzielenie danych pomiędzy różnymi serwerami/aplikacjami/stronami, czyli między źródłami/biorcami o różnym pochodzeniu.
Przyjżyjmy się kilku adresom:
- http://domena.com i http://domena.com/strona/1 - te dwa adresy mają to samo pochodzenie (wspólny protokół, host i port)
- https://domena.com i http://domena.com - mają różne protokoły, a zarazem różne pochodzenie
- http://domena.com:4000 i http://domena.com - mają różne porty, a zarazem różne pochodzenie
- http://domena.com i http://subdomena.domena.com - mają różne hosty, a zarazem różne pochodzenie
Dzięki CORS i odpowiedniemu ustawieniu serwera możemy dopuścić do określonych źródeł danych wskazanych w polityce CORS serwery/domeny i pozwolić im na komunikację. Czyli zamiast byłoby . Tak to się odbywa na produkcji, a na developmencie?
Uruchamiając w odpowiedni sposób przeglądarkę lub uruchamiając odpowiedni dodatek do przeglądarki cały ten mechanizm (SOP/CORS) zostaje “pominięty”. Nie polegajmy więc jedynie na SOP i CORS jako zabezpieczeniu, ale to poza tematem.
Czemu o tym wspominam. Cóż mam trochę pomieszane instalacje i serwer apatche mam gdzie indziej, generowane strony np. z Jekyll’a mam gdzie indziej, a jakoś muszę łączyć ze sobą np. hosty na różnych portach http://localhost i http://localhost:4000. Oczywiście mogłabym ustawić wszystko w jednym miejscu, dostosować porty etc. Mogłabym, ale wiem, że nie muszę. Wyłączenie CORS sprawia, że nie muszę w ogóle o tym myśleć. Ma to swoje plusy i minusy, nad którymi nie będę się pochylać.
2.Chrome bez SOP i CORS
Wpierw w jaki sposób można uruchomić przeglądarkę Chrome
bez SOP i CORS. Okazuje się, że w bardzo prosty sposób.
- Uruchamiamy terminal.
- Sprawdzamy gdzie jesteśmy poprzez wpisanie
1 2 3
pwd # (PrintWorkingDirectory) # odpowiedź na terminalu np: /home/nazwa użytkownika
czyli wyświetl ścieżkę do obecnego (tu gdzie jest terminal) katalogu.
- Wpisujemy
1
mkdir tmp # (Make Directory)
by utworzyć w miejscu gdzie jesteśmy folder o nazwie tmp. Możemy sprawdzić wpisując np
ls -a | grep tmp
. Jeśli wyświetli namtmp
katalog został utworzony. A po co ten katalog? Podczas uruchamiania przeglądarki Chrome z nieaktywnymi zabezpieczeniami wymagane jest wskazanie katalogu. I ten nowo utworzony katalog wskażemy w kolejnym kroku. - Komenda służąca do uruchomienia z terminala Chrome to
google-chrome
. Aby uruchomić ją w trybie bez zabezpieczeń musimy użyć flagi - -disable-web-security i wskazać - -user-data-dir katalog na dane (ten co utworzyliśmy w kroku 3). Cała komenda wygląda następująco:1
google-chrome --user-data-dir="~/tmp" --diable-web-security
Uruchomi nam się nowa instacja Chrome z uwagą, że
Użyto nieobsługiwanej flagi wiersza poleceń –disable-web-security. Ma to negatywny wpływ na stabilność i zabezpieczenia
OH MY GOSH straszny komunikat. No cóż ten tryb jest przydatny .
3.WebDriver bez CORS i SOP
Musimy wziąć jedno pod uwagę. Uruchamiając przeglądarkę z Pythona
poprzez driver do testów Selenium
musimy wskazać w jakim trybie ta przeglądarka ma się uruchomić.
Domyślnie uruchomiona zostanie w trybie normalnym, czyli mechanizmy zabezpieczeń będą funkcjonować normalnie. Czasem jednak faktycznie przydaje się uruchomienie z pominięciem zabezpieczeń (tylko do celów testowych, można sobie nieźle namieszać i koniec końców zostanie nam jedynie stwierdzenie):
“ale jak to, u mnie działa”
3.1.Środowisko testowe bez SOP
Wróćmy jednak jak to zrobić, czyli środowisko testowe bez SOP.
W poprzednim wpisie wskazywałam jak uruchomić z poziomu pythona środowisko do testów.
Rozszerzymy trochę kod z tego posta poprzez dodanie do drivera odpowiednich flag:
1
2
3
4
5
6
7
8
9
10
11
12
13
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("test-type")
chrome_options.add_argument("--disable-web-security") # zabezpieczenia webowe nieaktywne
driver = webdriver.Chrome('/ścieżka/do/rozpakowanego/drivera',options=chrome_options)
driver.get("http://link.jaki.chcemy testować ")
driver.quit() # zamknij przeglądarkę po wykonaniu testów
# ----- Możemy jeszcze dodać inne opcje np. otwórz okno w określonym rozmiarze:
chrome_options.add_argument("--window-size=1920,1080")
...
Spis dostępnych flag dla chromium
4.Słowem końcowym
Wyłączenie zabezpieczeń przeglądarki wydaje się słabym pomysłem.
Tak, wiem. Nie jest to tryb do surfowania po sieci
Także w testowaniu może nam utrudnić. Musimy pamiętać w jakim celu wyłączamy zabezpieczenia. Po sprawdzeniu tego, co chcieliśmy, powinniśmy wrócić do trybu normalnego .