Logo image

Nabio sam kontroler u .env fajl.

Tokom pisanja koda na bekendu ćete sigurno naići na nešto što ne treba biti javno dostupno svima. Najčešće su to neki podaci koji su neophodni za konekciju sa bazom, ključevima za šifrovanje tokena i slično.

Međutim, šta ako ne verujete da je Vaš kod siguran i bezbedan na Vašem Git provajderu? Može li se još nešto postaviti i sakriti u .env fajlove, i ako može - šta je to, i kako se to može primeniti u Vašim projektima?

Pokazaću Vam na primeru NodeJS i Express-a kako možete i kontrolere staviti u .env fajlovima.

Kako tekst može postati funkcija?

Javaskript sam po sebi ima dosta skrpljenih i neobičnih stvari. Primera radi, ima li Vam ovo smisla:

console.log(Math.max()); // daje -Infinity
console.log(Math.min()); // daje +Infinity

E sad, postoji i još jedna funkcija koja se ne koristi toliko često, i protiv čije upotrebe se MDN i ostali relevantni sajtovi snažno zalažu - eval(). Eval kao argument prima string koji je ispravan JS kod, i izvršava ga bez ikakve kontrole. Primera radi:

console.log(eval("2+2")); // ovo daje 4

Dobro, vidi se potencijal za zloupotrebu ove funkcije, ali u slučaju kada želite da kontroler stavite u .env fajl, ova funkcija je ključna, jer bez nje se kod ne može pročitati.

.env fajlovi i NodeJS

Kao što sam ranije rekao, u .env stavljate ono što ne želite da se vidi javno u nekim Git provajderima na primer. U NodeJS-u možete upotrebiti npm da instalirate dotenv paket koji omogućava upravo to - ubacivanje privatnih stvari u .env fajlove. Kada ga instalirate, napravite .env fajl, i u njega možete staviti na primer sledeći kontroler:

GET_STUFF_CONTROLLER="(request, response, next) => {
  return response.status(417).json({
    message: 'I got you some stuff'
  });
}"

Kako bi Vam .env radio, morate sledeću stvar da uradite u glavnom fajlu Vašeg NodeJS servera:

import 'dotenv/config';

I sad u process.env.GET_STUFF_CONTROLLER imate Vaš kontroler. Hajde sad da to sve sjedinimo u jednu celinu.

Tajni kontroler u akciji

import express from "express";
import 'dotenv/config';

const app = express();
const functionCode = process.env.GET_STUFF_CONTROLLER;
const actualController = eval(functionCode);

app.get("/", actualController);

app.listen(3000, () => {
    console.log("Server works");
});

Sada i Vi možete imati tajne kontrolere u Vašem kodu, i učiniti ga dodatno bezbednim. Jedna kratka napomena samo: nisam uspeo da ovo osposobim u .NET Core, a realno ne znam ni da li C# i Java ovo podržavaju, ali mi deluje da u PHP-u sigurno imate nešto nalik ovome.