【问题标题】:NodeJS and Express - substring searchNodeJS 和 Express - 子字符串搜索
【发布时间】:2021-02-06 15:42:10
【问题描述】:

在以下代码中,我使用 Express JS 和 AES256 加密基于预定义的密钥对简单文本字符串进行编码和解码。 具体来说,Express JS Web 服务器允许我根据 URL 的内容显示某些元素。 例如,如果 URL 是 abc.com/encryption?code=hi,服务器会显示加密文本。但是,如果 URL 是 abc.com/decryption?code=NN(GFSO&8UOUSDB,我会得到纯文本。 加密过程中会出现问题:当加密字包含 HTTP 识别的特殊符号($、&、+、;、?)时,解码完全失败。 验证条件似乎在逻辑上是正确的,但我不能总是获得有效的结果。 非常感谢。

const aes256 = require('aes256');
const express = require('express');
const web_server = express();

var key = 'LeIdeeMettonoInMotoIlFuturo';
var cipher = aes256.createCipher(key);

async function aes_encryption(plaintext) {
  do{
    var encrypted = await cipher.encrypt(plaintext);
  } while (await validation(encrypted))
  return encrypted;
}

async function validation(string){
  if (string.indexOf("$") != -1 && string.indexOf("&") != -1 && string.indexOf("+") != -1 && string.indexOf(";") != -1 && string.indexOf("?") != -1){
    return true;
  }
  return false;
}

async function aes_decryption(encrypted){
  var decrypted = await cipher.decrypt(encrypted);
  return decrypted;
}

web_server.get('/', function (request, response) {
  response.send('Write /encryption/:parola_da_codificare or /decryption/:testo_da_decodificare');
})

web_server.get('/encryption/', async function (request, response) {
  var result = await aes_encryption(request.query.code);
  response.send('Your code crypted is: ' + result);
})

web_server.get('/decryption/', async function (request, response) {
  var result = await aes_decryption(request.query.code);
  response.send('Your code decripted is: ' + result);
})

web_server.listen(3000)

【问题讨论】:

  • 您应该在请求标头的正文中发送代码。
  • @DeekshithHegde 这只是一个好的编程实践建议还是代码正确性的决定因素?
  • 在 URL 中发送敏感数据始终不是一个好习惯。除此之外,URL 也有限制,它不允许您在请求中发送特殊字符,因此在这种情况下,您应该切换到 Post 方法或在标头中发送它。在您的情况下,第二个是不错的选择

标签: javascript node.js express encryption aes


【解决方案1】:

问题出在validation() 函数中。

  1. 只有在字符串中找到任何一个符号时,才应返回true。返回 true 将使 while 循环保持打开状态。

  2. 但是当字符串中不存在所有符号时,您将返回true。在这种情况下,您应该返回 false 以便 while 循环可以中断并且您可以获得最后一个字符串。

function validation(string){

    if(["$","&","+",";","?"].some(v => string.includes(v))){
        return true
    }
    return false
}

看看修改后的验证函数,它应该可以解决问题,你甚至不需要 async-await 这个函数。

【讨论】:

    猜你喜欢
    • 2017-02-09
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 2019-10-06
    • 2011-09-25
    • 2011-02-10
    • 2011-11-30
    相关资源
    最近更新 更多