Biztonságos webes fejlesztés

Fórumok

Sziasztok!

Keresek olyan könyvet vagy egyéb oktatóanyagot, ami a biztonságos PHP-MySQL-JavaScript alkalmazások fejlesztését mutatja be akár gyakorlati példákon keresztül is. Van a témában két könyvem, de mindkettő 2009/2010-es kiadásu, úgyhogy én valami olyat keresek, ami ma is aktuális lehet. 

Hozzászólások

Értem, hogy mit szeretnél, de. A fejlesztési technológiák változtak az egyik irányba, érdemes őket használni: table helyett div, css2-3-4-5..., natív app helyett valami bootstrap vagy Laravel (ne!) + doctrine. A biztonságtechnika pedig elmozdult (a világ által indukálva) egy másik dimenzióban valamerre. Spam-ek ellen küzdünk, biztonságos beléptetés kell, de már nem SMS, hanem pl. Google Authenticator. Ezt összefoglaló szakirodalomból nehéz megtalálni, mert ahogy létezik LAMP (mert összefügg), nem létezik "Világ minden problémájára megoldás" könyv. A developer skilleket neked kell secu. skillekkel kiegészíteni.

Már ha biztonság alatt ugyanazt értjük. Ha mégis félreértettem és hibatűrő, könnyen ellenőrizhető, fast-deploy + dont break alkalmazást csinálnál, akkor könnyebb a dolgod: valamelyik hithű keretrendszert kiválasztod... majd rájössz hogy írni kellene egy sajátot... majd mégis választasz egy lightwight fajtát. De ezen az úton neked kell végigmenni.

----------------------------

ps: bocs, kijött belőlem.

Saját minden?! :O Fentebb azt hittem, hogy mondjuk Symfonyt ajánlasz neki. Saját dolgok írásából persze sokat lehet tanulni, de végül mind szemétdombra kerül. Hacsak nem próbálsz ki minden elérhető megoldást és írsz egy jobbat, de ez elég ritka.

Ha a biztonságon van a hangsúly, akkor OWASP top 10 mondjuk kiindulásnak jó lesz, aztán utánanézhet, hogy azokra milyen standard megoldások vannak (pl. prepared statement: PDO -> Doctrine DBAL -> Doctrine ORM).

Table-k helyett már régóta div-eket használok és CSS-t, de azokat a legtöbbször nem én írom meg. Sosem használtam keretrendszereket, mert a saját kódomat jobban ismerem, így az általános célokra mindig saját keretrendszert készítettem. Amiben szeretnék fejlődni és új dolgokat tanulni, az főleg az adatbázisokban tárolt személyes adatok védelme és az alkalmazás réseinek a minimalizálása (az XSS-en és az SQL-Injection-ön felül), illetve a legújabb programozási megoldások ismerete (példa: kezdetben $HTTP_GET_VARS['valami']-t kellett használnom, majd később már $_GET['valami']), mert a PHP 5.x-nél leragadtam és az elmúlt években nem volt energiám követni, hogy mi lett benne depricated és removed.

A biztonságos beléptetés, stb. már másik tészta lenne, de a célom az lenne első sorban, hogy amit írok és felrakom egy szerverre annak ne legyen tele a logja a depriciated bejegyzésekkel és ma is biztonságosnak minősített függvényeket használjak.

Ha table helyett divet használsz nem lesz biztonságosabb az oldal vagy a web app, nincs összefüggés.

Ellenőrízd szigorúan az öszes bemenő paramétert (POST, GET, PUT, SESSION, stb) szűrd, castold, ugyanezt játszd el azokkal a változókkal is amiket az sql lekérdezésekben használsz, és már sokat tettél az alkalmazás biztonságáért.

A keretrendszerek ebben (is) segítenek, megoldásokat szállítanak a fentiekre (is) persze ezeket is lehet nem, vagy rosszul használni. Attól hogy valami keretrendszerben - laravel, zend, stb - készült még jelenti azt hogy biztonságosabb mint egy saját motor.

