Heim >Web-Frontend >js-Tutorial >Wie führt der Knoten in der Controller-Ebene die Datenüberprüfung durch?
【Video-Tutorial-Empfehlung: node js-Tutorial】
Humorvolle Back-End-Programmierer lachen normalerweise über sich selbst als CURD Boy. CURD, also das Hinzufügen, Löschen, Ändern und Abfragen einer bestimmten Speicherressource, ist eine vollständig datenorientierte Programmierung.
Es ist großartig. Datenorientierte Programmierung führt oft zu einem gründlicheren Verständnis des Geschäfts, wodurch qualitativ hochwertigerer Code geschrieben wird und weniger Fehler entstehen. Da es sich um datenorientierte Programmierung handelt, ist es umso wichtiger, das Auftreten schmutziger Daten zu vermeiden und die Datenüberprüfung zu stärken. Sollten wir andernfalls der Front-End-Datenüberprüfung vertrauen? Schließlich geht die Front-End-Datenüberprüfung direkt an den Benutzer, um benutzerfreundlicheres Feedback auf der UI-Ebene zu erhalten.
Das Backend ist aufgrund seines Schwerpunkts auf Geschäftslogik und verschiedenen zu verarbeitenden Daten in verschiedene Ebenen unterteilt. Die Backend-Projekte, die ich erlebt habe, sind in Controller
und Service unterteilt
, Model
, Helper
, Entity
usw. Es gibt verschiedene benannte Ebenen. Allerdings muss es hier eine Schicht namens Controller
geben, die auf der obersten Schicht des Backends steht und die vom Client übermittelten Daten direkt empfängt. Controller
、Service
、Model
、Helper
、Entity
等各种命名的层,五花八门。但这里肯定有一个层称为 Controller
,站在后端最上层直接接收客户端传输数据。
由于 Controller
层是服务器端中与客户端数据交互的最顶层,秉承着 Fail Fast
的原则,肩负着数据过滤器的功能,对于不合法数据直接打回去,如同秦琼与尉迟恭门神般威严。
数据校验同时衍生了一个半文档化的副产品,你只需要看一眼数据校验层,便知道要传哪些字段,都是些什么格式。
以下都是常见的数据校验,本文讲述如何对它们进行校验:
const body = { id, name, mobilePhone, email }
作者接触过一个没有数据校验层的后端项目,if/else
充斥在各种层级,万分痛苦,分分钟向重构。
JSON Schema
基于 JSON 进行数据校验格式,并附有一份规范 json-schema.org,目前 (2020-08) 最新版本是 7.0。各种服务器编程语言都对规范进行了实现,如 go
、java
、php
等,当然伟大的 javascript 也有,如不温不火的 ajv。
以下是校验用户信息的一个 Schema,可见语法复杂与繁琐:
{ "$schema": "http://json-schema.org/draft-04/schema#", "title": "User", "description": "用户信息", "type": "object", "properties": { "id": { "description": "用户 ID", "type": "integer" }, "name": { "description": "用户姓名", "type": "string" }, "email": { "description": "用户邮箱", "type": "string", "format": "email", "maxLength": 20 }, "mobilePhone": { "description": "用户手机号", "type": "string", "pattern": "^(?:(?:\+|00)86)?1[3-9]\d{9}$", "maxLength": 15 } }, "required": ["id", "name"] }
对于复杂的数据类型校验,JSON Schema 内置了以下 Format,方便快捷校验
对于不在内置 Format 中的手机号,使用 ajv.addFormat
可手动添加 Format
ajv.addFormat('mobilePhone', (str) => /^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(str));
joi 自称最强大的 JS 校验库,在 github 也斩获了一万六颗星星。相比 JSON Schema 而言,它的语法更加简洁并且功能强大。
The most powerful data validation library for JS
完成相同的校验,仅需要更少的代码,并能够完成更加强大的校验。以下仅做示例,更多示例请前往文档。
const schema = Joi.object({ id: Joi.number().required(), name: Joi.number().required(), email: Joi.string().email({ minDomainSegments: 2, tlds: { allow: ['com', 'net'] } }), mobilePhone: Joi.string().pattern(/^(?:(?:\+|00)86)?1[3-9]\d{9}$/), password: Joi.string().pattern(/^[a-zA-Z0-9]{3,30}$/), // 与 password 相同的校验 repeatPassword: Joi.ref('password'), }) // 密码与重复密码需要同时发送 .with('password', 'repeat_password'); // 邮箱与手机号提供一个即可 .xor('email', 'mobilePhone')
由于数据直接从路由传递,因此 koajs
官方基于 joi
实现了一个 joi-router,前置数据校验到路由层,对前端传递来的 query
、body
与 params
进行校验。
joi-router
也同时基于 co-body
对前端传输的各种 content-type
进行解析及限制。如限制为 application/json
Controller
-Schicht die oberste Schicht des Servers ist, die mit Client-Daten interagiert, folgt sie dem Prinzip von Fail Fast
und ist für die Funktion der Datenfilterung verantwortlich . Für illegal Die Daten wurden direkt zurückgeschickt, so majestätisch wie die Türgötter Qin Qiong und Yuchi Gong. Die Datenüberprüfung erzeugt auch ein halbdokumentiertes Nebenprodukt. Sie müssen nur einen Blick auf die Datenüberprüfungsschicht werfen, um zu wissen, welche Felder übertragen werden sollen und in welchen Formaten sie vorliegen. Im Folgenden finden Sie allgemeine Datenüberprüfungen. In diesem Artikel wird beschrieben, wie Sie sie überprüfen:
const router = require('koa-joi-router'); const public = router(); public.route({ method: 'post', path: '/signup', validate: { header: joiObject, query: joiObject, params: joiObject, body: joiObject, maxBody: '64kb', output: { '400-600': { body: joiObject } }, type: 'json', failure: 400, continueOnError: false }, pre: async (ctx, next) => { await checkAuth(ctx); return next(); }, handler: async (ctx) => { await createUser(ctx.request.body); ctx.status = 201; }, });Der Autor ist mit einem Back-End-Projekt ohne in Kontakt gekommen Als Datenüberprüfungsschicht wird
if/else
auf verschiedenen Ebenen überflutet, was äußerst mühsam ist und innerhalb von Minuten umgestaltet werden muss. 🎜JSON Schema
ist ein auf JSON basierendes Datenüberprüfungsformat und wird mit einer Spezifikation json-schema.org🎜, die aktuellste Version (2020-08) ist 7.0. Verschiedene Server-Programmiersprachen haben die Spezifikationen implementiert, wie zum Beispiel go
, java
, php
usw. Natürlich gibt es auch tolle Javascripte , wie Bu Wen Nicht beliebt ajv🎜. 🎜🎜Das Folgende ist ein Schema zur Überprüfung von Benutzerinformationen. Es ist ersichtlich, dass die Syntax komplex und umständlich ist:🎜const safe = require('safe-regex') const re = /(x+x+)+y/ // 能跑死 CPU 的一个正则 re.test('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') // 使用 safe-regex 判断正则是否安全 safe(re) // false🎜Für die Überprüfung komplexer Datentypen verfügt das JSON-Schema über das folgende integrierte Format zur bequemen und schnellen Überprüfung🎜
ajv.addFormat zum manuellen Hinzufügen des Formats🎜rrreee<h2 id="item-3">Joi🎜🎜<a href="https://github.com/sideway/joi" rel="nofollow noreferrer" target="_blank „>joi🎜 behauptet, die leistungsstärkste JS-Verifizierungsbibliothek zu sein, hat auch 16.000 Sterne auf Github erhalten. Im Vergleich zum JSON-Schema ist die Syntax prägnanter und leistungsfähiger. 🎜<blockquote>Die leistungsstärkste Datenvalidierungsbibliothek für JS</blockquote>🎜Führen Sie die gleiche Validierung durch, benötigen Sie nur weniger Code und können Sie eine leistungsfähigere Validierung durchführen. Im Folgenden finden Sie lediglich Beispiele. Weitere Beispiele finden Sie in der Dokumentation. 🎜rrreee<h2 id=" item-4>Die Datenüberprüfung ist in die Routing-Schicht integriert🎜🎜Da die Daten direkt vom Routing übergeben werden, hat <code>koajs
offiziell eine basierend auf joi <a href="https://github.com/koajs/joi-router" rel="nofollow noreferrer" target="_blank">joi-router🎜, die Vordaten werden auf der Routing-Ebene überprüft und Die an das Frontend übergebenen <code>query
, body
und params
werden überprüft. 🎜🎜joi-router
analysiert und begrenzt auch verschiedene vom Frontend übertragene Inhaltstypen
basierend auf co-body
. Bei einer Beschränkung auf application/json
können auch CSRF-Angriffe bis zu einem gewissen Grad verhindert werden. 🎜rrreee🎜Reguläre Ausdrücke und sichere reguläre Ausdrücke🎜🎜Der Autor hat bei der Behebung eines Leistungsproblems festgestellt, dass eine API in der Datenüberprüfungsschicht tatsächlich zu lange dauerte. Daran habe ich nie gedacht. Die Wurzel des Problems liegt in unsicheren regulären Ausdrücken. Was sind also unsichere reguläre Ausdrücke? 🎜🎜Zum Beispiel ist der unten stehende reguläre Ausdruck, der die CPU blockieren kann, eine Zeitbombe, und die Anzahl der Rückverfolgungen hat exponentiell zugenommen. 🎜可以参考文章 浅析 ReDos 原理与实践
const safe = require('safe-regex') const re = /(x+x+)+y/ // 能跑死 CPU 的一个正则 re.test('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') // 使用 safe-regex 判断正则是否安全 safe(re) // false
数据校验,针对的大多是字符串校验,也会充斥着各种各样的正则表达式,保证正则表达式的安全相当紧要。safe-regex 能够发现哪些不安全的正则表达式。
更多编程相关知识,可访问:编程教学!!
Das obige ist der detaillierte Inhalt vonWie führt der Knoten in der Controller-Ebene die Datenüberprüfung durch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!