Ér ez bármit is?
Üdvözletem!
Van egy honlapom, ami pénz és idő hiányában hosszú távra jegelve lett. A jelenlegi állapota sajnos félkész, ha nem muszáj, egyelőre nem is szeretném továbbfejleszteni. A véleményeteket szeretném kérni, hogy szerintetek, pályakezdőként, jelenlegi állapotában használható-e, mint érdemleges referencia.
A honlap címe: addonline.hu
szerk.: Egy messze nem tökéletes darabka a forrásból:
https://github.com/Chriksz/CI_user_handler/
Segítségeteket előre is köszönöm!
■ Van egy honlapom, ami pénz és idő hiányában hosszú távra jegelve lett. A jelenlegi állapota sajnos félkész, ha nem muszáj, egyelőre nem is szeretném továbbfejleszteni. A véleményeteket szeretném kérni, hogy szerintetek, pályakezdőként, jelenlegi állapotában használható-e, mint érdemleges referencia.
A honlap címe: addonline.hu
szerk.: Egy messze nem tökéletes darabka a forrásból:
https://github.com/Chriksz/CI_user_handler/
Segítségeteket előre is köszönöm!
Nem
- működő oldal, ami ref. lehet;
- nem derül ki, mennyire saját fejlesztés, mivel csináltad;
- a lábléc agyonvágja az amúgy sem tetszetős designt (Figyelem! Ez erősen szubjektív, csak a véleményem tükrözi, egy designer véleményére inkább adj!);
- a menüszerkezet kissé fura, 2 főmenü, millió "almenü", amik inkább másodlagos menük;
- az oldalon használt captcha sem tetszik nekem;
- látva a forrást, hát szeretsz szkripteket ide-oda is behányni, emellett csak névleg használod a HTML5-öt, a tag-eket nem, ez mondjuk nálam nem feltétlen hátrány, de másnak jelentheti azt, hogy gőzöd sincs a HTML5-ről.
Javaslat:
- fejezd be és működtesd az oldalt, ha működik (=használják), az referencia;
- keress egy grafikus havert, akivel ketten kipofozzátok szépre;
- írj ki rendes copyright-ot, ha van grafikus haver, az ő nevét is.
Így még - szerintem - lehet belőle referencia, főleg ha saját programozás, nem valami CMS.
Nagyon remélem, hogy építő kritikának veszed - ennek szántam, véletlenül sem bántónak.
Próbáltam különválogatni a js
jQueryt meg CodeIgnitert használtam, szóval az MVC részeit csináltam én.
ui.: A kritikának mindig jobban örülök, mint a dícséretnek. :D
Van ami jó
Nem kell sok fájl ahhoz, hogy átlátható kód legyen, és pláne nem kell a HTML különböző részein elhelyezni őket.
Számomra 2 js-hely létezik: a
<head>
-ben és közvetlenül a</body>
előtt. Szerintem ki tudod találni, hogy miért nincs szükség többre, és így a saját generált HTML-emben is gyorsan megtalálom, hogy "mik vannak ottan", nem kell keresgélni.Tehát így tetszik maga a munka, ugyan a kódminőségre (backend) nem tudok látatlanban mit mondani, de valószínűleg többet agyaltál rajta, mint WP-vel és társaival tetted volna.
Szerk.:
Annyi, hogy jó kritikából lehet tanulni, de a dicséret sem haszontalan ám, és nincs az az (értelmes) ember, akinek ne esne jól.
Szerk2.:
ha ref.-nek szánod, akkor valami impresszum-szerű oldalon nyugodtan kiírhatnád a CI-t, hogy saját DB (és milyen), stb. Tehát magáról az oldalról (is) hiányolom ezeket az infókat.
Az oldalra nem célszerű
Miért?
A WP-, stb- "feltörő" (próbálkozó) botok pedig mindenképp látogatják, nyugodtan kiírhatja. Annál is inkább, mert CI alatt mindenképp szinte biztosan egyedi megoldásokat használsz, persze ha ügyesebb vagy, akkor vannak újrahasznosítható modeljeid, controllereid, esetleg egyéb célú osztályaid, de azt megint ki tudja?
Ha azokat nem publikálod, CI-t bátran kiírhatod, egy nagyon pici, ám hasznos fw. Az meg, hogy az adatbázisod milyen motorra / táblákra épül, hány adattáblád van, szintén nem jelent semmit önmagában. Nyilván nem a felh.nevet - jelszót írod ki (mint megtette a vendégkönyvnél... :) ).
Vagy más, "reklámcélú" okból mondod, hogy nem célszerű? Mi az?
Azért, mert a feltételezhető
Amúgy aki akarja, biztos ki tudja deríteni, hogy CI, de azért az esetleges támadók dolgát se könnyítsük meg. Bizonyára a CI-nek is vannak ismert hibái, mint minden szoftvernek.
Persze, hogy vannak hibái,
A megrendelőnek az, hogy egyedi szoftvert kap, nem egy valahogy beállított "gyári" tartalomkezelőt, mindössze annyi infót jelent, hogy ha jó a kommunikáció közte és a fejlesztő közt, akkor pontosan azt kapja, amit kér, se többet, se mást, se kevesebbet.
Én ezért szeretem a CI-t, mert egyedit alkothatok, emellett könnyű újrahasznosítható kódokat írni alatta, úgyhogy nem kell minden projektnél "rabszolgáznom" az elejéről.
A megrendelõnek jelenthet
Amúgy aki akarja, biztos ki
Az esetleges támadók dolga kb. annyira nehéz, hogy be kell gépelniük, hogy builtwith.com/addonline.hu.
Kösz, nem néztem utána, a CI
És akkor mi van?
Ugyanígy a kész CMS-ek is, emellett sokan az oldalra is kiírják - önmagában szerintem semmivel sem jelent nagyobb sebezhetőséget.
A kritikának mindig jobban
Kizárólag az enyémeket :)
Egyébként meg próbáld ki: nézd meg te is az oldalt.
A szellemes szarkazmuson
Kritika alatt inkább az elemzést értettem. A dicséret alatt meg az "ügyi vagy" és más hasonló velős aforizmákat. Bár igen, a "mindig" szó lehet nem helyén való, végül is valószínűleg mindenki szereti, ha néha kicsit megsimogatják a kobakját. :D
Akkor érezd simogatva is
Íme a core
https://github.com/Chriksz/CI_user_handler
Pont a felhasználókezelés...
Addig jó, amíg a CI-s oldalad a WP-t, Joomla-t, Drupal-t, stb-t célzó botok próbálják feltörni, az egyedi kódnak pont a rejtettsége a fő védelme.
Azt hiszem, pp mondta (nem egész így, de így értek egyet): a "gyári" CMS-eket sokan fejlesztik és folyamatosan, te egyedül nem biztos, hogy írsz olyan jót. (pp szerint biztosan nem, ha jól emlékszem, hogy ő mondta.)
Tehát szerintem inkább a webshop megvalósítását kellett volna, és nem kell arra törekedned, hogy "csinosabb" legyen a hétköznapi kódodnál, egy valamire való munkáltató - szerintem - azzal kezdi, hogy OK ez szép, most megnéznénk ugyanennek a projektnek az XY részét is... És ha az Pistikés, már repültél is.
A potenciális megrendelőt pedig a kód nem érdekli, inkább az egyedi szoftverrel járó előnyök.
A honlapon nem látom, mit tüntettél fel, de lehet, hogy már vaksi vagyok.
Nem ígérek időt és nagy mélységet, de remélem, hogy átnézem a kódod valamennyire valamikor, "hátha kapsz pár jó tippet".
Én a felhasználókezelésemről csak elméleti infókat osztok meg, kódot 1-1-ben nem, legfeljebb átírva. Jobb az, ha egyedül csinálod, ha zárt forrású.
Én meg inkább pont az ilyen
Nagyon meglepne, ha nem kerülne refaktorálásra ez a kezelés még az idők folyamán. (már most is a fejemben kb. újra van írva, csak kevés az idő lepötyögni...)
Ha egy kódnak a rejtettsége a
Nem jól érted
Nyilván ettől még nem hányhatod össze, de lényegesen nehezebb úgy megtörni valamit, ha nem ismerik a forrását. Szólj, ha szerinted látatlanban könnyebb, vagy ugyanolyan, mert akkor én látom fordítva a világot. :)
Ez a kód úgy néz ki, mintha a
(Az egyébként nálam jó pont lenne, ha munkáltató lennék, hogy ha tökéletlen állapotban is, de közzéteszed; azokkal az emberekkel, akik eltitkolják, mit csináltak, amíg nem érzik úgy, hogy tökéletes, általában problémás együtt dolgozni - vö. commit hoarding. De nem ellensúlyozná azt a rossz pontot, hogy a kód úgy néz ki, ahogy :)
+1
Pár dolog azért szembetűnt (csak belepillantottam a controllerbe és a modelbe):
- Azt, hogy 3 próbálkozás után jön a captcha, én configba tenném, és nem captcha-t tennék ki, hanem mondjuk 3 percig tiltanám a próbálkozást, és ezt kiírnám egy aranyos üzenetben. Lehet, hogy van több dolog is, amit configba kéne.
- Nem szükséges a model nevében is szerepelni, hogy "model", vagy akkor a controllernél miért nincs?
- Bár bevett gyakorlat a külön só oszlop, de használhatod valamelyik (akár több) kötelező felhasználói adatot is, így csak a kódoddal együtt törhető a tábla, önmagában nem.
CAPTCHA-hoz egy ötlet
A fent említett megoldás ugyan a célzott támadás ellen nem véd, de a SPAM robotok zömét megszívatja. Ezt még azzal lehet fűszerezni, hogy X hiba után bejön a CAPTCHA, tiltás, stb...
Bocsi, de
Én pl. csinálok olyat is, hogy x másodpercen belül nem jöhet ugyanarról az IP-ről új látogató (tehát még be sincs jelentkezve, sőt, egy bizonyos session-változója sincs), ha mégis, akkor 406-ot kap. Az ismertebb keresőbotok bő perceket hagynak két indexelés között, tehát 10-20 sec. őket nem akadályozza, és amúgy is felismerhetőek a "jó botok", rájuk ez eleve nem él, csak "akit" elsőre látogatónak nézek.
A spam- és egyéb botok jellemzően létező "házi" gépnek és böngészőnek álcázzák magukat, nem árt őket kicsit lassítani. Általában az első 406 után odébbállnak.
-
A "handling" végül is
Köszönöm. Mentségemre legyen
Viszont a funkciók, változok nevezésére már itt is figyeltem, a CI szerint használva, ha lenne valamilyen szarvas e tekintettben (is) nagyon megköszönném a rámutatást.
szerk.: A hozzászólásomból nem derült ki; a kódot már rendbe tettem (legalábbis remélem).
Pl. hol kis, hol nagybetűs
Na, akkor nézzük...
Adattábla:
- én hiányolom:
UNIQUE KEY `u_email` (`u_email`)
, mert nem szokás ugyanazt az e-mailt sem kétszer engedni;- szoktam belépési időt, és előző belépési időt is tárolni (datetime), így lehet timelimit-et is belőni, ha "nem mozog" + WL-hez hasonlóan friss tartalmakat, stb.; IP címet azért, hogy kiléptessem, ha változik - szóval jócskán nagyobb nekem a "users_table";
- valamilyen plusz oszlopot (text) még mindenképp tennék hozzá, amibe esetleg szerializált egyéb adatokat lehet tenni, vagy jóval több oszlopot, mert hátha egyszer címet is akarsz kérdezni, stb., aztán a regelős formot úgy variálod, ahogy akarod;
- az
`u_reg_date` date DEFAULT NOW(),
egyszerűsítené a dolgod, és miért nem datetime?;- sót már fentebb talán írtam, hogy felesleges külön oszlopba gyártani hozzá, darabolhatsz pl. a `u_nickname`-ből, vagy felhasználhatod egy meghatározott rendben az összes NOT NULL oszlopot, stb.;
- nincs megadva táblatípus, miért? (a configok közül kihagytad a database.php-t, így az sem derül ki, milyen drivert használsz, így nem lesz rendesen értékelhető a model).
- Még két táblát hiányolok a jogosultságkezeléshez, és egyet vagy kettőt naplózáshoz és statisztikához.
Controller:
- Mivel a controllerek "controllers", a modellek "models" könyvtárban vannak, teljesen felesleges a fájlnévbe is beleírni. (Persze azonos nevű nem lehet controller és model, de a controller lehet "tagok" is, és nem kell agyonroutingolni, hogy magyar legyen...)
- Én (és a CI is) az osztályok legelején deklarálok változókat, a
__construct()
előtt, valamint a tabulátorok még mindig nem teljesek (nekem).- A form_validation osztálynak is kényelmesen meg lehet adni config fájlban a beállításait, így hatalmas a controller, többször leírod ugyanazt, és rosszul hordozható.
- Az ilyen kód kerülendő a controller-függvényekben, ki kell emelni külön függvénybe:
- Elfelejtett jelszó: mit keres a controllerben HTML kód? Szintén Template Parser Class. Nem mondom, hogy nekem sosincs ott HTML, de max. ennyi:
$this->data['message'] .= '<p>Az XXX funkciókhoz be kell jelentkezned.</p>';
. (Természetesen ezt a data tömböt kapja a végén a view réteget hívó fv., és kismillió paraméter van belegyűjtve, l. mobilnézet cikkem, az az alap.) Itt is leírod ugyanazokat a configokat, mint a bejelentkezésnél. Ha most hirtelen meg kéne oldani, hogy min. 6 karakter legyen a felhasználónév, végig kéne nyálazni az egész controllert, nem pedig egy config fájl egy sorát módosítani (esetleg két sorát, de akkor már nem elég jól gondolkodtál).Milyen tárgy ez egy e-mailnek?! (122. sor)
Nincs az e-mailnek alternatív szövege, így a felhasználó, ha csak plain/text e-mailt fogad, nem kap semmit...
- password_reset: adatbázist csak modelből bűvészkedjük (156. sor), és a sózás művelete a model egy fv-ének kellene lennie. A sózást is vagy 20x leírod, ha változtatni akarsz rajta, szinte biztos bukta, és spagetti a kód ettől a sok ismétléstől.
Kicsit bonyolultabb model, és sokkal egyszerűbb controller.
- Regisztrálás: ugyanazok a config- és e-mail hibák, mint fentebb.
- Közben meg van egy
_mailer($content, $recipient, $subject)
privát fv., ami némi átalakítással használható lenne fentiek helyett, vagy egy ehhez hasonló. De ebből is hiányzik az alt text.- Logout: mivel a táblában semmi erre vonatkozó adat nincs, elegendő a sessiont "kiirtani", de ha látogatottságot is számolsz, akkor csak az adott session-változókat kéne törölni, nem az egészet.
- A
birth_check()
és averify($name, $key)
miért publikus fv? URL-ből hívható?! Egyébként a modelben a helyük, vagy privát.- unique_check: az első ellenőrzés miatt tiltanod kell felh. névben a @ karaktert... Ez is miért public? (Jaj, lehet, hogy a form_validation-nek csak úgy jó, akkor viszont a routs-ban le kell tiltani.)
- 357. sor: elég furcsa nevet adtál a session-ben a captcha-nak... Remélem ezt nem gépelted el sehol...
- 379. sorban biztos, hogy 'fwhere' van?
Na, mostanra ennyire futotta, bocsi, de modelre már nem. A controllerből is látszik, hogy nemigazán vannak helyén a dolgok, tulajdonképpen bármi adatot előállítani is a modelben szoktam (nagyon kevés kivétellel), a controller tényleg csak vezérli az eseményeket, alapvető dolgokat ellenőriz, de már ezt is modell(ek) segítségével. Hogy átlátható legyen a vezérlő.
Modelleknél is meghatározott rend uralkodik, mi az a szint, ami felett már kiszervezem a feladatot privát fv-be, vagy írok egy saját osztályt rá.
Szerintem ezeken gondolkodj el, attól valószínű megváltozik erősen a model is, majd talán még egyszer meg nézem, de nem ígérem biztosra.
Köszönöm, köszönöm! UNIQUE
UNIQUE KEY `u_email` (`u_email`)
Jogos, ámbár mivel egyelőre csak a felh név által lehet bejelentkezni, nem adnék hozzá indexet. (@ is le van tiltva, az egyszerűség végett)
Statisztikázással nem szórakoztam, nem derült ki még a honlap fejlesztése során, mik lennének a fontos információk, így szimplán a Google felszerelésére hagyatkoztam.
`u_reg_date` date DEFAULT NOW()
Nem tudom, az adatbázis időkezelését nem ismerem, inkább PHP-ben állítottam elő őket, így biztosítva az azonos időzónákat stb.
A view-okat fogalmam sincs miért nem rendeztem külön fv-be, érdekes.
szerk. :
Validatorok kiemelve, viewok kiemelve, meg még néhány apróság.
Az idő jelenlegi állásából fakadóan könnyen elképzelhető, hogy néhány új hiba keletkezett, következő megtekintés alvásom után javasolt. :-D
Közelít
_
Ez ugye nem uppolás?!
Nem akartam uppolni, írtam
Biztonsági téren még van mit
Köszönöm, köszönöm.Template
A CI minden adatbázisba kerülő adatot escapel, ha külön nem tiltod. View-nak itt sehol nem adtam át külső adatokat.
Vagy félreértelek? Mire gondolsz ez alatt?
Félrenéztem, az emailbe kerül
A login throttlingon is lehetne fejleszteni; a támadó önbevallásán alapul, hogy kap-e captchát.
Félrenéztem, az emailbe kerül
Valójában ez sem teljesen nyers, átmegy egy reguláris szűrésen, ami számokon és aláhúzáson kívül nem enged be mást.
Igen, már tervben van, hogy készítek egy account szerinti számlálót is.
Valójában ez sem teljesen
Jogos, úgy próbáltam okoskodni, hogy nem igazán ismerem a CI-t.