Korábban írtam, van egy picike router-em nagyon kevés RAM-mal (32 MB) és még kevesebb háttértárral (4 MB), erre pedig tettem egy LEDE disztribúciót. Az image-et saját magam állítom elő, hogy épp a szükséges csomagok és file-ok kerüljenek bele. Ugyanakkor a webes felület már nem fér fel a routerre, viszont az uhttpd https támogatással még éppen. Ezek után kitaláltam, hogy egy egyszerűsített webes felületet csinálok neki, amely első körben az alábbiakat tudja majd:
- bejelentkezés
- állapot lekérdezés
- wifi interface be-ki kapcsolás, SSID, wifi jelszó módosítás
- host PC elindítása - wake on LAN
- felhasználónév, jelszó megváltoztatása
- esetleg még ami eszembe jut, port forwarding például, IP cím modosítás, effélék
- kilépés
Ezek természetesen ssh-n keresztül elérhetők, a webes felület nem létkérdés, ugyanakkor kedvem van hozzá, így csinálgatom. A neten kerestem valami JS-mentes, csak HTML5 és CSS3 picike, egyszerű template-et, hogy ne a színek és kinézet megálmodásával menjen az idő.
PHP-m meg egyéb úri huncutságom hely hiányában nincs, marad a CGI, azon belül pedig ash és awk scriptek szerver oldalon. Kliens oldalon nem szeretnék JS-t.
A problémám az autentikációval van. Odáig megvagyok, hogy felhasználónevet illetve titkosított jelszót tárolok, ellenőrzök, user-t elhajtom a fenébe vagy beengedem az ellenőrzés eredményétől függően. A gondom a session azonosítás: ha valakit beengedtem, s ezt egy állapot változóban tárolom, akkor bárki más autentikáció nélkül is bejöhet. Az is megfelelne, ha mindenki mást elhajtanék akkor, ha egy valaki be van jelentkezve. Az a kérdésem, honnan tudja a router-em, hogy az az egy valaki adja a lekérést a router szervere felé, illetve küldi a POST-okat, akit beengedtem az autentikáció alkalmával? Ezt hogyan szokás csinálni? Ha lehet, kerülném a kliens oldali JS-t, amit lehet, szerver oldalon csinálnék ash-val, awk-val. Kész eszközök a hely hiánya miatt nem jöhetnek szóba, tehát az nem megoldás most, hogy használjam valamelyik függvénykönyvtárat. Az elv érdekel, az implementáció egyedi lenne.
- 1090 megtekintés
Hozzászólások
nem egyszerubb lenne http auth?
https://wiki.openwrt.org/doc/uci/uhttpd#basic_authentication_httpdconf
- A hozzászóláshoz be kell jelentkezni
Nem igazán működik, pedig újraindítottam a daemont. A másik bajom vele, hogy szerintem ez minden egyes cgi file futtatása előtt felhasználónevet, jelszót fog kérni majd.
Arra jutottam közben, hogy valószínűleg a cookie-kkal kell megismerkednem. Generálok valami random, hosszú valamit, eltároltatom a klienssel, visszakérem tőle, ellenőrzöm, ha ő az, akkor jöhet, ha nem, akkor meg elzavarom a login oldalra. Persze nyilván kell hozzá timeout, ellenkező esetben elfelejtett kijelentkezés esetén soha többet nem lehetne belépni.
Most egy halom CGI változót kiírattam - ezek környezeti változóként adódnak át -, szerintem itt lesz a cookie is HTTP_COOKIE néven. Már csak azt nem tudom, hogy a szervernek hogyan tudom megmondani, hogy küldjön cookie-t a kliens felé, s azt a kliens tárolja el, illetve hogyan tudom a klienstől kérni a nála tárolt cookie-t.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
"Nem igazán működik, pedig újraindítottam a daemont."
Te is tudsz basic auth-ot csinalni CGI-bol, annyit kell csak csinalni, hogy ha nincs Authorization header a keresben (vagy ha van, de rossz a usernev / jelszo), akkor visszaadsz egy
401 Unauthorized
valaszt egy
WWW-Authenticate
header-rel.
"A másik bajom vele, hogy szerintem ez minden egyes cgi file futtatása előtt felhasználónevet, jelszót fog kérni majd."
Nope, a bongeszo megjegyzi, es elkuldi minden request-hez. Ami igazan baj ezzel, hogy maceras megoldani a logout-ot (kell egy CGI ami mindig 401-et ad vissza, erre feldobja a bongeszo a login ablakot, amire neked kezzel kell beirni valamit, ami nem a jo jelszo).
"Már csak azt nem tudom, hogy a szervernek hogyan tudom megmondani, hogy küldjön cookie-t a kliens felé, s azt a kliens tárolja el, illetve hogyan tudom a klienstől kérni a nála tárolt cookie-t."
igy:
Set-Cookie: SESSION=vaKOg7M9GvoIqes1mWQbfjtybByf70yF; Expires=Tue, 8 Nov 2016 20:00 GMT; Secure; HttpOnly
. A bongeszo minden request-nel visszakuldi a cookie-t, kulon "elkerni" nem kell.
Arra meg erdemes figyelni, hogy:
- legyen eleg entropiaja a session cookie-nak (min. 128 bit, CSPRNG-vel generalva)
- allitsd be minimum a secure flaget (lasd fent)
- loginnal akkor is generalj uj cookie-t, ha a kliens kuld valamit (es ne azt tarold el), kulonben tamadhato lesz session fixation-el
- minden request-nel ellenorizd a Host: header-t hogy egyezik-e a routerevel, elkerulendo a DNS rebinding attack-et
- minden formra, ami valamit modositani tud, kell egy CSRF token is (hasonlo mint a cookie, csak a tobbi POST adattal egyutt kozlekedik)
- konstans ideju osszehasonlitast hasznalj a cookie es a jelszo ellenorezesere (hogy ezt hogy oldod meg awk-val, az egy erdekes kerdes)
- idonkent torold szerveroldalon a cookie-kat
--
"You're NOT paranoid, we really are out to get you!"
- A hozzászóláshoz be kell jelentkezni
Köszönöm szépen a hasznos ötleteket, tanulmányozom majd. :) Az idő nem sürget, magamnak csinálom, szánkózni kevésbé van kedvem kimenni a hidegben - meg még nem is esik a hó -, így inkább ezzel foglalkozom. ;)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
http://www.cgi101.com/book/ch17/
A lap aljan az erintett rfc is ottvan ha erdekel :)
---------------------------------------------------
Hell is empty and all the devils are here.
-- Wm. Shakespeare, "The Tempest"
- A hozzászóláshoz be kell jelentkezni
Köszönöm. Időközben magam is addig jutottam, hogy ez a http header-ben utazik, ott kell átadni, ahol a tartalom típusát is.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
"PHP-m meg egyéb úri huncutságom hely hiányában nincs, marad a CGI, azon belül pedig ash és awk scriptek szerver oldalon. Kliens oldalon nem szeretnék JS-t."
Kis memóriás környezetben a LUA-t ajánlom figyelmedbe. Futtathatod LUA interpreterrel (lassabb futású) vagy LUAjit-tel (meglepően gyors). Teszteltem minap, megírtam teszt célból az FFT-t tisztán PHP és tisztán LUA nyelven. A LUAjit 14-szer volt gyorsabb a PHP7-hez képest (4k FFT).
Web terén példaként nézd meg az OpenWRT-t. Szintén LUA-ban van a teljes webfelület generálva (luci).
- A hozzászóláshoz be kell jelentkezni
A LEDE, amire itt hekkelgetek, egy OpenWrt fork. Van ebben is luci, van komplett webes felület, épp csak a kb. 7200 Ft-ért vett router-em 4 MB flash-ébe nem fér bele úgy, hogy mellette ott kell lennie még egy teljes Linuxnak is. Szóval házilag szögelek, mert miért ne. Időm kevés, de az idő nem sürget, hiszen ssh-n bármit meg tudok tenni a router-rel. Mondjuk úgy, hobby, illetve azért, mert picit elegánsabb, ha legalább minimális webes felülete van. Abból indulok ki, hogy egy HTML5, CSS3 kombináció némi awk és ash scripteléssel alig néhány, esetleg néhány tíz kilobyte, annyi meg még éppen van. :)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni