Beveilig uw applicaties door gegevens op aanvraagniveau te valideren met behulp van de Joi-validatiebibliotheek.

Het accepteren van niet-geteste en niet-gevalideerde gegevens in een webtoepassing kan beveiligingsproblemen veroorzaken en er kunnen onvoorziene problemen ontstaan ​​door de ongeldige gegevens.

Met Node.js ORM's, zoals Sequelize en TypeORM, kunt u standaard validatieregels instellen op applicatieniveau. Tijdens de ontwikkeling van API's komen gegevens van HTTP-verzoeken naar specifieke eindpunten. Dit gebeurt op aanvraagniveau; de standaardvalidatie die door de ORM's wordt aangeboden, is dus niet op hen van toepassing.

Joi is een schemabeschrijving en gegevensvalidator voor JavaScript. Hier leert u hoe u de Joi-validatiebibliotheek gebruikt om gegevens op aanvraagniveau te valideren.

Demoproject opzetten

Om aan te tonen hoe Joi data valideert, bouw je een eenvoudige demo-applicatie die een daadwerkelijke applicatie nabootst.

Maak eerst een projectmap en ga ernaartoe door de volgende opdracht uit te voeren:

instagram viewer
mkdir demo-app && cd demo-app

Initialiseer vervolgens npm in uw projectdirectory door het volgende uit te voeren:

npm begin -y

Vervolgens moet u enkele afhankelijkheden installeren. De vereiste afhankelijkheden voor deze zelfstudie omvatten het volgende:

  • Nadrukkelijk: Express is een Node.js-framework dat een robuuste set functies biedt voor web- en mobiele applicaties. Express maakt het eenvoudiger om backend-applicaties te bouwen met Node.js.
  • Joi: Joi is een gegevensvalidatiebibliotheek voor Node.js.

Installeer de afhankelijkheden met de knooppuntpakketbeheerder door de onderstaande opdracht uit te voeren:

npm installeren express joi

Maak vervolgens een index.js bestand in uw hoofdmap en voeg het volgende codeblok eraan toe:

const uitdrukken = vereisen("nadrukkelijk");
const router = vereisen("./routes");
const poort = 3000;

const app = uitdrukken();

app.gebruik (express.json());
app.gebruik (express.urlencoded({ verlengd: WAAR }));
app.gebruik (router);

app.listen (poort, () => {
troosten.log("app luistert op poort 3000!");
});

Het bovenstaande codeblok stelt een eenvoudige Express-server in. Het configureert middleware om inkomende verzoekgegevens te ontleden en inkomende verzoeken af ​​te handelen en start de server om te luisteren naar inkomende verzoeken op poort 3000.

Verzoeken routeren en afhandelen

Voor de eenvoud maakt u een middleware voor verzoekhandler die een statuscode retourneert, samen met de hoofdtekst van het verzoek, als antwoord op elk verzoek dat probeert gegevens naar uw toepassing te verzenden.

Maak een handler.js bestand in de hoofdmap van uw project en voeg het onderstaande codeblok toe:

const demoHandler = (req, res, volgende) => {
opnieuw verzenden({
code: 201,
gegevens: aanvraaglichaam,
});
volgende();
};

moduul.exports = demoHandler;

Maak vervolgens een router.js bestand in de hoofdmap van uw project en voeg het onderstaande codeblok toe aan uw bestand:

const uitdrukken = vereisen("nadrukkelijk");
const demoHandler = vereisen("./handler");
const router = expres. Router();

router.post("/aanmelden", demoHandler);

moduul.export = router;

Een Joi-schema maken

Een Joi-schema vertegenwoordigt de verwachte structuur en validatieregels van een specifiek data-object.

Om een ​​Joi-schema te maken, kunt u de Joi.object() methode en keten verschillende validatieregels die door Joi zijn weergegeven om de structuur en validatievereisten voor uw gegevens te definiëren.

Bijvoorbeeld:

const voorbeeldSchema = Joi.object({
naam: Joi.string().min(3).vereist(),
});

Het bovenstaande voorbeeld beschrijft een eenvoudig Joi-schema met een naam eigendom. De naam onroerend goed heeft een waarde van Joi.string().min (3).required(). Dit betekent dat de naam waarde moet een tekenreeks zijn met een minimumlengte van 3 tekens en is vereist.

Met behulp van Joi kunt u verschillende methoden koppelen om meer validatiebeperkingen toe te voegen aan elk veld dat in uw schema is gedefinieerd.

Hier is een voorbeeld met meer velden en validatiebeperkingen:

const userSchema = Joi.object({
e-mail: Joi.string().email().required(),

wachtwoord: Joi.string().min(6).vereist(),

leeftijd: Joi.getal().min(18).optioneel(),

werkzaam: Joi.boolean().optioneel(),

telefoon: Joi.string()
.regex(/^\\d{3}-\\d{3}-\\d{4}$/)//"123-456-7890"
.vereist(),

adres: Joi.object({
straat: Joi.string().min(3).vereist(),
stad: Joi.string().min(3).vereist(),
staat: Joi.string().min(3).vereist(),
zip: Joi.nummer().min(3).vereist(),
}).vereist(),

 hobby's: Joi.array().items (Joi.string()).required(),

}).opties({ afbrekenVroeg: vals });

