HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

  • sdani: Oh... néha eszembe jut, hogy az EBI után esetleg vissza kellene menni valamennyire az akadémiai vo... (2025.03.18. 16:58) Pontos, jól behatárolt célok
  • legyen úgy: Szia, Értem és köszönöm a válaszodat! T. (2025.02.24. 18:23) Expose CTF
  • sdani: Sajnos nekem is hasonló érzéseim vannak az R kiszorulásával kapcsolatban. Remélem jobban fogja tar... (2024.04.29. 10:48) R meetup
  • sdani: Nagyon jók ezek a bejegyzések! Feszültséggel teli, fordulatos, mint egy jobb krimi. :D Abba ne hag... (2024.04.29. 10:35) Wgel CTF
  • sdani: @Travis.CG: Egy kis szerencse sosem árt. :D (2024.03.01. 13:19) A bioinformatika helyzete 2024-ben

Online adat, offline adat

2025.02.15. 17:06 Travis.CG

Az interneten fellelhető adatok egy része könnyen letölthető. Ezek HTML-be vannak ágyazva, esetleg már eleve valami könnyen emészthető fájlként ülnek a szerveren és egy link mutat rájuk. Ebben az esetben a wget vagy curl segítségével simán megszerezhetjük a nekünk kellő információt. Csakhogy egyes tartalmakat a tulajdonosai nem szeretik, ha letöltik. Ilyenkor különböző trükköket vetnek be, hogy a wget kuradcot valljon.

Jó kérdés, hogy amihez jogom van, hogy megnézzem, letölthetem-e? Mert mi van, ha csak ideiglenes hozzáférésem van az adathoz? Akkor ha letöltöm, akkor is tudom nézni, ha már lejárt a hozzáférésem, nem igaz? Az érem másik oldala, hogy nincs mindig net. Milyen jó lenne, ha valamit offline is nézhetnék, amikor jogom van hozzá. Aztán ha lejárt a láthatási idő, szépen becsülettel letörölném, mert én olyan vagyok.

Ezért amit most leírok, azt mindenki becsülettel használja, és ne warezolásra. Ahogy mondani szokás, amit leírok, azt csak "edukációs céllal teszem". Sőt, ahol tudom, azt is leírom, hogyan lehet megvédeni az adatokat.

Az első védelmi vonal, hogy különböző cookie-kkal ellenőrzik, hogy a felhasználó jogosult-e a tartalom letöltésére (például bejelentkezett-e). Habár a wget-nek is beállíthatunk cookie-kat, azok beállítása körülményes. Szerencsére a böngészők segítenek. Ha megvan a vágyott link, amit szeretnénk letölteni, de lusták vagyunk a cookie-kat beállítani, akkor a Developers módban a Network fülön az adott elemre ha jobb egégombbal kattintunk, akkor van egy "copy as cURL" (Windows-osoknak copy as Powershell), és kimásolja nekünk az egész linket parancssorral együtt. Az élet szép.

A második védelmi vonal, hogy igyekeznek elrejteni az adatot. Az adatok csak ritkán vannak szépen HTML tag-ek közé téve. A legtöbbször JavaScripttel vannak megbolondítva, vagyis a JavaScript módosítja a DOM-ot. Ha csak ész nélkül letöltjük az oldalt, kapunk egy obfuszkált kódot, de adatot nem.

Itt is a böngésző Developers módjának a segítségére vagyunk utalva. Az Inspector fülön láthatjuk a HTML melyik része felelős az adott struktúra megjelenítéséért. Szépen odanavigálunk, ami nekünk kell, jobb egérgomb, és a menüből a Screenshot node-al képként elmenthetjük a weboldal azon, és csak azon részét. Reklámok és idegesítő bannerek nélkül csak a lényeget kapjuk.

Ez ellen úgy lehet védekezni, hogy a tartalmat több darabra vágjuk, és a felhasználó interakciójától függően mindig csak egy részét mutatjuk. A manuális munka dögunalom, az emberek el fogják unni a developers-ben a munkát és feladják.

