ノードモジュールCryptoとExpressを使用して、クエリ文字列とフォーム名の難読化を提供しています。無効な文字を検出するノード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が文字列をエンコードしたものと異なる場合、関数は引き続き16進文字列を復号化しますが、結果は無効になります。
文字列に無効な文字が返されたかどうかを検出するための正規表現文字列や、元のキー以外の文字列をデコードするために別のキーが使用されたかどうかを判断する他の方法はありますか?
すぐに到着するreqを調べ、req.queryまたはreq.formを解読する必要があるかどうかを判断し、クエリ文字列が正しく解読されたかどうかを調べようとします。
JSONは本当に必要なものではありません。これはすべて必要です。これが達成されているのは、正しく復号化する必要があるカナリアを追加することです。 – zaph
@zaphもちろん、JSONは必要ではありません(そのため、私は「さまざまな方法でこれを行うことができます」)。しかし、JSONはそれほど簡単なことです。それは、他の文字列で文字列に結合し、復号化後にその文字列があるかどうかを調べることができます。ここでは、JSONプロパティのキー名はカナリアとして機能しますが、もちろんさまざまな方法で行うことができます。 – rsp
"Iamacanary"のような文字列を前に付ける(または追加する)ことすら簡単です。最もシンプルな解決法は、一般的に「混乱」するのが一番難しくなります。 – zaph