有没有办法直接从我的地址栏执行我的vbscript代码?我正在寻找类似于JavaScript的东西。
另一方面,浏览器没有运行vbscript带来的主要安全风险,因为它在运行时拥有的权限比JavaScript更多?
答案 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
不是。
没有绝望,有一个解决方法。 Execute
和ExecuteGlobal
都被定义为“语句”(尽管它们的行为实际上类似于预定义的过程,也称为Sub),因此不能用作传递给eval()
的“表达式”,位于至少不是通常的语法形式
Execute <some string containing statements>
ExecuteGlobal <some string containing statements>
但是,通过“伪造”,使Execute
或ExecuteGlobal
看起来像函数调用(是表达式)
Execute(<some string containing statements>)
ExecuteGlobal(<some string containing statements>)
即使没有返回值,VBScript似乎也很乐意“评估”它们,这对于 true VBScript函数是必需的(即使返回的“值”为Nothing,Null或Empty) )。没有Java语言中的“无效”概念。请注意,我包括ExecuteGlobal
只是为了完整性。 eval()
从地址栏中执行的任何“命令”已经在全局范围内。
实际上,此“伪造”适用于其他过程。特别是alert
。 alert
没有返回值,因此不是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>
并且它们起作用(带有“您真的要这样做吗?”警告)。因此,似乎Execute
和ExecuteGlobal
(还有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开始已被完全禁用。您可以通过使用兼容模式(使用开发人员工具或使用
<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),但是,嘿,如果您对自己所拥有的感到满意,那么您还想要什么?