充分的數(shù)據(jù)保護和用戶保密是網(wǎng)頁開發(fā)者的主要責(zé)任。因此,在構(gòu)建 API 終端時,確保最高可能的安全性至關(guān)重要。
應(yīng)用程序安全是客戶端和服務(wù)器開發(fā)者共同的責(zé)任,一方的疏忽可能會造成災(zāi)難性后果。統(tǒng)計數(shù)據(jù)顯示,2023 年的數(shù)據(jù)泄露導(dǎo)致全球超過 800 萬個數(shù)據(jù)記錄暴露。
在本文中,我將重點介紹 API 安全的關(guān)鍵領(lǐng)域,其中包括數(shù)據(jù)驗證。這個概念對幫助您保護 API 免受通過惡意用戶數(shù)據(jù)進行的網(wǎng)絡(luò)攻擊非常重要。這個教程非常適合所有后端開發(fā)者,無論經(jīng)驗多少。
為了能夠跟隨本教程,這里有一些先決條件:
- Node.js 知識
- npm 和包安裝知識
有了這些準(zhǔn)備,讓我們開始吧。
(本文內(nèi)容參考:java567.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-851917.html
數(shù)據(jù)驗證是如何工作的?
首先,什么是數(shù)據(jù)驗證?數(shù)據(jù)驗證簡單來說就是確保來自外部來源的數(shù)據(jù)在進行進一步數(shù)據(jù)處理之前的準(zhǔn)確性和可靠性。
這是 Web API 安全的關(guān)鍵組成部分,因為它對于防止網(wǎng)絡(luò)注入攻擊、SQL 攻擊和 NoSQL 攻擊至關(guān)重要。要了解更多信息,您可以查看此鏈接。
請注意,數(shù)據(jù)驗證不僅僅需要在以下后端操作中進行:
- 用戶登錄和注冊
- 響應(yīng)查詢
- 更新服務(wù)器數(shù)據(jù)庫
所有這些都可能被惡意黑客利用,以獲取對服務(wù)器數(shù)據(jù)庫的訪問權(quán)限,并獲取敏感用戶詳細(xì)信息,甚至通過格式化整個數(shù)據(jù)庫來制造混亂。
流行的數(shù)據(jù)驗證工具
到目前為止,有很多工具可以幫助程序員在 API 開發(fā)中實現(xiàn)高效的數(shù)據(jù)驗證。
它們幫助您避免重新發(fā)明驗證數(shù)據(jù)的長正則表達式代碼的輪子。它們提供了大量功能,包括錯誤處理和驗證定制功能。
其中一些工具包括:
- Joi
- Zod
- Yup
- AJv
- Valibot
- Validator.js
- Superstruct
為了進一步闡明這些工具,我們將比較上述最受歡迎的數(shù)據(jù)驗證工具中的一些。
數(shù)據(jù)驗證工具的優(yōu)缺點
為了進一步讓您了解這些 JavaScript 驗證工具,我將重點介紹其中三種流行的 JavaScript 驗證工具的一些優(yōu)缺點。
Joi
優(yōu)點
- 擁有強大的、龐大的用戶社區(qū)和開發(fā)支持
- 具有處理復(fù)雜驗證的內(nèi)置功能
缺點
- 其語法相當(dāng)冗長
Zod
優(yōu)點
- 與 TypeScript 項目輕松兼容
- 具有高效的錯誤處理能力
缺點
- 不支持異步驗證。
Yup
優(yōu)點
- 主要使用聲明性語法設(shè)置其驗證工具,從而賦予其簡單性
- 具有可比較的快速性能。
缺點
- 不提供自定義功能
- 其處理復(fù)雜驗證的能力有限
為了本教程的目的,我們將使用 Joi 作為我們的數(shù)據(jù)驗證工具。
簡介 Joi
Joi 是一個簡單高效的基于 JavaScript 的數(shù)據(jù)驗證工具,它基于模式類型配置。
它具有用于驗證各種形式數(shù)據(jù)出現(xiàn)的內(nèi)置功能,但不限于布爾值、字符串、函數(shù)和區(qū)間。它還可以處理復(fù)雜的驗證操作。
此外,它提供了最小化的緩存功能。有關(guān)該工具的更多信息可以在此處找到。
如何設(shè)置 Joi
在本節(jié)中,我們將在本地環(huán)境中設(shè)置 Joi。要安裝 Joi,請通過命令行導(dǎo)航到代碼文件夾,并運行以下命令:
npm i joi
應(yīng)該顯示安裝成功的消息。完成后,我們可以演示在我們的演示 API 中使用 Joi 驗證用戶注冊的強大功能。
演示項目
在這個項目中,您將使用 Joi 來驗證從客戶端接收到的用于在服務(wù)器上注冊的輸入??梢栽谶@里找到用于 Node.js 應(yīng)用程序的用戶注冊功能的默認(rèn)代碼。
繼續(xù)將已安裝的 Joi 包導(dǎo)入到您的代碼中:
const Joi = require("joi");
在編寫我們的注冊控制器之前,我們將在代碼文件中初始化 Joi 庫:
const SignUpSchema = Joi.object({});
在這個項目中,我們將驗證從客戶端接收到的 email、password 和 username 參數(shù)。
const SignUpSchema = Joi.object({
email: Joi.string().email({
minDomainSegments: 2,
tlds: {
allow: ['com', 'net']
}
}),
username: Joi.string().alphanum().min(3).max(15).required(),
password: Joi.string().min(8).required()
});
email 參數(shù)對象確保電子郵件地址是一個字符串,并且域站點限制為 .com 和 .net,不允許其他形式的域。
對于 username 參數(shù),它確保它是一個包含字母和數(shù)字的字符串,最小字符數(shù)為 3,最大字符數(shù)為 15。required 函數(shù)確保必須滿足這些條件,否則整個請求將無法通過驗證。
password 參數(shù)確保提供的密碼是以字符串格式提供的,最小字符數(shù)為 8,并且也是必需的。
要將其應(yīng)用到我們的端點中,我們將其包含在控制器函數(shù)中:
const { error, value } = SignUpSchema.validate(req.body, { abortEarly: false });
if (error) {
res.status(400).json(error.details);
return;
}
此函數(shù)在將用戶詳細(xì)信息插入數(shù)據(jù)庫之前執(zhí)行。模式嘗試驗證接收到的輸入,然后如果成功驗證,繼續(xù)到數(shù)據(jù)庫。
abortEarly 功能包括以允許評估所有參數(shù)。如果有任何錯誤,所有錯誤都將顯示出來。
以上內(nèi)容也可以在登錄控制器函數(shù)中復(fù)制。您還可以查看 Joi 使用其他復(fù)雜驗證選項的文檔。
項目的最終代碼如下所示:
const jwt = require("jsonwebtoken");
const userSchema = require("../Schema/User");
const Joi = require("joi");
const bcrypt = require("bcrypt");
const { createNewColumn, checkRecordsExists, insertRecord } = require('../utils/sqlSchemaFunction');
const generateAccessToken = (use) => {
return jwt.sign({ userID: use }, process.env.JWT, { expiresIn: "1d" });
}
const SignUpSchema = Joi.object({
email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }),
username: Joi.string().alphanum().min(3).max(15).required(),
password: Joi.string().min(8).required()
});
const loginSchema = Joi.object({
email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }),
password: Joi.string().min(8).required()
});
const register = async (req, res) => {
const email = req.body.email;
const password = req.body.password;
if (!email || !password) {
res.status(400).json("Please supply the email or password");
return;
}
const { error, value } = SignUpSchema.validate(req.body, { abortEarly: false });
if (error) {
res.status(400).json(error.details);
return;
}
const salt = await bcrypt.genSalt(10);
const hashedPassword = await bcrypt.hash(password, salt);
const user = {
username: req.body.username,
email: email,
password: hashedPassword
};
try {
const userAlreadyExists = await checkRecordsExists("users", "email", email);
if (userAlreadyExists) {
res.status(400).json("Email must be unique");
} else {
await insertRecord("users", user);
res.status(200).json("User created successfully");
}
} catch (err) {
res.status(500).json({ err: err.message });
}
};
module.exports = { register };
在 Postman 中進行 API 測試
確保代碼遵循我們定義的模式,結(jié)果是成功執(zhí)行的。
結(jié)論
至此,教程已經(jīng)結(jié)束。希望您已經(jīng)了解了數(shù)據(jù)驗證、各種數(shù)據(jù)驗證工具以及數(shù)據(jù)驗證最佳實踐。文章來源:http://www.zghlxwxcb.cn/news/detail-851917.html
(本文內(nèi)容參考:java567.com)
到了這里,關(guān)于如何通過數(shù)據(jù)驗證防止 Web API 攻擊 - Web API 安全指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!