gpt4 book ai didi

javascript - 使用 react js 状态来存储经过身份验证的用户的 token 是否安全?

转载 作者:行者123 更新时间:2023-11-29 20:49:20 34 4
gpt4 key购买 nike

我正在使用 react js 和 node js api 实现一个简单的用户身份验证系统。这就是我在 ComponentWillMount 方法中所做的:-

1.检查 token 是否存在(在localStorage中)
2.如果它不退出那么状态'token'的值将保持空白
3.如果它存在然后使用后端请求检查它是否有效。
4.如果 token 有效,则将“ token ”声明为 localstorage.token
5.如果 token 无效,则状态“ token ”的值将保持为空

在渲染方法中,我添加了基于状态“token”值的条件渲染,即如果状态“token”为空,则正常页面将被渲染,否则它将被重定向到用户页面。

问题是我可以使用任何 React 开发工具更改状态“token”的值。这导致了使用假 token 登录的漏洞。为了避免每次使用诸如 componentDidUpdate shouldComponentUpdate 之类的生命周期方法之一更改状态“ token ”时,我都必须检查状态“ token ”的有效性。但是在react

的官方文档中提到shouldComponentUpdate只是作为性能优化存在的。不要依赖它来“阻止”渲染,因为这会导致错误。

使用 componentDidUpdate 没有用,因为它会在组件因状态更改而更改后调用。

使用 componentWillUpdate 在官方文档中被称为不安全

我不确定如何解决这个漏洞。这是组件的代码

import React,{Component} from 'react';
import {
BrowserRouter as Router,
Route,
Link,
Switch,
Redirect
} from 'react-router-dom';

import Home from './Home';
import Nav from './Nav';
import Login from './Login';
import Signup from './Signup';

class Out extends Component{
constructor(){
super();

this.state = {
token : '',
isLoading:false
}
this.isLoading = this.isLoading.bind(this);
}

logout(){
alert('logged out');
}

componentWillMount(){
let {match} = this.props;
this.navNoSessionRouteData = [
{to:`${match.url}login`,name:'Login',key:'r1'},
{to:`${match.url}signup`,name:'signup',key:'r2'},
{to:`${match.url}`,name:'Home',key:'r3'}
];

this.navNoSessionButtonData = [];

this.setState({
isLoading:true
});

const tokenVar = localStorage.getItem('token');
if(tokenVar == null){
console.log('not logged in');
this.setState({
isLoading:false
});
}else{
fetch('http://localhost:3000/api/account/verify?token='+tokenVar)
.then(res=>res.json())
.then(json=>{
if(json.success){
console.log('logged in');
this.setState({
token : tokenVar,
isLoading:false
});
}else{
this.setState({
isLoading:false,
});
}
});
}
}

isLoading(){
let {isLoading,token} = this.state;
if(isLoading === true){
return (
<p>Loading...</p>
);
}
else{
let {match} = this.props
console.log(token);
return(
<div>
{
(token)?<p>Logged In</p>:(<p>NOT logged IN</p>)
}
<div className = "row">
<Nav navRouteData = {this.navNoSessionRouteData} navButtonData = {this.navNoSessionButtonData}/>
</div>
<div className="row justify-content-center">
<Switch>
<Route exact = {true} path={`${match.path}`} component={Home} />
<Route path={`${match.path}login`} component={Login}/>
<Route path={`${match.path}signup`} component={Signup}/>
</Switch>
</div>
</div>
)
}
}


render(){
return(
<div>
{this.isLoading()}
</div>
)
}
}

export default Out;

image is showing logged in user using real token image is showing logged out user with blank token image is showing logged in user with fake token

最佳答案

只是在这里循环,我会用两个问题来回答这个问题:

(I think closer to your question): If I can edit React state variables, how is anything I display secure?

这里的重点是他们可以导航到要求他们登录的 UI,但是当他们实际去请求数据时(无论是到您的后端,还是直接到您的数据库,如 Firebase),他们将需要一个有效的 token 来这样做。您的后端应该对此进行检查,并且不会返回任何有值(value)的数据。

If I can read React state variables, how safe is my token from being stolen and used by someone else to request and write data?

为此,请参阅 this answer

关于javascript - 使用 react js 状态来存储经过身份验证的用户的 token 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52699482/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com