JavaScript中减号(-)运算符的非数学用途及代码执行疑问
为什么URL参数会触发alert?
先看你的代码:
let jeff = (new URL(location).searchParams.get('jeff') || "No parameters."); eval(`ma = "Ma name ${jeff}"`); document.write(ma)
对应的URL解码后为:
basic.html?jeff="-alert(1)-"
拆解触发alert的全过程:
- URL里的
%22是双引号的URL编码,所以jeff变量实际拿到的值是"-alert(1)-"。 - 模板字符串拼接后,eval要执行的代码变成了:
ma = "Ma name "-alert(1)-"" - 这段代码被拆成了三部分:
"Ma name "(字符串)、-alert(1)-(可执行代码)、""(空字符串)。JS会优先执行中间的alert(1),这里的减号只是对alert返回值(undefined)做取负运算,不影响alert先触发。 - eval会把整段内容当作JS代码执行,所以alert(1)会被调用弹出窗口。
本质问题不是减号的非数学用途,而是你用eval执行了拼接用户可控内容的字符串,用户传入的双引号直接闭合了原有字符串的引号,把恶意代码变成了可执行部分——这是典型的代码注入漏洞,绝对不要用eval处理用户输入的内容。
内容的提问来源于stack exchange,提问作者daniel avihasira
相关产品推荐
相关产品推荐

