新网页内容使用了旧的数据库,刷新就变空白,请问如何使数据库自动更新到新网页内容的数据信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新网页内容使用了旧的数据库,刷新就变空白,请问如何使数据库自动更新到新网页内容的数据信息相关的知识,希望对你有一定的参考价值。

新网页内容使用了旧的数据库,刷新就变空白,请问如何使数据库自动更新到新网页内容的数据信息。网站被黑,恢复网页信息后,应该是数据库是很旧的,这时一旦刷新后台网页内容,前台就显示混乱,导致页面内容丢失变空白。那么请问如何让旧的数据库按照最新的网页内容更新数据库信息,以便刷新后能保持网页正常显示。谢谢

网站用了旧的数据库,要考虑后面有没有修改改过数据库,如果有肯定是不匹配的,可能导致空白,还有可能是被黑以后,篡改了什么,具体得排查原因,网站不一样,不好说,以后安全做好点,不然还会出现了,不会解决的可以提供长期技术支持 参考技术A 个人感觉,这应该是字段对应的问题吧,取不到值导致的

当我使用旧的刷新令牌时,为啥刷新端点会返回新的令牌?

【中文标题】当我使用旧的刷新令牌时,为啥刷新端点会返回新的令牌?【英文标题】:Why refresh endpoint return new tokens when i use old refresh token?当我使用旧的刷新令牌时,为什么刷新端点会返回新的令牌? 【发布时间】:2021-02-04 19:18:34 【问题描述】:

您好,我使用 npm 的这两个库:bcryptjsonwebtoken

我创建/refresh-token 端点并希望生成新的访问和刷新令牌对。所以我将刷新令牌发送到端点并检查它(如果不为空),从数据库中从令牌声明中保存的数据中获取用户,并将请求中的刷新令牌与存储在数据库中的散列刷新令牌进行比较。如果isMatch 为真,我会生成一对新的令牌并使用bcrypt 从刷新令牌创建散列。接下来,我将此哈希保存到数据库中并将新对返回给用户。但是,当我发送与以前相同的刷新令牌时,我仍然会得到新的一对,如果我发送访问令牌而不是刷新令牌isMatch 返回 true 并且我得到新的一对令牌,则更是如此。哈希是从不同的 jwt(不同的字符串)创建的,那么如何在比较中始终为真呢?

import jwt from 'jsonwebtoken';
import bcrypt from 'bcrypt';
import  User  from '../entities/user.model';
import  getRepository  from 'typeorm';
import  InternalServerException  from '../exceptions/exceptions';

interface AccessPayload 
  email: string;
  role: string;
;

export class JwtTokenProvider 

  private readonly jwtSecret: string = process.env.JWT_SECRET as string;

  generateAccessTokens = async (user: User) => 
    if (!user) 
      throw new InternalServerException('Failed to generate JWT Token - User is null');
    ;
    const accessPayload: AccessPayload = email: user.email, role: user.role as string;
    const accessToken: string = jwt.sign(accessPayload, this.jwtSecret, 
      expiresIn:  process.env.TOKEN_EXP_TIME as string
    );
    const refreshToken: string = jwt.sign(accessPayload, this.jwtSecret, 
      expiresIn: process.env.REFRESH_EXP_TIME as string
    );
    this.saveRefreshToken(user, refreshToken);
    return  accessToken, refreshToken ;
  ;

  getUserFromToken = async (token: string): Promise<User | undefined>  => 
    const tokenPayload = await jwt.verify(token, this.jwtSecret) as AccessPayload;
    return await getRepository(User).findOne( email: tokenPayload.email ,  relations: ['groupScope'] );
  ;

  compareRefreshTokens = async (plainToken: string, hashToken: string): Promise<boolean> => 
    return await bcrypt.compare(plainToken, hashToken);
  ;

  private saveRefreshToken = async (user: User, refreshToken: string): Promise<any> => 
    user.refreshToken = await this.encodeRefreshToken(refreshToken);
    await getRepository(User).save(user);
  ;

  private encodeRefreshToken = async (refreshToken: string): Promise<string> => 
    return await bcrypt.hash(refreshToken, 12);
  
;

public refreshToken = async (request: Request, response: Response, next: NextFunction) => 
    try 
     const requestToken = request.body.refresh_token as string;
      if (!requestToken) 
        return next(new BadRequestException('Refresh token cannot be empty'));
      
      const user = await this.jwtProvider.getUserFromToken(requestToken);
      if (!user) 
        return next(new AuthorizedException('Cannot get user from token'));
      
      const isMatch = await this.jwtProvider.compareRefreshTokens(requestToken, user.refreshToken);
      if(!isMatch) 
        return next(new AuthorizedException('Refresh token is incorrect'));
      
      const  accessToken, refreshToken  = await this.jwtProvider.generateAccessTokens(user);
      response.status(200).send( accessToken, refreshToken );
     catch (error) 
        return next(new Error(error.message));
      ;
  ;

【问题讨论】:

【参考方案1】:

来自bcrypt repo page:

最大输入长度为 72 个字节(注意 UTF8 编码字符最多使用 4 个字节),生成的哈希长度为 60 个字符。

这意味着只使用字符串的前 72 个字节。匹配刷新令牌时忽略任何额外的字节(注意这不是前 72 个字符)。由于匹配了 72 个字节,因此您在使用旧令牌时会收到成功响应。

一种解决方法是首先使用 SHA-256 对字符串进行哈希处理,然后使用 bcrypt。

import  createHash  from 'crypto';

const hash = createHash('sha256').update(user.refreshToken).digest('hex');
user.refreshToken = bcrypt.hashSync(hash, salt);

然后(可能在另一个文件中):

import  createHash  from 'crypto';

const hash = createHash('sha256').update(refreshToken).digest('hex');
if (await bcrypt.compare(hash, user.refreshToken)) 
  // refresh tokens are matched!

【讨论】:

以上是关于新网页内容使用了旧的数据库,刷新就变空白,请问如何使数据库自动更新到新网页内容的数据信息的主要内容,如果未能解决你的问题,请参考以下文章

chrome打开淘宝网页顶部总是有一块空白,请问是 怎么回事?

学习Python总是学了新内容又忘了旧的咋办?

为啥从网上复制的东西到WORD里面文字格式就变了,显示乱码了呢

如何显示当前 .bashrc 文件的来源?

新选项卡中的 Base64 PDF 显示刷新前的空白页

当我使用旧的刷新令牌时,为啥刷新端点会返回新的令牌?