【Web 表单】与用户数据打交道-2(mdn笔记)

【Web 表单】与用户数据打交道-2(mdn笔记)_第1张图片

8. UI 伪类

8.1 都有什么样的伪类?

我们可以使用的(截至 CSS 2.1)与表单相关的原始伪类是:

  • :hover:只在鼠标指针悬停在一个元素上时选择该元素。

  • :focus:只在元素被聚焦时选择该元素(也就是说,通过键盘上的 tab 键选中该元素)。

  • :active:只在元素被激活时选择该元素(也就是说,通过点击或键盘上的 Return / Enter 键选中该元素)。

CSS Selector Level 3 和 CSS Basic UI Level 3 增加了更多与 HTML 表单有关的伪类.简单地说,我们要看的主要内容是:

  • :required 和 :optional:针对必需的或可选的表单控件。

  • :valid 和 :invalid、:in-range 和 :out-of-range:针对表单控件,根据对其设置的表单验证约束,或范围内/范围外,是有效/无效的

  • :enabled 和 :disabled、:read-only 和 :read-write:针对启用或禁用的表单控件(例如,设置了 disabled HTML 属性),以及读写或只读的表单控件(例如,设置了 readonly HTML 属性)。

  • :checked、:indeterminate 和 :default:分别针对被选中的复选框和单选按钮,处于不确定的状态(既不被选中也不被选中),以及页面加载时默认选择的选项(例如,一个设置了 checked 属性的 ,或者一个设置了 selected 属性的

备注:这里讨论的许多伪类都是关于根据表单控件的验证状态(它们的数据是否有效?)你会在我们的下一篇文章客户端表单验证中学习到更多关于设置和控制验证约束的知识,但现在我们将保持关于表单验证的简单内容,以便不会混淆。

8.2 根据必需与否为输入控件添加样式

一个表单输入是必需的(在提交表单之前必须填写)还是可选的

body {
  font: 1em sans-serif; /* 字体大小为1em,字体族为sans-serif */
  padding: 0; /* 内边距为0 */
  margin: 0; /* 外边距为0 */
}

form {
  max-width: 200px; /* 最大宽度为200像素 */
  margin: 0; /* 外边距为0 */
  padding: 0 5px; /* 内边距为5像素左右,0像素上下 */
}
/* 选择了所有作为 p 元素直接子元素的 label 元素 */
p > label {
  display: block; /* 显示为块级元素 */
}

input[type="text"],
input[type="email"],
input[type="number"],
textarea,
fieldset {
  /* 需要在基于 WebKit 的浏览器上对表单元素进行恰当的样式设置 */
  -webkit-appearance: none; /* 取消默认外观 */

  width: 100%; /* 宽度为100% */
  border: 1px solid #333; /* 边框为1像素宽,实线,颜色为深灰色 */
  margin: 0; /* 外边距为0 */

  font-family: inherit; /* 继承父元素的字体族 */
  font-size: 90%; /* 字体大小为90% */

  -moz-box-sizing: border-box; /* 在 Firefox 浏览器中,盒模型为border-box */
  box-sizing: border-box; /* 盒模型为border-box */
}

input:invalid {
  box-shadow: 0 0 5px 1px red; /* 阴影为红色,向右下偏移5像素,模糊半径为1像素 */
}

input:focus:invalid {
  outline: none; /* 取消轮廓线 */
}

自定义错误信息
每次我们提交无效的表单数据时,浏览器总会显示错误信息。但是显示的信息取决于你所使用的浏览器。

这些自动生成的错误有两个缺点

  • 没有标准可以让 CSS 来改变他们的界面外观。

  • 这依赖于他们使用的浏览器环境,意味着你可能在这种语言的页面里得到另一种语言的错误提示

    521e1aa26e1c2b5e022076ad6debdb1d.png

自定义这些消息的外观和文本,你必须使用 JavaScript; 不能使用 HTML 和 CSS 来改变。

HTML5 提供 constraint validation API 来检测和自定义表单元素的状态。他可以改变错误信息的文本:
看一个例子:

d448a790c2b828cdad6bbeb05ace9e62.png

var email = document.getElementById("mail"); // 获取 id 为 "mail" 的元素

email.addEventListener("input", function (event) { // 为 email 元素添加 input 事件监听器
  if (email.validity.typeMismatch) { // 如果 email 元素的值不符合类型要求
    email.setCustomValidity("I expect an e-mail, darling!"); // 设置自定义验证信息
  } else { // 否则
    email.setCustomValidity(""); // 清除自定义验证信息
  }
});

9.3 使用 JavaScript 校验表单

如果你想控制原生错误信息的界面外观,或者你想处理不支持 HTML 内置表单校验的浏览器,则必须使用 Javascript。

约束校验的 API
越来越多的浏览器支持限制校验 API,并且这逐渐变得可靠。
这些 API 由成组的方法和属性构成,可在特定的表单元素接口上调用:

  • HTMLButtonElement

  • HTMLFieldSetElement

  • HTMLInputElement

  • HTMLOutputElement (en-US)

  • HTMLSelectElement

  • HTMLTextAreaElement

约束校验的 API 及属性

属性 描述
validationMessage 一个本地化消息,描述元素不满足校验条件时(如果有的话)的文本信息。如果元素无需校验(willValidate 为 false),或元素的值满足校验条件时,为空字符串。
validity 一个 ValidityState 对象,描述元素的验证状态。详见有关可能的验证状态的文章。
validity.customError 如果元素设置了自定义错误,返回 true ;否则返回false。
validity.patternMismatch 如果元素的值不匹配所设置的正则表达式,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
validity.rangeOverflow 如果元素的值高于所设置的最大值,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
validity.rangeUnderflow 如果元素的值低于所设置的最小值,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
validity.stepMismatch 如果元素的值不符合 step 属性的规则,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
validity.tooLong 如果元素的值超过所设置的最大长度,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
validity.typeMismatch 如果元素的值出现语法错误,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
validity.valid 如果元素的值不存在校验问题,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :valid CSS 伪类,否则命中 :invalid CSS 伪类。
validity.valueMissing 如果元素设置了 required 属性且值为空,返回 true,否则返回 false。当此属性为 true 时,元素将命中 :invalid CSS 伪类。
willValidate 如果元素在表单提交时将被校验,返回 true,否则返回 false。

约束校验 API 的方法

方法 描述
checkValidity() 如果元素的值不存在校验问题,返回 true,否则返回 false。如果元素校验失败,此方法会触发 invalid 事件
HTMLFormElement.reportValidity() 如果元素或它的子元素控件符合校验的限制,返回 true . 当返回为 false 时,对每个无效元素可撤销 invalid 事件会被唤起并且校验错误会报告给用户。
setCustomValidity(message) 为元素添加一个自定义的错误消息;如果设置了自定义错误消息,该元素被认为是无效的,则显示指定的错误。这允许你使用 JavaScript 代码来建立校验失败,而不是用标准约束校验 API 所提供的。这些自定义信息将在向用户报告错误时显示。如果参数为空,则清空自定义错误。

对于旧版浏览器,可以使用 polyfill(例如 Hyperform),来弥补其对约束校验 API 支持的不足。既然你已经使用 JavaScript,在您的网站或 Web 应用程序的设计和实现中使用 polyfill 并不是累赘。

使用约束校验 API 的例子
使用这个 API 来构建自定义错误消息。

表单使用 novalidate 属性关闭浏览器的自动校验.这允许我们使用脚本控制表单校验
并不禁止对约束校验 API 的支持或是以下 CSS 伪类::valid、:invalid、:in-range 、:out-of-range 的应用。

aria-live (en-US) 属性确保我们的自定义错误信息将呈现给所有人,包括使用屏幕阅读器等辅助技术的人。

以下 CSS 样式使我们的表单和其错误输出看起来更有吸引力:

/* 仅为了使示例更好看 */
body {
  font: 1em sans-serif; /* 字体大小为1em,字体族为sans-serif */
  padding: 0; /* 内边距为0 */
  margin: 0; /* 外边距为0 */
}

form {
  max-width: 200px; /* 最大宽度为200像素 */
}

p * {
  display: block; /* 显示为块级元素 */
}

input[type="email"] {
  -webkit-appearance: none; /* 取消默认外观 */

  width: 100%; /* 宽度为100% */
  border: 1px solid #333; /* 边框为1像素宽,实线,颜色为深灰色 */
  margin: 0; /* 外边距为0 */

  font-family: inherit; /* 继承父元素的字体族 */
  font-size: 90%; /* 字体大小为90% */

  -moz-box-sizing: border-box; /* 在 Firefox 浏览器中,盒模型为border-box */
  box-sizing: border-box; /* 盒模型为border-box */
}
/* 校验失败的元素样式 */
input:invalid {
  border-color: #900; /* 边框颜色为深红色 */
  background-color: #fdd; /* 背景颜色为浅红色 */
}

input:focus:invalid {
  outline: none; /* 取消轮廓线 */
}
/* 错误消息的样式 */
.error {
  width: 100%; /* 宽度为100% */
  padding: 0; /* 内边距为0 */

  font-size: 80%; /* 字体大小为80% */
  color: white; /* 文本颜色为白色 */
  background-color: #900; /* 背景颜色为深红色 */
  border-radius: 0 0 5px 5px; /* 边框圆角半径,左上角和右上角为0,左下角和右下角为5像素 */

  -moz-box-sizing: border-box; /* 在 Firefox 浏览器中,盒模型为border-box */
  box-sizing: border-box; /* 盒模型为border-box */
}

.error.active {
  padding: 0.3em; /* 内边距为0.3em */
}

以下 JavaScript 代码演示如何设置自定义错误校验:

// 有许多方式可以获取 DOM 节点;在此我们获取表单本身和
// email 输入框,以及我们将放置错误信息的 span 元素。

var form = document.getElementsByTagName("form")[0];
var email = document.getElementById("mail");
var error = document.querySelector(".error");

email.addEventListener(
  "input",
  function (event) {
    // 当用户输入信息时,校验 email 字段
    if (email.validity.valid) {
      // 如果校验通过,清除已显示的错误消息
      error.innerHTML = ""; // 重置消息的内容
      error.className = "error"; // 重置消息的显示状态
    }
  },
  false,
);
form.addEventListener(
  "submit",
  function (event) {
    // 当用户提交表单时,校验 email 字段
    if (!email.validity.valid) {
      // 如果校验失败,显示一个自定义错误
      error.innerHTML = "I expect an e-mail, darling!";
      error.className = "error active";
      // 还需要阻止表单提交事件,以取消数据传送
      event.preventDefault();
    }
  },
  false,
);

【Web 表单】与用户数据打交道-2(mdn笔记)_第13张图片

约束校验 API 为您提供了一个强大的工具来处理表单校验,让您可以对用户界面进行远超过仅仅使用 HTML 和 CSS 所能得到的控制。

不使用内建 API 时的表单校验
有时,例如使用旧版浏览器或自定义小部件 (en-US),您将无法(或不希望)使用约束校验 API。
可以使用 JavaScript 来校验您的表单。校验表单比起真实数据校验更像是一个用户界面问题。
我应该进行什么样的校验?
你需要确定如何校验你的数据:字符串操作,类型转换,正则表达式等。
如果表单校验失败,我该怎么办?
您必须决定表单的行为方式:表单是否发送数据?是否突出显示错误的字段?是否显示错误消息?
如何帮助用户纠正无效数据?
您应该提供前期建议,以便他们知道预期的输入是什么以及明确的错误消息。

不使用约束校验 API 的例子


CSS 也不需要太多的改动,我们只需将 :invalid 伪类变成真实的类,并避免使用不适用于 Internet Explorer 6 的属性选择器。

/* 校验失败的元素样式 */
input.invalid {
  border-color: #900;
  background-color: #fdd;
}

input:focus.invalid {
  outline: none;
}

JavaScript 代码有很大的变化,需要做更多的工作:

// 使用旧版浏览器选择 DOM 节点的方法较少
var form = document.getElementsByTagName("form")[0]; // 获取第一个 form 元素
var email = document.getElementById("mail"); // 获取 id 为 "mail" 的元素
// 以下是在 DOM 中访问下一个兄弟元素的技巧
// 这比较危险,很容易引起无限循环
// 在现代浏览器中,应该使用 element.nextElementSibling
var error = email;
while ((error = error.nextSibling).nodeType != 1); // 获取 email 元素后面的第一个元素节点

var emailRegExp =
  /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; // 定义电子邮件正则表达式
// 许多旧版浏览器不支持 addEventListener 方法
// 这只是其中一种简单的处理方法
function addEvent(element, event, callback) { // 定义 addEvent 函数,用于添加事件监听器
  var previousEventCallBack = element["on" + event]; // 获取元素原有的事件监听器
  element["on" + event] = function (e) { // 设置元素的新事件监听器
    var output = callback(e); // 调用回调函数
    
    if (output === false) return false; // 如果回调函数返回 false,则阻止默认事件和冒泡// 返回 `false` 来停止回调链,并中断事件的执行

    if (typeof previousEventCallBack === "function") { // 如果原有的事件监听器是函数
      output = previousEventCallBack(e); // 调用原有的事件监听器
      if (output === false) return false; // 如果原有的事件监听器返回 false,则阻止默认事件和冒泡
    }
  };
}
// 现在我们可以重构字段的约束校验了
// 由于不使用 CSS 伪类,我们必须明确地设置 valid 或 invalid 类到 email 字段上
addEvent(window, "load", function () { // 页面加载完成后执行以下代码
  var test = email.value.length === 0 || emailRegExp.test(email.value); // 检查 email 元素的值是否为空或符合正则表达式

  email.className = test ? "valid" : "invalid"; // 根据检查结果设置 email 元素的类名
});
// 处理用户输入事件
addEvent(email, "input", function () { // 当 email 元素的值改变时执行以下代码
  var test = email.value.length === 0 || emailRegExp.test(email.value); // 检查 email 元素的值是否为空或符合正则表达式
  if (test) { // 如果检查结果为真
    email.className = "valid"; // 设置 email 元素的类名为 "valid"
    error.innerHTML = ""; // 清空错误信息显示区域的内容
    error.className = "error"; // 设置错误信息显示区域的类名为 "error"
  } else { // 否则
    email.className = "invalid"; // 设置 email 元素的类名为 "invalid"
  }
});
// 处理表单提交事件
addEvent(form, "submit", function () { // 当表单提交时执行以下代码
  var test = email.value.length === 0 || emailRegExp.test(email.value); // 检查 email 元素的值是否为空或符合正则表达式

  if (!test) { // 如果检查结果为假
    email.className = "invalid"; // 设置 email 元素的类名为 "invalid"
    error.innerHTML = "I expect an e-mail, darling!"; // 设置错误信息显示区域的内容
    error.className = "error active"; // 设置错误信息显示区域的类名为 "error active"
    return false; // 阻止表单提交
  } else { // 否则
    email.className = "valid"; // 设置 email 元素的类名为 "valid"
    error.innerHTML = ""; // 清空错误信息显示区域的内容
    error.className = "error"; // 设置错误信息显示区域的类名为 "error"
  }
});

【Web 表单】与用户数据打交道-2(mdn笔记)_第14张图片

建立自己的校验系统并不难。困难的部分是使其足够通用,以跨平台和任何形式使用它可以创建。
有许多库可用于执行表单校验; 你应该毫不犹豫地使用它们。这里有一些例子:

  • 独立的库(原生 Javascript 实现):

    • Validate.js

  • jQuery 插件:

    • Validation

    • Valid8

远程校验
当用户输入的数据与存储在应用程序服务器端的附加数据绑定时,这种校验是必要的。
一个应用实例就是注册表单,在这里你需要一个用户名。为了避免重复,执行一个 AJAX 请求来检查用户名的可用性,要比让先用户发送数据,然后因为表单重复了返回错误信息要好得多。
执行这样的校验需要采取一些预防措施

  • 要求公开 API 和一些数据;您需要确保它不是敏感数据

  • 网络滞后需要执行异步校验 这需要一些用户界面的工作,以确保如果校验没有适当的执行,用户不会被阻止。

10. 发送表单数据

当用户提交表单时发生了什么——数据去了哪,以及当它到达时该如何处理?我们还研究了与发送表单数据相关的一些安全问题。

10.1 数据都去哪儿了?

客户端/服务器体系结构
客户端(通常是 web 浏览器) 向服务器发送请求 (大多数情况下是Apache、Nginx、IIS、Tomcat等 web 服务器),使用HTTP 协议。服务器使用相同的协议来回答请求。

【Web 表单】与用户数据打交道-2(mdn笔记)_第15张图片

在客户端,HTML 表单只不过是一种方便的用户友好的方式,可以配置 HTTP 请求将数据发送到服务器。这使用户能够提供在 HTTP 请求中传递的信息。

在客户端:定义如何发送数据

元素定义了如何发送数据。它的所有属性都是为了让您配置当用户点击提交按钮时发送的请求。两个最重要的属性是action和method

action 属性
这个属性定义了发送数据要去的位置。它的值必须是一个有效的 URL。如果没有提供此属性,则数据将被发送到包含这个表单的页面的 URL。
在这个例子中,数据被发送到一个绝对 URL —— http://foo.com:

这里,我们使用相对 URL——数据被发送到服务器上的不同 URL

在没有属性的情况下,像下面一样,

数据被发送到表单出现的相同页面上

许多较老的页面使用下面的符号表示数据应该被发送到包含表单的相同页面;这是必需的,因为直到 HTML5action属性都需要该符号。现在,这不再需要了。

备注:可以指定使用 HTTPS(安全 HTTP) 协议的 URL。当您这样做时,数据将与请求的其余部分一起加密,即使表单本身是托管在使用 HTTP 访问的不安全页面上。另一方面,如果表单是在安全页面上托管的,但是您指定了一个不安全的 HTTP URL,它带有action属性,所有的浏览器都会在每次尝试发送数据时向用户显示一个安全警告,因为数据不会被加密。

method 属性
该属性定义了如何发送数据。
HTTP 协议提供了几种执行请求的方法:最常见的是GET方法和POST方法。

GET 方法-请求服务器返回给定的资源
考虑下面这个表单:

由于已经使用了GET方法,当你提交表单的时候,您将看到www.foo.com/?say=Hi&to=Mom在浏览器地址栏里。

【Web 表单】与用户数据打交道-2(mdn笔记)_第16张图片

数据作为一系列的名称/值对被附加到 URL。
在 URL web 地址结束之后,我们得到一个问号 (?),后面跟着由一个与符号 (&) 互相分隔开的名称/值对。

HTTP 请求如下:

GET /?say=Hi&to=Mom HTTP/2.0
Host: foo.com

POST 方法-浏览器在询问响应时使用与服务器通信的方法.该响应考虑了 HTTP 请求正文中提供的数据.
如果使用该方法发送表单,则将数据追加到 HTTP 请求的主体中。

当使用POST方法提交表单时,没有数据会附加到 URL,HTTP 请求看起来是这样的,而请求主体中包含的数据是这样的:

POST / HTTP/2.0
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13

say=Hi&to=Mom

【Web 表单】与用户数据打交道-2(mdn笔记)_第17张图片

Content-Length数据头表示主体的大小,Content-Type数据头表示发送到服务器的资源类型。稍后我们将讨论这些标头。

查看 HTTP 请求
HTTP 请求永远不会显示给用户.
您的表单数据将显示在 Chrome 网络选项卡中:

  1. 按下 F12

  2. 选择 "Network"

  3. 选择 "All"

  4. 在 "Name" 标签页选择 "foo.com"

  5. 选择 "Headers"

【Web 表单】与用户数据打交道-2(mdn笔记)_第18张图片

唯一显示给用户的是被调用的 URL。正如我们上面提到的,使用GET请求用户将在他们的 URL 栏中看到数据,但是使用POST请求用户将不会看到。

  • 如果您需要发送一个密码 (或其他敏感数据),永远不要使用GET方法否则数据会在 URL 栏中显示,这将非常不安全。

  • 如果您需要发送大量的数据,那么POST方法是首选的,因为一些浏览器限制了 URL 的大小。此外,许多服务器限制它们接受的 URL 的长度。

在服务器端:检索数据
无论选择哪种 HTTP 方法,服务器都会接收一个字符串并解析,以便将数据作为键/值对序列获取。

例子:Python
在 web 页面上显示提交的数据。这将使用Flask framework来呈现模板、处理表单数据提交等.
这是一个简单的 Flask 应用程序,它定义了两个路由:/ 和 /hello。当用户访问 / 路由时,应用程序会渲染并返回 form.html 模板。当用户访问 /hello 路由时,应用程序会从表单数据中获取 say 和 to 字段的值,并将它们传递给 greeting.html 模板进行渲染,然后返回渲染后的模板。

from flask import Flask, render_template, request
app = Flask(__name__)

@app.route('/', methods=['GET', 'POST']) # 定义 / 路由
def form():
    return render_template('form.html') # 渲染并返回 form.html 模板

@app.route('/hello', methods=['GET', 'POST']) # 定义 /hello 路由
def hello():
    return render_template('greeting.html', say=request.form['say'], to=request.form['to']) # 获取表单数据并渲染 greeting.html 模板

if __name__ == "__main__":
    app.run() # 运行应用程序

以上代码中引用的两个模板如下:

  • form.html: 与我们在 POST 方法 小节中看到的相同的表单,但是将action设置为{{ url_for('hello') }}。(这是一个Jinja2模板,它基本上是 HTML,但是可以包含对运行包含在花括号中的 web 服务器的 Python 代码的调用。url_for('hello')基本上是在 “提交表单时重定向到/hello”

  • greeting.html: 这个模板只包含一行,用于呈现渲染时传递给它的两个数据块。这是通过前面所见的hello()函数完成的,该函数在/helloURL 被导向时运行。

备注:同样,如果您只是尝试将其直接加载到浏览器中,那么这段代码将无法工作。Python 的工作方式与 PHP 略有不同——要在本地运行此代码,您需要安装 Python/pip,然后使用pip3 install flask安装 Flask。此时,您应该能够使用python3 python-example.py来运行这个示例,然后在浏览器中导航到localhost:5000。

其他语言和框架
有许多其他的服务器端技术可以用于表单处理,包括Perl、Java、 .Net、Ruby等。只挑你最喜欢的用就好。
直接使用这些技术并不常见,因为这可能很棘手。更常见的是使用许多优秀的框架,这些框架使处理表单变得更容易,例如:

  • Django for Python(比Flask要重量级一些,但是有更多的工具和选项。)

  • Express for Node.js

  • Laravel for PHP

  • Ruby On Rails for Ruby

  • Phoenix for Elixir

10.2 特殊案例:发送文件

用 HTML 表单发送文件是一个特殊的例子。
文件是二进制数据——或者被认为是这样的——而所有其他数据都是文本数据。
由于 HTTP 是一种文本协议,所以处理二进制数据有特殊的要求。

enctype 属性
该属性允许您指定在提交表单时所生成的请求中的Content-Type的 HTTP 数据头的值。默认情况下,它的值是application/x-www-form-urlencoded。它的意思是:“这是已编码为 URL 参数的表单数据。”

如果你想要发送文件,你需要额外的三个步骤

  • method属性设置为POST,因为文件内容不能放入 URL 参数中。

  • enctype的值设置为multipart/form-data,因为数据将被分成多个部分,每个文件单独占用一个部分,表单正文中包含的文本数据(如果文本也输入到表单中)占用一个部分。

  • 包含一个或多个File picker小部件,允许用户选择将要上传的文件。

备注:一些浏览器支持的multiple属性,它允许只用一个 元素选择一个以上的文件上传。服务器如何处理这些文件取决于服务器上使用的技术。如前所述,使用框架将使您的生活更轻松。

为了防止滥用,许多服务器配置了文件和 HTTP 请求的大小限制。在发送文件之前,先检查服务器管理员的权限是很重要的。

10.3 常见的安全问题

每次向服务器发送数据时,都需要考虑安全性。
HTML 表单是最常见的攻击路径
这些问题从来都不是来自 HTML 表单本身,它们来自于服务器如何处理数据

XSS 和 CSRF
跨站脚本 (XSS) 和 跨站点请求伪造 (CSRF) 是常见的攻击类型,它们发生在 当您将用户发送的数据显示给这个用户或另一个用户时

XSS 允许攻击者将客户端脚本注入到其他用户查看的 Web 页面中。
CSRF 攻击类似于 XSS 攻击,因为它们以相同的方式开始攻击——向 Web 页面中注入客户端脚本——但它们的目标是不同的。CSRF 攻击者试图将权限升级到特权用户 (比如站点管理员) 的级别,以执行他们不应该执行的操作 (例如,将数据发送给一个不受信任的用户)。
XSS 攻击利用用户对 web 站点的信任,而 CSRF 攻击则利用网站对其用户的信任。

为了防止这些攻击,您应该始终检查用户发送给服务器的数据 (如果需要显示),尽量不要显示用户提供的 HTML 内容。
当今市场上几乎所有的框架都实现了一个最小的过滤器,它可以从任何用户发送的数据中删除 HTML

你可能感兴趣的:(前端,笔记)