我们使用节点模块加密和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');
};
使用最有可能是随机会话GUID的关键,因此查询字符串只会是好的,只要该会话是有效的。
问题,我看到的是,如果一个会话GUID是比编码字符串不同,该功能将仍然解密十六进制字符串,但结果将是无效的。
是否有一个正则表达式的字符串(以检测是否有非有效的字符是字符串中返回)或一些其他方法来确定是否一个不同的密钥是用来比原来的键以外的字符串解码?
我将很快创建一个快速中间件,它将查看每个传入的req并确定是否需要解密req.query或req.form,并尝试确定查询字符串是否正确解密。
JSON并不是真的需要,所需要的一切,以及完成的是添加一个必须正确解密的金丝雀。 – zaph
@zaph是的,当然JSON是不需要的(这就是为什么我写“你可以用许多不同的方式做这样的事情”),但是JSON做这样的事情是相当简单的。它可能会与其他字符串一起加入字符串,并在解密后查看它是否存在。这里的JSON属性的键名称充当了金丝雀,但当然可以通过多种方式完成。 – rsp
更简单的是预先(或附加)一个字符串,如:“Iamacanary”。最简单的解决方案通常是最好的,也更难以“搞砸”。 – zaph