Jó hozzáállásnak tartom, hogy zavarnak a szerver logban a deprecated bejegyzések. Állítsd a saját környezetedben ugyanazt a szószátyár módot vagy magasabbat mint ami az éles helyen is van, és amire azt mondja hogy deprecated azt meg kell kerseni és ki kell cserélni a jelenleg ajánlott nem elavult cuccra.

A kész alkalmazást be lehet vizsgáltatni erre szakosodott szakikkal is, ha még a forrást is odaadod nekik elemezgetni, még hatékonyabban tudnak kötözködni:) Persze ez plusz költségekkel jár, és így sem lesz 100% a biztonság, mert soha nem az.

Webes biztonság témakörében - ha még nem ismernéd - az OWASP közösség írásai kötelezők: https://owasp.org

OWASP TOP10: https://owasp.org/www-project-top-ten/
Cheat sheet-ek: https://owasp.org/www-project-cheat-sheets/cheatsheets/

Ha használsz valamilyen keretrendszert, akkor érdemes annak az API-ját teljes körűen megismerni és használni, mert egy csomó biztonsági funkciót már ezzel megkapsz (pl input validáció, XSS/CSRF protection, stb).

Vagy keress rá erre: serverless

Itt kiesik a PHP és MySQL, viszont emiatt is biztonságosabb. Marad helyette a Javascript, HTML, CSS. De nem mindenre jó.

Szerkesztve: 2020. 01. 29., sze – 09:48

A leggyengébb láncszem az ember, nem az adott programnyelv vagy framework. Tanuld meg, hogyan lehet leültetni/kihasználni a rendszert/alkalmazást => ültess le/használj ki egy tesztrendszert, alakíts ki egy mini lab környezetet dedikáltan erre a saját hálózatodban.
Az OWASP 10 pedig valóban alap. Ha innen indulsz ki 1 lépést tettél előre a biztonság felé a többi pedig sok gyakorlás és tanulás után alakul ki. Rengeteg kapcsolódó anyag van. A legelső lépés egyébként bármerre is, a keresők használatának megtanulása, hogyan találsz publikus információkat (akár tananyagokat is), amelyek tálcán kínálnak neked mindent....

Érdekes lehet abból a szempontból is mérlegelni, hogy mi ezzel a célod.

  • Saját hobbialkalmazást szeretnél készíteni, saját szerveren működtetve, mindentől és mindenkitől függetlenül, és azért PHP--MySQL--JavaScript, mert ezeket legalább már láttad, míg egyéb webes technikákkal eddig nem foglalkoztál?
  • Vagy új állást szeretnél és abból indulsz ki, hogy a PHP--MySQL--JavaScript ma megfelelő "buzzword-ök", de még nincs konkrét ajánlatod, és csak abban bízol, hogy találsz olyan állásajánlatot, ami megéri neked, és pont ezt a tudáshalmazt keresik?
  • Már létező, az említett technológiákra épülő projektbe szállnál be -- juniorként?
  • Már létező, az említett technológiákra épülő projektbe szállnál be -- megváltóként, akitől a projekt többi tagja azt reméli tőled, hogy az általuk évek óta barkácsolt, már a kezdetektől elavult, "saját kódos" tákolmányból hosszabb távon is működtethető, biztonságos, esetleg eladható terméket tudnátok nemesíteni?

Lehet, hogy nem is igazán arra kellene koncentrálnod, hogy a PHP--MySQL--JavaScript keretein belül ismerd meg az aktuális biztonsági (és egyéb "best practice") ajánlásokat és véleményeket (néha csak: divatokat), hanem az absztraktabb trendeket is meg kéne vizsgálnod, hogy értsd, mit miért csinálnak: pl. OAuth/2stepAuth, Serverless/SaaS stb.

(Azt már csak zárójelben biggyesztem ide, anélkül, hogy bármi konkrétumot tudnék a motivációdról, hogy hátha valami mobilfejlesztéses irány még hasznosabb lenne, mondjuk a Flutter, és akkor nem kell "elfelejteni" az elavult tudást, hanem tiszta lappal kezdhetsz. Rengeteg lehetőség van, mind számtalan előnnyel és hátránnyal.)

