Ko mesece ali celo leta vlagaš svoj trud in neprespane noči v razvoj kompleksnega projekta – kot je moj simulator z več tisoč vrsticami kode – se neizogibno srečaš z vprašanjem: Kako to kodo zaščititi pred radovednimi očmi?
Če pustiš vse na klientski strani (v brskalniku), tvegaš, da bo vsak malo bolj radoveden obiskovalec z enim samim pritiskom na tipko F12
videl celotno tvoje delo. Lahko ga prekopira, si ga prisvoji ali pa preprosto izbrska tvoje rešitve.
Ideja: Premaknimo logiko na backend z Node.js
Prišel sem na logično idejo: Skrijmo kodo na strežnik! Z uporabo Node.js bi strežnik procesiral zahteve v ozadju, uporabnik pa bi na zaslon dobil le končne rezultate. Na papirju je bil načrt popoln in začetna implementacija je obetala veliko.
Na začetku je vse delovalo super. Osnovne stvari – HTML, CSS, JavaScript in MySQL povezave – so delovale brez težav. Res je, da se je vse skupaj nalagalo malenkost dlje, kot če bi klasično bral neposredno iz SQL baze, ampak to je bila cena varnosti, ki sem jo bil pripravljen plačati.
Težave v praksi: Ko strežnik izgubi sapo
Težave pa so se začele, ko sem želel pognati zahtevnejše dele aplikacije. PHP moduli, kot so Napredna orodja, Sistemska orodja in delo s časom, preprosto niso želeli sodelovati. Namesto tekočega delovanja sem dobil samo neprekinjen niz napak.
// Kritična napaka v ozadju procesa Fatal error: Allowed memory size exhausted in system_tools.php Server process terminated unexpectedly.
Najhuje pa je bilo to, kar je sledilo ob testiranju. Ko sem vsak takšen zahteven primer poskusil zagnati 3- do 4-krat zaporedoma, se je celoten strežnik preprosto sesul. Node.js proces je zaradi neulovljenih izjem padel, spletna stran pa je v tistem trenutku postala popolnoma nedosegljiva za vse obiskovalce.
Nauk zgodbe: Stabilnost je pred varnostjo
Pri klasičnem PHP-ju ali lokalnem JavaScriptu napaka običajno prizadene le tistega uporabnika, ki jo je sprožil. Pri Node.js pa sesutje procesa pomeni "smrt" za celotno spletno stran, dokler storitve ročno ne zaženeš znova. Za produkcijsko stran je to seveda nesprejemljivo.
Zato sem sprejel pomembno odločitev in se vrnil nazaj k lokalnemu, dinamičnemu JavaScriptu. Tukaj so ključne ugotovitve te izkušnje:
- Stabilnost je na prvem mestu: Če se koda izvaja lokalno v brskalniku, morebitna napaka ne bo nikoli sesula celotnega strežnika.
- Hitrejše nalaganje: Brez nepotrebnih strežniških zahtev za vsak klik se stran odziva bliskovito hitro.
- Alternativna zaščita kode: Namesto zapletanja sistema z Node.js je za zaščito kode bolje uporabiti dobre obfuskatorje (kodiranje kode), ki jo naredijo neberljivo za nepooblaščeno kopiranje.