A 974455. számú összegző biztonsági frissítés telepítése után az Internet Explorer böngészőben típuseltérésről tájékoztató VBScript-hibaüzenet jelenhet meg

BEVEZETÉS

Az Internet Explorer böngésző 974455. számú összegző biztonsági frissítése, melyet a MS09-054 jelű biztonsági közlemény ismertet, típusellenőrzést vezetett be különféle metódusokba bizonyos biztonsági rések elhárítása érdekében. Egyes helyzetekben ezek az új biztonsági ellenőrzések típuseltérési hibát okozhatnak a VBScript-parancsfájlokat használó, illetve a VBScript- és JavaScript-kódot egyszerre futtató weblapokon.

Az MS09-054 jelű összegző biztonsági frissítésről a Microsoft Tudásbázis alábbi cikkében tájékozódhat:
974455 MS09-054: Összegző biztonsági frissítés az Internet Explorer programhoz

A jelenség

Típuseltérésről tájékoztató hibaüzenet jelenhet meg azoknak a weblapoknak az esetében, amelyek ügyféloldali parancsnyelvként VBScriptet alkalmaznak, és a showModalDialog() vagy a showModelessDialog() metódust is használják. A Microsoft megállapította, hogy az alábbi három esetben történhet típuseltérési hiba:

  • showModalDialog()
    Az első eset az, ha a VBScript-parancsfájl egy Array() értéket ad át paraméterként a showModalDialog() metódusnak. A showModalDialog() metódus egy kötelező argumentumot (sURL), illetve két nem kötelező argumentumot (vArguments és sFeatures) támogat. A vArguments paraméter egy VARIANT típusú paraméter, mely a dokumentum megjelenítésekor használandó argumentumokat határozza meg. Ha a fejlesztő úgy dönt, hogy Array() értéket ad át közvetlenül a nem kötelező vArguments paraméterként, az típuseltérési hibához vezet.


    A showModalDialog metódusról további tájékoztatást a Microsoft MSDN alábbi weblapján talál:

  • showModelessDialog()
    A második eset az, ha a VBScript-parancsfájl egy Array() értéket ad át paraméterként a showModelessDialog() metódusnak. A showModelessDialog() metódus egy kötelező argumentumot (sURL), illetve két nem kötelező argumentumot (vArguments és sFeatures) támogat. A vArguments paraméter egy VARIANT típusú paraméter, mely a dokumentum megjelenítésekor használandó argumentumokat határozza meg. Ha a fejlesztő úgy dönt, hogy Array() értéket ad át közvetlenül a nem kötelező vArguments paraméterként, az típuseltérési hibához vezet.



    A showModelessDialog metódusról további tájékoztatást a Microsoft MSDN alábbi weblapján talál:

  • returnValue
    A harmadik esetben egy modális párbeszédpanel returnValue értékének explicit beállítása okozza a problémát. A returnValue egy olvasható és írható tulajdonság, melynek nincs alapértelmezett értéke. Az MSDN webhelyen lévő dokumentáció szerint a returnValue tulajdonság kizárólag a showModalDialog() metódussal létrehozott ablakok esetében érvényes. Ha a fejlesztő úgy dönt, hogy egy modális párbeszédpanel returnValue tulajdonságának értékét explicit módon Array() értékre állítja, az típuseltérési VBScript-hibához vezet.


    A returnValue tulajdonságról további tájékoztatást a Microsoft MSDN alábbi weblapján talál:

A Microsoft eddigi eredményei szerint a 974455. számú összegző biztonsági frissítéssel kapcsolatos típuseltérési hiba nem jelentkezik azoknál a weblapoknál, amelyek kizárólag JavaScriptet használnak ügyféloldali parancsnyelvként. A probléma csak a VBScript környezetet, illetve azon belül is a showModalDialog() metódus, a showModelessDialog() metódus és a returnValue tulajdonság használatát érinti. A VBScript és a JavaScript parancsnyelvet vegyesen alkalmazó weblapok esetében a hiba a korábban tárgyalt metódusok és tulajdonság használatakor léphet fel, illetve akkor, ha a weblap VBArray objektumot használ. A VBArray objektum használata ritka, ezért a jelen cikk az ezzel kapcsolatos problémákat nem tárgyalja.

Oka

Az Internet Explorer böngésző MS09-054 jelű összegző biztonsági frissítése az Internet Explorer korábban azonosított biztonsági réseinek javítására lett kiadva. Az összegző biztonsági frissítés részeként új ellenőrzési lépéseket vezettünk be a VARIANT típusú paraméterek veszélyes adattípusokra való véletlen konvertálásának megelőzése érdekében. A hozzáadott biztonsági ellenőrzések tovább növelik a felhasználói változóként átadott VARIANT típusú paraméterekre vonatkozó megkötéseket, hogy ezzel megóvják a felhasználót bizonyos támadásokkal szemben. Ez a szigorúbb ellenőrzés a VARIANT adattípust szabályosan használható webhelyeket is érintheti.

A megoldás

A probléma elhárításához telepítse a 976749. számú frissítést, miután telepítette a 974455. számú biztonsági frissítést. A problémáról a Microsoft Tudásbázis alábbi cikkében tájékozódhat:
976749 Megjelent egy frissítés az Internet Explorer programhoz, amely a KB974455 (MS09-054) jelű biztonsági frissítés telepítése után bekövetkező problémák megszüntetéséhez szükséges

Fontos: Ha nem telepítette a 974455. számú biztonsági frissítést, ne telepítse a 976749. számú frissítést, ellenkező esetben előfordulhat, hogy az Internet Explorer böngésző nem fog megfelelően működni. Ha ez megtörténne, távolítsa el a 976749. számú frissítést, telepítse a 974455. számú biztonsági frissítést, majd telepítse újra a 976749. számú frissítést.


Kerülő megoldás

Ha a jelen cikkben ismertetett jelenségeket tapasztalja, tanácsos folytatni a 974455. számú összegző biztonsági frissítés telepítését, illetve telepíteni a 976749. számú frissítést. Az összegző biztonsági frissítés eltávolítása biztonsági kockázatot jelent.


A jelenségeket ismertető bekezdésben tárgyalt első és második helyzet esetén egy kerülő megoldást is alkalmazhat, ha nem kívánja telepíteni a 974455. számú biztonsági frissítést. A probléma kerülő megoldásához explicit módon deklarálnia kell az Array() változót egy VBScript változóvá. A tömbök showModalDialog() vagy showModelessDialog() metódusnak való átadása nem okoz típuseltérési hibát.

Az alábbi VBScript-kód például típuseltérési hibához vezet.

// TÍPUSELTÉRÉSI HIBA
vReturn = window.showModalDialog("http://www.contoso.com", Array(1,2,3,4,5,6,7))
Az alábbi VBScript-kód típuseltérési hiba nélkül ad át egy tömböt a showModialDialog() vagy showModelessDialog() metódusnak.
// NINCS TÍPUSELTÉRÉSI HIBA
Dim sajatTomb
sajatTomb=Array(1,2,3,4,5,6,7)
vReturn = window.showModalDialog("http://www.contoso.com", sajatTomb)
A korábban ismertetett helyzetek közül a harmadiknál létezik egy kerülő megoldás arra az esetre, ha nem kívánja telepíteni a 974455. számú frissítést. Azokban az esetekben, amelyekben egy egydimenziós Array() értéket kell átadnia a returnValue tulajdonságnak, használja a Join és a Split VBScript-függvényt. Ily módon közvetve Array() értékeket is adhat át a returnValue tulajdonságnak.

Az alábbi VBScript-kód például típuseltérési hibát okoz.

// TÍPUSELTÉRÉSI HIBA
Dim tombElemek
tombElemek(0) = 1
tombElemek(1) = 2
tombElemek(2) = 3
Window.returnvalue = tombElemek
A Join és a Split VBScript-függvény használatakor típuseltérési hiba nélkül állíthatja be a returnValue tulajdonság értékét.

// NINCS TÍPUSELTÉRÉSI HIBA
Dim tombElemek
tombElemek(0) = 1
tombElemek(1) = 2
tombElemek(2) = 3

Dim tombSzoveg = Join(tombElemek, ";")
Window.returnvalue = tombSzoveg
Dim ideigSzoveg = window.showModalDialog(……)
Dim tombElemek = Split(ideigSzoveg, ";")

Az alábbiakban a harmadik eset azon előfordulásainak kerülő megoldását láthatja, amelyeknél több dimenziós vagy objektumokat tartalmazó Array() értéket kell átadnia a returnValue tulajdonságnak. Kerülő megoldásként itt JavaScript-függvénnyel kell beállítania a returnValue tulajdonság értékét. A használandó JavaScript-függvény elérhető VBScript-szubrutinokkal és -függvényekkel, és a returnValue tulajdonság JavaScript-függvénnyel beállított értéke is elérhető marad a VBScript-parancsfájlnak.



Az alábbi VBScript-kód például típuseltérési hibát okoz.

// TÍPUSELTÉRÉSI HIBA
<script LANGUAGE=vbscript>
Option Explicit
Sub Window_OnLoad
Dim abc(1,2,3)
Window.ReturnValue = abc
End Sub
</script>
A JavaScript-függvény meglévő VBScript-kóddal való együttes használata lehetővé teszi, hogy típuseltérési hiba nélkül állítsa be a returnValue tulajdonság értékét.
// NINCS TÍPUSELTÉRÉSI HIBA
<script Language=JavaScript>
function visszateresiErtekBeall(){
var visszateresiErtekTomb = new Array();
visszateresiErtekTomb[0] = 1;
visszateresiErtekTomb[1] = 2;
visszateresiErtekTomb[2] = 3;
window.returnValue = visszateresiErtekTomb;
}
</script>

<script LANGUAGE=vbscript??
Option Explicit

Sub Window_OnLoad
visszateresiErtekBeall()
msgbox window.returnValue
End Sub
</script>

Állapot

A Microsoft megerősítette, hogy a cikkben tárgyalt jelenség az érintett termékek hibájára vezethető vissza.
Tulajdonságok

Cikkazonosító: 976949 - Utolsó ellenőrzés: 2010. jan. 26. - Verziószám: 1

Visszajelzés