JavaScript parseInt()を使用したピットノット
1251 ワード
シーンは、いくつかの変数を含む文字列に基づいて署名を計算します.
期待される変数
idは16ビットの数字列です
本来は
しかし、parseIntが返す結果は本来の値に対して変化することが分かった.
照会What is JavaScript's highest integer value that a Number can go to without losing precision?後にjsが安全に処理できる最大整数は:9007199254740991
最後に、文字列を置換して解決します.
var data = {
type: this.type,
timestamp: this.timestamp,
id: this.id,
};
var s = 'hello';
var b = 'world';
var k = `${s}&${b}&${JSON.stringify(data)}`;
期待される変数
k
は長いはずです.'hello&world&{"type":0,"timestamp":1488191490594,"id":9800000000085572}'
idは16ビットの数字列です
本来は
this.id
がstringタイプですが、JSONでフォーマットすると自動的にstringタイプに二重引用符が付けられ、算出された署名の値が変わります.最初の解決策は乱暴で、id値をNumberフォーマットに変換することです.id: parseInt(this.id)
しかし、parseIntが返す結果は本来の値に対して変化することが分かった.
>> parseInt("9800000000085573")
output: 9800000000085572
照会What is JavaScript's highest integer value that a Number can go to without losing precision?後にjsが安全に処理できる最大整数は:9007199254740991
最後に、文字列を置換して解決します.
var data = {
type: this.type,
timestamp: this.timestamp,
id: "tmpid",
};
var s = 'hello';
var b = 'world';
var k = `${s}&${b}&${JSON.stringify(data).replace('"tmpid"', this.id)}`;