首页 > 其他分享 >你应该使用受控组件来处理 React 中的密码吗?

你应该使用受控组件来处理 React 中的密码吗?

时间:2022-09-04 12:00:54浏览次数:92  
标签:受控 元素 React 密码 组件 输入

你应该使用受控组件来处理 React 中的密码吗?

Photo by 丹·纳尔逊 on 不飞溅

我最近正在为一个客户开发一个项目,其中包括身份验证和登录页面。当我去设置用户名和密码的文本输入时,弹出了一个我以前没有想到的问题。将受控组件用于具有某种密码的输入是否是一种良好的安全做法?

在深入探讨这个问题的答案之前,我们应该首先了解什么是受控组件以及输入的“密码”属性实际上如何影响屏幕上的输入文本以及存储在 DOM 中的数据。

什么是受控组件?

对于传统输入,输入的值存储为元素的属性。为了访问这些值,我们必须使用 JavaScript 挂钩到元素中,否则等待表单提交才能访问这些值。

React 通过使用受控组件提供了一种处理输入值的新方法。我们不是让输入元素控制它们的状态,而是混合使用状态变量和 onChange 钩子来将输入值的所有权从输入元素转移到 React 组件。

我们在下图中使用该模式:

Figure 1. Basic password input managed by React controlled components.

这里我们设置了一个 useState 挂钩来存储和更新密码的值。我们将输入的值设置为密码变量,并设置一个 onChange 事件处理程序,以在每次输入更改时更新密码变量的值。这形成了一个循环过程,其中用户与 input 元素交互,这会触发 onChange 调用,该调用更新密码变量,

这样做的好处是可以更集中、更直接地访问这些输入值,因为它们存储在组件的状态中,但是提出了一个问题,这种状态的集中化和对 React 组件的输入的责任延迟是否会使我们的输入值面临更大的风险。

输入类型密码的幕后发生了什么?

默认情况下,输入 HTML 元素具有一种文本类型。这意味着任何放置在 HTML 文件中而不指定类型的标签将默认为纯文本。当然,我们可能希望向用户询问许多不同类型的数据,并且我们希望避免为每种类型的数据重写验证和元素功能。正是由于这种需要,HTML 添加了输入类型,包括密码、电子邮件和电话等等。

这些不同的类型提供了默认文本类型所不具备的表面级验证或额外功能。当我们想要帮助隐藏用户的密码不被窥探时,我们可以创建一个带有密码类型的输入标签。使用此属性,输入到输入中的所有字符都将显示为统一的点,而不是特定的字符。

我们可以在下面的代码片段中看到实际情况:

Figure 2. Comparison of text and password input elements.

这对于防止物理上靠近您的其他人看到您屏幕上的字符非常有用,但是它如何影响存储在 DOM 中的内容呢?要回答这个问题,我们需要研究 value 属性。除了 type 属性,输入 HTML 标记还有 value 属性。这可以预设,但是一旦用户与输入交互,此 value 属性将存储结果值。

虽然我们的密码值可能看起来像屏幕上的点,但在 DOM 中它看起来像这样:

Figure 3. Example of password showed in plain text in input’s value attribute.

在这里,我们看到输入属性的值是我们的密码,“password1”。密码类型输入提供的点和安全性仅扩展到屏幕上的视觉效果,并不保护存储在 DOM 中的密码。换句话说,任何输入值对于有权访问 DOM 的人来说都是完全可见的,无论它们在 UI 中如何显示。

我们应该让我们的密码输入成为一个受控组件吗?

我们已经讨论了受控组件是什么以及它们是如何使用的,以及查看了不同的输入元素类型,特别是密码类型。对于我们是否应该在 React 中使用受控组件来管理密码的问题,答案是肯定的。虽然具有密码类型的输入元素会掩盖物理用户看到屏幕上的内容,但它不会改变 DOM 中值的可见性。

受控组件不会使情况变得更糟,因为它们所做的只是将密码状态的控制从输入元素本身转移到 JSX 元素中的状态变量。正因为如此,您应该感觉很好地采用传统输入的方法来获取和提交密码,或有状态的组件来处理密码状态。无论哪种方式都有效并且具有相同的安全性。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/12236/50110411

标签:受控,元素,React,密码,组件,输入
From: https://www.cnblogs.com/amboke/p/16654771.html

相关文章

  • [EN] React 项目开发指南 — Emre MUTLU
    [EN]React项目开发指南—EmreMUTLU你好,本指南包含开发应用程序时必须遵循的规则反应.本指南旨在确保不同人编写的代码相互兼容,并生成质量更高且错误更少的代码。......
  • vue3 基础-组件间传值及校验
    本篇讲基于对页面组件化拆分后,组件之间如何进行数据传递,通常是父组件如何给子组件进行传值,子组件接收并进行数据校验后再使用.父子组件传值<!DOCTYPEhtml><html......
  • 修复:无法对未安装的组件执行反应状态更新。
    修复:无法对未安装的组件执行反应状态更新。在开发react.js应用程序时可能会遇到此错误:警告:无法对未安装的组件执行React状态更新。这是一个空操作,但它表明您的应用......
  • SWR 与 React 的威力
    SWR与React的威力在本文中,我们将研究一种在ReactApps中检索数据的新方法,名为驻波比.这是一组用于远程数据获取的钩子,使事情变得更容易,例如缓存、分页等。在整篇......
  • 性能优化 1 - 减小 Bundle 大小(React、Webpack、Minify、代码拆分)
    性能优化1-减小Bundle大小(React、Webpack、Minify、代码拆分)Photoby杰克逊·西默on不飞溅优化JavaScript和React性能的方法之一是尽可能减小通过Webpac......
  • 了解 React JS 中的服务工作者
    了解ReactJS中的服务工作者如果你处理过前端框架,你无疑听说过服务工作者。如果您不确定它们是什么以及它们的表现如何,我们将在本文中讨论所有这些,希望在本文结束时,您......
  • React.js VS Solid.js,作为初学者,你应该学习哪个?
    React.jsVSSolid.js,作为初学者,你应该学习哪个?作为初学者,哪个框架对您的开发之旅最有帮助?作为第一次接触javascript前端框架的初学者,您可能想知道一些事情,例如,哪个最......
  • 如何在 React 中实现登录
    如何在React中实现登录第1步:在Logify中设置域步骤1A:注册于登录.id登录后会出现这个界面,点击作为个人继续步骤1B:注册您的组织点击工作右上角的标签。点......
  • 适用于任何技能水平的开发人员的可扩展 React 架构
    适用于任何技能水平的开发人员的可扩展React架构当我们中的许多人考虑可伸缩性时,我们通常会考虑应用程序在大量并发用户的情况下快速执行的能力。虽然这是可扩展性的一......
  • delphi 【增强型图片组件TcxImage】
    1.picture属性:加载图片2.隐藏边框:Style---BorderStyle:=ebsNone3.设置控件背景色:style---color4.properties属性设置:    5.禁用右键菜单.properties---Po......