从IE地址栏执行Vbscript

时间:2012-12-26 22:11:51

标签: javascript browser vbscript

有没有办法直接从我的地址栏执行我的vbscript代码?我正在寻找类似于JavaScript的东西。

另一方面,浏览器没有运行vbscript带来的主要安全风险,因为它在运行时拥有的权限比JavaScript更多?

2 个答案:

答案 0 :(得分:0)

与Javascript几乎完全相同,但效果不佳: vbscript:replace(document.body.innerhtml,"Address Bar","sandwich")

本质上,这会导航到一个页面,该页面的源代码与函数调用的返回值相同。

我做过任何没有返回结果的命令的尝试都会导致页面错误...

至于你的旁注,不是真的。浏览器限制脚本可以执行的操作。例如,您可以通过CreateObject("whatever")使用VBS自动创建对象,但如果从浏览器运行,则会提示您允许Active-X控件。 (你可以用Javascript做同样的事情)

答案 1 :(得分:0)

您可以完全像使用Javascript一样调用VBScript,我的意思是“完全正确”。对于VBScript和Javascript,通过将命令字符串传递给相关语言的eval()来“执行”语言说明符(javascript:或vbscript :)之后的“命令”。 Javascript和VBScript之间的区别在于,对于VBScript,eval()的参数必须是有效的VBScript表达式,而对于Javascript,eval()将解析并执行实质上是语法上有效的Javascript的任何字符串,无论是否是否是单个Javascript表达式,然后返回该字符串中最后执行的表达式语句的值(如果没有,则返回Void)。因此,

javascript:for(i=0;i<5;++i)alert(i)

完全有效

vbscript:for i = 0 to 4 : alert i : next

不是。

没有绝望,有一个解决方法。 ExecuteExecuteGlobal都被定义为“语句”(尽管它们的行为实际上类似于预定义的过程,也称为Sub),因此不能用作传递给eval()的“表达式”,位于至少不是通常的语法形式

Execute <some string containing statements>
ExecuteGlobal <some string containing statements>

但是,通过“伪造”,使ExecuteExecuteGlobal 看起来像函数调用(表达式)

Execute(<some string containing statements>)
ExecuteGlobal(<some string containing statements>)

即使没有返回值,VBScript似乎也很乐意“评估”它们,这对于 true VBScript函数是必需的(即使返回的“值”为Nothing,Null或Empty) )。没有Java语言中的“无效”概念。请注意,我包括ExecuteGlobal只是为了完整性。 eval()从地址栏中执行的任何“命令”已经在全局范围内。

实际上,此“伪造”适用于其他过程。特别是alertalert没有返回值,因此不是VBScript函数。通常会在<script>元素内将其调用为

alert <some message string>

但是可以从地址栏中调用为

vbscript:alert(<some message string>)

现在,alert不是VBscript的一部分,而是全局(在IE中,window)对象的方法。因此,VBScript函数和过程调用的严格语法不适用,而是适用于COM对象方法调用的较宽松的实现。在这里,方法可以在表达式中作为函数调用(如果需要返回值),也可以在语句中作为Sub调用(如果不需要)。如果特定方法未返回值(即返回类型为Void,应始终作为Sub调用),则将其作为函数调用将返回Empty,这是一个非常有效的表达式值。因此,WshShell.Exec的这两个调用都是有效的

<script type="text/vbscript">
dim wsh, oexec

set wsh = createobject("wscript.shell")

wsh.exec "calc"
set oexec = wsh.exec("calc")
</script>

并且它们起作用(带有“您真的要这样做吗?”警告)。因此,似乎ExecuteExecuteGlobal(还有Eval BTW)并不是真正的“声明”(或函数),而是全局对象的方法,例如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年)。它告诉您如何做可能比仅仅学习Java脚本困难(且通用性较低)的方法。如果您已经可以使用Javascript,为什么还要在VBScript中尝试呢?再说一次,可能还有一些用户仍然只在VBScript上运行XP上的IE7。我知道仅在没有其他选择时才升级。

如果它没有损坏,请不要修复它!

是的,我知道IE7(IE *)相当差(和XP),但是,嘿,如果您对自己所拥有的感到满意,那么您还想要什么?