有没有办法可以直接从地址栏执行我的 vbscript 代码?我正在寻找与 JavaScript 类似的东西。
附带说明一下,从浏览器运行 vbscript 是否存在重大安全风险,因为它在运行时比 JavaScript 具有更多权限?
有没有办法可以直接从地址栏执行我的 vbscript 代码?我正在寻找与 JavaScript 类似的东西。
附带说明一下,从浏览器运行 vbscript 是否存在重大安全风险,因为它在运行时比 JavaScript 具有更多权限?
与 Javascript 几乎相同的方式只是不能很好地工作:
vbscript:replace(document.body.innerhtml,"Address Bar","sandwich")
本质上,这会导航到一个页面,该页面的源代码与函数调用的返回值等效。
我所做的任何尝试执行没有返回结果的命令都会导致页面上出现错误......
至于你的旁注,不是真的。浏览器限制了脚本可以做什么。例如,您可以通过 使用 VBS 自动创建对象CreateObject("whatever")
,但如果从浏览器运行,系统将提示您允许 Active-X 控件。(你可以用 Javascript 做同样的事情)
您可以像调用 Javascript 一样调用 VBScript,我的意思是“完全”。对于 VBScript 和 Javascript,语言说明符(javascript: 或 vbscript:) 之后的“命令”通过将命令字符串传递给eval()
(相关语言的)来“执行”。Javascript 和 VBScript 之间的区别在于,对于 VBScript,参数 toeval()
必须是有效的 VBScript 表达式,而对于 Javascript,eval()
将解析和执行基本上任何语法上有效的 Javascript 字符串,无论它是否是单个 Javascript 表达式,并且返回该字符串中最后执行的表达式语句的值(或者Void
如果没有)。因此,虽然
javascript:for(i=0;i<5;++i)alert(i)
完全有效,
vbscript:for i = 0 to 4 : alert i : next
不是。
不要绝望,有一个解决方法。两者Execute
和ExecuteGlobal
都被定义为“语句”(尽管它们实际上的行为类似于预定义的过程,也就是 Subs),因此不能用作传递给 的“表达式” eval()
,至少不能以它们通常的句法形式使用
Execute <some string containing statements>
ExecuteGlobal <some string containing statements>
Execute
但是,通过“伪装” ,使其ExecuteGlobal
看起来像函数调用(它们是表达式)
Execute(<some string containing statements>)
ExecuteGlobal(<some string containing statements>)
VBScript 似乎很乐意“评估”它们,即使没有返回值,这对于真正的VBScript 函数是必需的(即使返回的“值”是 Nothing、Null 或 Empty)。没有 Javascript 中的“无效”概念。请注意,我ExecuteGlobal
仅出于完整性考虑。从地址栏执行的任何“命令”eval()
都已经在全局范围内。
事实上,这种“伪装”也适用于其他程序。特别是,alert
。alert
没有返回值,因此不是 VBScript 函数。它通常会被调用(在一个<script>
元素内)
alert <some message string>
但可以从地址栏调用
vbscript:alert(<some message string>)
现在,alert
它不是 VBscript 的一部分,而是全局(在 IE 中为window
)对象的方法。因此,VBScript 函数和过程调用的严格语法并不适用,而是适用于 COM 对象方法调用的更宽松的实现。在这里,方法可以在表达式中作为函数调用(如果您想要返回值)或作为语句中的 Sub(如果您不想要)。如果特定方法没有返回值(即具有返回类型Void
并且应始终作为 Sub 调用),则将其作为 Function 调用会返回Empty
一个完全有效的表达式值。所以这两个 WshShell.Exec 调用都是有效的
<script type="text/vbscript">
dim wsh, oexec
set wsh = createobject("wscript.shell")
wsh.exec "calc"
set oexec = wsh.exec("calc")
</script>
他们工作(带有“你真的想这样做吗?”警告)。因此,似乎Execute
and ExecuteGlobal
(以及Eval
顺便说一句)并不是真正的“语句”(或函数),而是全局对象的方法,例如alert
. 它们包含在 VBScript 参考中,因为每个实现都必须包含它们,就像每个 Javascript 实现都必须有一个 Global.parseInt()。但这是个好消息,因为它允许我们做类似的事情
vbscript:execute("if left(document.URL,5) <> ""https"" then alert(""NOT SECURE!!!!!"")")
当然,所有这一切中最大的警告是
它只能在 INTERNET EXPLORER 中工作,然后只能到 IE10。
没有其他浏览器运行 VBScript(甚至是 Edge),并且从 IE11 开始它已被完全禁用。您可以通过使用开发人员工具或使用兼容模式伪造页面来使其在 IE11 中运行
<meta http-equiv="X-UA-COMPATIBLE" content="IE=7"> (or 8 or 9 or 10)
(甚至在 Edge 中通过强制 IE 模式然后是兼容模式,但我还没有尝试过。)
所以真的,整个答案在很大程度上是学术性的(在 2020 年)。它告诉您如何做一些可能比仅仅努力学习 Javascript 更困难(并且用途更少)的事情。如果您已经可以使用 Javascript,为什么还要尝试在 VBScript 中执行此操作?再说一次,可能还有一些用户仍然在 XP 上运行 IE7,他们只知道 VBScript。我知道我只有在别无选择时才升级。
如果它没有坏,不要修理它!
是的,我知道 IE7 (IE*) 相当糟糕(和 XP),但是,嘿,如果你对你所拥有的感到满意,那么你还想要什么?