Heim  >  Artikel  >  Web-Frontend  >  Wie führt der Knoten in der Controller-Ebene die Datenüberprüfung durch?

Wie führt der Knoten in der Controller-Ebene die Datenüberprüfung durch?

青灯夜游
青灯夜游nach vorne
2020-09-02 10:43:491889Durchsuche

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.

Datenüberprüfungsschicht

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. ControllerServiceModelHelperEntity 等各种命名的层,五花八门。但这里肯定有一个层称为 Controller,站在后端最上层直接接收客户端传输数据。

由于 Controller 层是服务器端中与客户端数据交互的最顶层,秉承着 Fail Fast 的原则,肩负着数据过滤器的功能,对于不合法数据直接打回去,如同秦琼与尉迟恭门神般威严。

数据校验同时衍生了一个半文档化的副产品,你只需要看一眼数据校验层,便知道要传哪些字段,都是些什么格式。

以下都是常见的数据校验,本文讲述如何对它们进行校验:

  1. required/optional
  2. 基本的数据校验,如 number、string、timestamp 及值需要满足的条件
  3. 复杂的数据校验,如 IP、手机号、邮箱与域名
const body = {
  id,
  name,
  mobilePhone,
  email
}

作者接触过一个没有数据校验层的后端项目,if/else 充斥在各种层级,万分痛苦,分分钟向重构。

JSON Schema

JSON Schema 基于 JSON 进行数据校验格式,并附有一份规范 json-schema.org,目前 (2020-08) 最新版本是 7.0。各种服务器编程语言都对规范进行了实现,如 gojavaphp 等,当然伟大的 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,方便快捷校验

  • Dates and times
  • Email addresses
  • Hostnames
  • IP Addresses
  • Resource identifiers
  • URI template
  • JSON Pointer
  • Regular Expressions

对于不在内置 Format 中的手机号,使用 ajv.addFormat 可手动添加 Format

ajv.addFormat('mobilePhone', (str) => /^(?:(?:\+|00)86)?1[3-9]\d{9}$/.test(str));

Joi

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,前置数据校验到路由层,对前端传递来的 querybodyparams 进行校验。

joi-router 也同时基于 co-body 对前端传输的各种 content-type 进行解析及限制。如限制为 application/json

Da die 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:

  1. erforderlich/optional
  2. Grundlegende Datenüberprüfungen, z. B. Anzahl, Zeichenfolge, Zeitstempel und die Bedingungen, unter denen die Daten überprüft werden Wert muss erfüllt sein
  3. Komplexe Datenüberprüfung, wie IP, Mobiltelefonnummer, E-Mail und Domainname
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🎜🎜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🎜
  • Daten und Uhrzeiten
  • E-Mail-Adressen
  • Hostnamen
  • IP-Adressen
  • Ressourcenkennungen
  • URI Vorlage
  • JSON-Zeiger
  • Reguläre Ausdrücke
🎜Für Mobiltelefonnummern, die nicht im integrierten Format vorliegen, verwenden Sie 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(&#39;safe-regex&#39;)
const re = /(x+x+)+y/

// 能跑死 CPU 的一个正则
re.test(&#39;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#39;)

// 使用 safe-regex 判断正则是否安全
safe(re)   // false

数据校验,针对的大多是字符串校验,也会充斥着各种各样的正则表达式,保证正则表达式的安全相当紧要。safe-regex 能够发现哪些不安全的正则表达式。

总结

  1. Controller 层需要进行统一的数据校验,可以采用 JSON Schema (Node 实现 ajv) 与 Joi
  2. JSON Schema 有官方规范及各个语言的实现,但语法繁琐,可使用校验功能更为强大的 Joi
  3. 进行字符串校验时,注意不安全的正则引起的性能问题

更多编程相关知识,可访问:编程教学!!

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen