node.js - Node Express 正则表达式检测无效字符

标签 node.js regex string express

我们使用 Node 模块 Crypto 和 Express 来提供一些查询字符串和表单名称混淆。

'use strict';

var algorithm = 'aes-256-ctr'
    , crypto = require('crypto')
    ;

var enc = function(string, key){
    var cipher = crypto.createCipher(algorithm, key);
    var buff = Buffer.from(string, 'utf8');
    return Buffer.concat([cipher.update(buff), cipher.final()]).toString('hex').toUpperCase();
};

var dec = function(string, key){
    var decipher = crypto.createDecipher(algorithm, key);
    var buff = Buffer.from(string, 'hex');
    return Buffer.concat([decipher.update(buff), decipher.final()]).toString('utf8');
};

使用的 key 很可能是随机 session GUID,因此查询字符串仅在该 session 有效时有效。

我看到的问题是,如果 session GUID 与编码字符串的 GUID 不同,该函数仍将解密十六进制字符串,但结果将无效。

是否有正则表达式字符串(用于检测字符串中是否返回任何无效字符)或其他方式来确定是否使用不同的 key 来解码字符串而不是原始 key ?

我将很快创建一个快速中间件,它将查看每个传入的请求并确定 req.query 或 req.form 是否需要解密,并尝试确定查询字符串是否已正确解密。

最佳答案

这就是我要做的。如果您有一个想要加密的字符串,并且能够在事后得知您已正确解密它,那么您可以加密一个对象的 JSON 表示形式,而不是加密像 'abc' 这样的裸字符串{string: 'abc'} - 这将是一个字符串:'{"string":"abc"}'

您可以使用如下函数对这样的字符串进行编码:

let encode = string => JSON.stringify({string});

现在 encode('abc') 返回一个字符串:'{"string":"abc"}'

当您解密字符串并使用 JSON.parse() 进行解密时,它会生成一个具有 string 属性的对象,那么您可以相当确定它不是随机垃圾。

解密后,您可以使用如下函数解码结果:

let decode = json => { try { return JSON.parse(json).string; } catch (e) {} };

对于正确的 JSON,它将返回正确的字符串,但对于无效的 JSON,则返回未定义的字符串。

当然,您可以通过许多不同的方式执行类似的操作,但这是一种相当简单的方法,您不需要对代码进行太多更改。

要获得更强大的解决方案,您可以使用 JWT:

关于node.js - Node Express 正则表达式检测无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43190018/

相关文章:

python - 删除文本文件中以 `#|...|#` 为界的注释 block - python

.net - Powershell-将COM对象类型转换为字符串

javascript - Rails/Laravel 生态系统相当于 Javascript/NodeJS 生态系统吗?

node.js - fs.readFileSync - 错误 : EMFILE, 打开的文件太多 'D:\Workspace\some.json'

javascript - 由于尖号 (#) 字符,javascript 正则表达式捕获中缺少字符

regex - sed:匹配一个词前的一组数字

regex - 如何获取满足一定条件的$Matches索引的索引?

c++ - 在构造函数中调整字符串成员的大小

Ajax 与 Socket.io

node.js - 无法将响应发送回nodeJS 中的index.js