Az eddig bemutatott módszerek nem működnek például videomegosztó oldalakon. Ott előszeretettel használnak iframe-et is a JavaScript mellett. Egyrészt a videó beágyazható a segítségével más oldalra, másrészt nehezebb letölteni. De a Develper Tools még ebben az esetben is segítségünkre lehet. A videó ugyanis több darabban van, folyamatosan kell töltögetni az egyes részleteket. Ezt kell kihasználni!

A Network fülön láthatjuk, milyen kommunikáció zajlik a böngésző és a szerver között. A videoadat pedig folyamatosan töltődik. Itt egy hibát lehet elkövetni: az egyes részeket megszámozzák, méghozzá az adatok sorrendjében. Ha az URL-ek egy logikus sorrend szerint következnek, akkor lehet rá írni egy for ciklust és wget-el máris letölthetjük az egészet. Például:

for i in `seq 0 200`
do
  wget https://server/34342-werwer-32r423/chunk_$i.mp4
done

Utána meg ffmpeg-el összefűzzük a darabokat.

Ezt úgy lehet megakadályozni, hogy minden egyes darab egyedi, a többi darab alapján megjósolhatatlan azonosítót kap. Nincs stabil URL, hanem minden egyes bejelentkezésnél egyedi URL-t generálnak szerver oldalon. A nagyobb tartalomszolgáltatók így is csinálják.

Úgy tűnik, a kézi módszer az egyetlen, amivel megszerezhetjük a JavaScript bástyákkal körbevett adatot? Semmi esély rá, hogy automatizáljuk a letöltést? Hiszen úgy tűnik, a böngésző az egyetlen platform, ami képes megjeleníteni a tartalmakat, miután iframe és JavaScript hegyeken kell átverekedni magunkat.

Igen, a böngésző az egyetlen, ami képes erre, ezért a böngészőt kell programozni. Azért nem kell megijedni, nincs szükség, hogy a semmiből írjunk egy új böngészőt. A Firefox és a Chrome is futtatható headless módban, ami annyit jelent, hogy nem klikkeléssel vezéreljük, hanem szkriptből.

Több módszer is van a böngészők vezérlésére, én most a Firefox/Selenium szimbiózist fogom bemutatni. A szkript és a böngésző közé kell egy driver, ami megteremti a kapcsolatot a két egység között. Linux alatt például a Gecko driver szükséges. Python oldalról pedig a Selenium modul. Ha minden megvan, kezdődhet a móka.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

driver = webdriver.Firefox()

Ennek hatására elindul a böngésző. Fontos tudni, hogy az AJAX-nak és az iframe-eknek idő kell, hogy betöltődjenek, ezért célszerű várakozási időt beépíteni. A legegyszerűbb az implicit várakozási idő beállítása.

driver.implicitly_wait(5)
driver.get("http://xxxxxx.com/")

Ha betöltődött az oldal, ki kell választani az elemet, amit szeretnénk letölteni. Ehhez a find_element metódust használhatjuk. Elemeket számtalan módon azonosíthatunk (név, osztály, tag alapján), a By osztály használatával.

div = driver.get_element(By.TAG_NAME, "div")
div2 = driver.get_element(By.ID, "first")

Ha megvan az elem, akkor kinyerhetjük az általa tárolt adatot a text metódussal. Ha végeztünk a feldolgozással, zárjuk le a kapcsolatot.

driver.close()

A Selenium sokkal többre is képes, mint amit itt bemutattam. Emulálhatunk benne klikkelést, vagy egyéb felhasználói tevékenységet, hogy teljesen elhitessük az oldallal, hogy nem programmal kommunikál. Ez ellen CAPTCHA-val lehet védekezni.

Szólj hozzá!

Címkék: biztonság programozás

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr8318446019

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása