アドレスバーから直接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の場合、引数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
「ステートメント」として定義され(実際には事前定義されたプロシージャ、別名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にあるような「Void」の概念はありません。ExecuteGlobal
完全を期すためにのみ含めることに注意してください。アドレスバーから実行される「コマンド」eval()
は、すでにグローバルスコープにあります。
実際、この「偽造」は他の手順にも適用できます。特に、alert
。alert
戻り値がないため、VBScript関数ではありません。通常、(<script>
要素内で)次のように呼び出されます。
alert <some message string>
ただし、アドレスバーから次のように呼び出すことができます
vbscript:alert(<some message string>)
現在、alert
はVBscriptの一部ではありませんが、グローバル(IEではwindow
)オブジェクトのメソッドです。したがって、VBScript関数およびプロシージャ呼び出しの厳密な構文は適用されませんが、COMオブジェクトメソッドの呼び出しに適用されるより緩い実装が適用されます。ここで、メソッドは、式の関数として(戻り値が必要な場合)、またはステートメントのサブとして(必要がない場合)呼び出すことができます。特定のメソッドが値を返さない場合(つまり、戻り型が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
。すべてのJavascript実装にGlobal.parseInt()が必要であるのと同様に、すべての実装にそれらを含める必要があるため、これらはVBScriptリファレンスに含まれています。しかし、これは私たちが次のようなことをすることを可能にするので良いニュースです
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)
(たぶん、IEモードを強制してから互換モードにすることでEdgeでも可能ですが、私はこれを試していません。)
つまり、実際には、この答え全体は主に学術的なものです(2020年)。これは、Javascriptを学ぶ努力をするよりも、おそらくはるかに難しい(そして用途が狭い)ことを行う方法を示しています。すでにJavascriptを使用できるのに、なぜVBScriptでそれを実行しようとしているのでしょうか。繰り返しになりますが、VBScriptしか知らないXPでIE7を実行しているユーザーがいる可能性があります。他に選択肢がない場合にのみアップグレードすることを知っています。
壊れていない場合は、修正しないでください。
はい、IE7(IE *)はかなり壊れている(そしてXP)ことは知っていますが、もしあなたが持っているものに満足しているなら、他に何が欲しいですか?