Jogos a kérdés :) Kb. 12 éve írok PHP alapú dolgokat. Főleg mindig az aktuális munkahelyeimnek belső használatra "vállalatirányítási" rendszert és egyéb olyan dolgokat, amit központosítani kell, illetve filléres költségvetésű alapítványi honlapokat és kislátogatottságú híroldalt. Minden esetben a legjobb tudásom szerint védem a bemenő adatokat (GET,POST) és validálom, mielőtt az bármilyen SQL lekérdezésben megjelenhetne. Illetve az oldalak külön látogatói és külön adminisztrációs felületekkel rendelkeznek, külön aldomaineken, így a látogató oldalnak csaki kizárólag olvasási funkciói vannak és admin felületre is kitaláltam egy sajátos jelszóellenőrzési módot, mert az ördög nem alszik. Viszont ha egyszer kapnék egy olyan ajánlatot, ahol már mondjuk a felhasználónak regisztrálnia kellene, esetleg webáruházot létrehozni, amiben már ugye személyes adatokat is kellene tárolni és azt a legjobban védeni, akkor legyen hozzá megfelelő tudásom, ami nélkül nem vállalnám el a munkát. Webáruházat létre tudnék hozni minden további nélkül, de hogy az úgy működjön, egy programhiba miatt ne érje anyagi kár se a felhasználót, se a tulajdonost (tranzakciókezelésről van kisebb tapasztalatom, de szerintem nem elég), illetve ha esetleg napvilágot lát egy PHP-bug, akkor ne tudjanak könnyen hozzáférni a MySQL adattáblákhoz.

Nincsen konkrét ajánlat, de ha lenne, akkor nem szeretném a megfelelő ismeretanyag hiánya miatt elutasítani.

Mobilfejlesztésben nem gondolkodom. 

EDIT: Meg persze, az eddig fejlesztéseimet is szeretném mégbiztonságosabbá tenni.

"a bemenő adatokat (GET,POST) és validálom, mielőtt az bármilyen SQL lekérdezésben megjelenhetne"

--> van egy többlépéses módszer, de ekkor strukturálisan nem hibázhatsz, így nem kell jól/rosszul validálnod se.
    1. prepare
    2. változók hozzákötése. Lásd: https://www.php.net/manual/en/pdostatement.bindparam.php
    3. execute

Megjegyzem, a magáról biztonságosságot hírdető Rust esetén szintén ezt a módszert javasolják: https://docs.rs/mysql/17.0.0/mysql/

Szerintem:

  • modern PHP framework használata erősen javasolt 
    • és a $_GET-ek helyett az abban lévő Request osztályok alkalmazása
    • továbbá a mysql parancsok helyett a framework saját ORM vagy ODM moduljaival kommunikálj az adatbázisokkal  
  • a többiek által írt OWASP-os oldalakon lévő tartalmak tanulmányozása
  • a futattó környezet is ugyanolyan fontos, tehát OS folyamatos/időszakos frissítése
  • biztonságos nginx, apache, php beállítások (alapból nem teljesen azok)
  • használj Code Analysis-t (pl. PHP_CodeSniffer, Sonarqube, Code Climate, stb.)
  • hiába leszel alapos, ha máshol van egy pici rés ahol beférnek a szerverbe, pl. egy másik Wordpress alapú oldal egy "noname" pluginja által
  • futtass web vulnerability scanner-t, Google-en keress rá (Pl. Acunetix, de vannak ingyenesek is)
    • bár óvatósan az ingyenesekkel, mert ha valami "indiai-kínai", akkor lehet meg is jegyzi magának ha talál valamit
    • az Acunetix jó, de éles rendszerre ráengedve az ott talált form-okat több ezerszer is kitöltheti és így több ezer e-mailt generálhat

Egy senior programozó sem tud mindig mindenre figyelni ezért vállalati környezetben mindenképpen ajánlott kód analizáló és weboldal sérülékenység vizsgáló rendszerek alkalmazása.