前端tricks

发现一些值得研究的知识 先开个坑

https://blog.huli.tw/2022/04/14/javascript-string-regexp-magic/

挑战1

1
2
3
4
5
6
var regexp = /huli/g
var str = 'blog.huli.tw'
var str2 = 'example.huli.tw'

console.log(regexp.test(str)) // ???
console.log(regexp.test(str2)) // ???

test()方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回truefalse

看上去会完全一样的 结果却大跌眼镜

不看答案先思考一下为什么

感觉可能要看一下源码?

看一下文档

JavaScript RegExp objects are stateful when they have the global or sticky flags set (e.g. /foo/g or /foo/y). They store a lastIndex from the previous match. Using this internally, test() can be used to iterate over multiple matches in a string of text (with capture groups).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const str = 'table football';

const regex = new RegExp('foo*');
const globalRegex = new RegExp('foo*', 'g');

console.log(regex.test(str));
// expected output: true

console.log(globalRegex.lastIndex);
// expected output: 0

console.log(globalRegex.test(str));
// expected output: true

console.log(globalRegex.lastIndex);
// expected output: 9

console.log(globalRegex.test(str)); //从第九个位置开始找 所以找不到 emm
// expected output: false
1
2
3
4
5
> true
> 0
> true
> 9
> false

interesting!

挑战2

1
2
3
4
5
6
7
8
var password = prompt('input password')
while (!/^[a-zA-Z0-9]+$/.test(password)) {
console.log('invalid password')
password = prompt('input password')
}
password = ''
// 如果可以在底下動態執行程式碼,拿得到 password 嗎?
eval(prompt('try to get password'))

利用挑战1的stateful特性有可能吗?

怎么利用?用来爆破?差太多条件

要利用 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/input

Regex.input 函数

作者的答案 555 没好好打dicectf

1
2
3
/hello/.test('hello world')
console.log(RegExp.input) // hello world
console.log(RegExp.$_) // 同上