De gebruikerSchema definieert de volgende beperkingen voor elke eigenschap:

  • e-mailen: Moet een geldige e-mailstring zijn.
  • wachtwoord: Moet een tekenreeks zijn met minimaal 6 tekens.
  • leeftijd: Een optioneel getal met een minimumwaarde van 18.
  • in dienst: Een optionele Booleaanse waarde.
  • telefoon: Een vereiste tekenreeks die overeenkomt met de opgegeven regex-expressie (/^\d{3}-\d{3}-\d{4}$/).
  • adres: Een object dat het adres van de gebruiker vertegenwoordigt met de volgende subeigenschappen.
    • straat: Een vereiste tekenreeks met een minimale lengte van 3 tekens.
    • stad: Een vereiste tekenreeks met een minimale lengte van 3 tekens.
    • staat: Een vereiste tekenreeks met een minimale lengte van 3 tekens.
    • ritssluiting: Een verplicht getal met een minimumwaarde van 3.
  • hobby's: Een vereiste reeks tekenreeksen.

Naast de beperkingen, gebruikerSchema stelt de afbrekenVroeg optie om vals. Joi stopt standaard de uitvoering van het programma zodra het de eerste fout tegenkomt en drukt de fout af naar de console. Als u deze optie echter instelt op vals zorgt ervoor dat Joi het volledige schema controleert en alle aangetroffen fouten naar de console afdrukt.

Gegevens valideren met Joi

Maak een validatie.js bestand en voeg de gebruikerSchema codeer ernaar.

Zoals zo:

//validation.js
const Joi = vereisen("joi");

const userSchema = Joi.object({
//...
}).opties({ afbrekenVroeg: vals });

moduul.exports = gebruikersSchema;

Maak vervolgens een middleware die payloads van verzoeken onderschept en deze verifieert aan de hand van een verstrekt schema door de volgende code toe te voegen onder de gebruikerSchema code.

const validatieMiddleware = (schema) => {
opbrengst(req, res, volgende) => {
const { error } = schema.validate (req.body);

als (fout) {
// Omgaan met validatiefout
troosten.log (foutmelding);

res.status(400.json({ fouten: fout details });
} anders {
// Gegevens zijn geldig, ga verder met de volgende middleware
volgende();
}
};
};

Wanneer een verzoek wordt gedaan, roept de middleware het valideren methode van de schema om de aanvraaginstantie te valideren. Als er validatiefouten optreden, stuurt de middleware een 400 slecht verzoek antwoord met de foutmeldingen die zijn geëxtraheerd uit de validatiefoutdetails.

Aan de andere kant, als de validatie zonder fouten verloopt, roept de middleware de volgende() functie.

Exporteer ten slotte de validatieMiddleware En gebruikerSchema.

moduul.export = {
gebruikerSchema,
validatieMiddleware,
};

Validatiebeperkingen testen

Importeren validatieMiddleware En gebruikerSchema in jouw router.js bestand en stel de middleware als volgt in:

const {validationMiddleware, userSchema} = vereisen("./geldigmaking");

router.post("/aanmelden", validatieMiddleware (userSchema), demoHandler);

Start uw toepassing door de onderstaande opdracht uit te voeren:

knooppuntinhoudsopgave.js

Maak vervolgens een HTTP POST-verzoek aan localhost: 3000/aanmelding aan de hand van onderstaande testgegevens. U kunt dit bereiken met cURL of een andere API-client.

{
"e-mail": "gebruiker@voorbeeld", // Ongeldige email formaat
"wachtwoord": "doorgang", // Wachtwoordlengte minder dan 6 tekens
"leeftijd": 15, // Leeftijd onder de 18
"in dienst": WAAR,
"hobby's": ["lezing", "rennen"],
"telefoon": "123-456-789", // Ongeldig telefoonnummerformaat
"adres": {
"straat": "123",
"stad": "Voorbeeld stad",
"staat": "Voorbeeld staat",
"zip": 12345
}
}

Dit verzoek mislukt en retourneert een foutobject omdat de payload veel ongeldige velden bevat, zoals e-mail, wachtwoord, leeftijd en telefoon. Met behulp van het meegeleverde foutobject kan dat omgaan met de fouten op gepaste wijze.

Gegevensvalidatie vereenvoudigen met Joi

Hier heb je de meeste basisprincipes van gegevensvalidatie behandeld met behulp van Joi. U kunt echter meer geavanceerde technieken en beperkingen behandelen in de Joi-documentatie.

Joi vereenvoudigt de gegevensvalidatietaak in JavaScript en biedt een intuïtieve oplossing die de betrouwbaarheid en integriteit van gegevens die in uw toepassing zijn opgeslagen aanzienlijk verbetert.