Help and Support

Artikel ID: 318426 - Laatste beoordeling: maandag 19 december 2005 - Wijziging: 4.0

Correctie: beveiligingspatch (Q316059) laat Internet Explorer vastlopen wanneer u execScript aanroept

Dit artikel is eerder gepubliceerd onder NL318426

Op deze pagina

Alles uitklappen | Alles samenvouwen

Symptomen

Wanneer u execScript aanroept vanuit een frame binnen een bovenliggend frame, loopt Internet Explorer vast. Dit probleem treedt op nadat u de cumulatieve patch voor Internet Explorer van 11 februari 2002 hebt toegepast. Deze patch is beschikbaar in het volgende Microsoft Knowledge Base-artikel:
316059  (http://support.microsoft.com/kb/316059/ ) MS02-005: February 11, 2002, Cumulative Patch for Internet Explorer

Oplossing

Dit probleem doet zich niet langer voor bij de cumulatieve patch voor Internet Explorer van 28 maart 2002. Als u meer informatie over het verkrijgen van deze patch wilt, klikt u op het volgende artikelnummer in de Microsoft Knowledge Base:
319182  (http://support.microsoft.com/kb/319182/ ) MS02-015: March 28, 2002, Cumulative Patch for Internet Explorer

OMZEILING

Om dit probleem met de cumulatieve patch voor Internet Explorer van 11 februari 2002 te omzeilen, past u een van de volgende methoden toe.

OPMERKING: bij de volgende procedures worden de HTML-bestanden uit de sectie 'Meer informatie' gebruikt.

Het script wijzigen zodat de functie rechtstreeks wordt aangeroepen

Vervang de code
window.parent.execScript('test()');
in het script door:
window.parent.test();

De Visual C++-code wijzigen zodat de functie rechtstreeks wordt aangeroepen

Vervang de code in Microsoft Visual C++ voor het aanroepen van execScript (die in CallExecScript is geļmplementeerd) door de code voor het rechtstreeks aanroepen van de scriptmethode (die in CallDirect is geļmplementeerd):
window.parent.test();void CCplusworkaroundCtrl::OnLButtonDown(UINT nFlags, CPoint point) 
{
	HRESULT hr = S_OK;

	IServiceProvider* pServiceProvider = NULL;
	hr = m_pClientSite->QueryInterface(IID_IServiceProvider, (void**)&pServiceProvider);
	ASSERT(SUCCEEDED(hr) && pServiceProvider);

	IWebBrowser2* pWebBrowser2 = NULL;
	hr = pServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void**)&pWebBrowser2);
	ASSERT(SUCCEEDED(hr) && pWebBrowser2);

	IDispatch* pDocDisp = NULL;
	hr = pWebBrowser2->get_Document(&pDocDisp);
	ASSERT(SUCCEEDED(hr) && pDocDisp);

	IHTMLDocument2* pDocument2 = NULL;
	hr = pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument2);
	ASSERT(SUCCEEDED(hr) && pDocument2);

	IHTMLWindow2* pWindow2 = NULL;
	hr = pDocument2->get_parentWindow(&pWindow2);
	ASSERT(SUCCEEDED(hr) && pWindow2);

	IHTMLWindow2* pWindowTop = NULL;
	hr = pWindow2->get_top(&pWindowTop);
	ASSERT(SUCCEEDED(hr) && pWindowTop);

	CallDirect(pWindowTop);
	CallExecScript(pWindowTop);

	pWindowTop->Release();
	pWindow2->Release();
	pDocument2->Release();
	pDocDisp->Release();
	pWebBrowser2->Release();
	pServiceProvider->Release();
}

void CCplusworkaroundCtrl::CallExecScript(IHTMLWindow2* pWindow2)
{
	ASSERT(pWindow2);
	HRESULT hr = S_OK;

	BSTR bstrCode = ::SysAllocString(L"test()");
	BSTR bstrLanguage = ::SysAllocString(L"vbscript");

	COleVariant ret;
	hr = pWindow2->execScript(bstrCode, bstrLanguage, &ret);
	
	::SysFreeString(bstrLanguage);
	::SysFreeString(bstrCode);
}

void CCplusworkaroundCtrl::CallDirect(IHTMLWindow2* pWindow2)
{
	DISPID dispidScriptObject, dispidMethodToInvoke;
	IDispatch *pDispScriptObject;
	DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0};
	HRESULT hr;
	OLECHAR *szScript = L"script";
	OLECHAR *szFuncName = L"test";
	
	IHTMLDocument2* pDocument2 = NULL;
	hr = pWindow2->get_document(&pDocument2);
	ASSERT(SUCCEEDED(hr) && pDocument2);

	IDispatch* pDocDisp = NULL;
	hr = pDocument2->QueryInterface(IID_IDispatch, (void**)&pDocDisp);
	ASSERT(SUCCEEDED(hr) && pDocDisp);

	// Get the DISPID of the document's Script property.
	hr = pDocDisp->GetIDsOfNames(IID_NULL, &szScript,
		1, LOCALE_USER_DEFAULT, &dispidScriptObject);
	ASSERT(SUCCEEDED(hr));

	COleVariant varResult;
	
	// Get the document's Script property.
	hr = pDocDisp->Invoke(dispidScriptObject,
		IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET,
		&dispparamsNoArgs, &varResult, NULL, NULL);
	ASSERT(SUCCEEDED(hr) && varResult.pdispVal);

	pDispScriptObject = varResult.pdispVal;

	varResult.Clear();	
	// Get the DISPID of the script method to invoke.
	hr = pDispScriptObject->GetIDsOfNames(IID_NULL, &szFuncName, 1, 
		LOCALE_USER_DEFAULT, &dispidMethodToInvoke);
	ASSERT(SUCCEEDED(hr));

	// Invoke the script method.
	hr = pDispScriptObject->Invoke(dispidMethodToInvoke, IID_NULL,
		LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, 
		&varResult, NULL, NULL);
	ASSERT(SUCCEEDED(hr));

	pDocDisp->Release();
	pDocument2->Release();
}

De cumulatieve patch voor Internet Explorer van 11 februari 2002 verwijderen

Als laatste redmiddel kunt u de eerdere versie van Internet Explorer herstellen, zodat u weer over de versie beschikt die u gebruikte voordat u de beveiligingspatch installeerde.

BELANGRIJK: als u het probleem op deze wijze p[;pdy, kunnen de beveiligingsproblemen waarvoor Q316059 een oplossing biedt opnieuw optreden. Installeer in ieder geval de vorige beveiligingspatch, die in het volgende Microsoft Knowledge Base-artikel wordt aangeboden:
313675  (http://support.microsoft.com/kb/313675/ ) MS01-058: File Vulnerability Patch for Internet Explorer 5.5 and Internet Explorer 6
Gebruik deze omzeilingsmethode alleen als dit absoluut noodzakelijk is. Deze methode biedt slechts een tijdelijke oplossing voor het probleem. Werk Internet Explorer bij zodra de volgende beveiligingspatch beschikbaar wordt.
  1. Dubbelklik in het Configuratiescherm op Software.
  2. Klik onder Geļnstalleerde programma's op Microsoft Internet Explorer.
  3. Klik in het linkerdeelvenster op Wijzigen/verwijderen.
  4. Klik op De vorige Windows-configuratie herstellen en klik op OK.
  5. Nadat u de vorige versie van Internet Explorer hebt hersteld, start u de computer opnieuw op.
  6. Ga naar de volgende Microsoft-website om de gewenste versie van Internet Explorer te downloaden en te installeren:
    http://www.microsoft.com/windows/ie_intl/nl/ (http://www.microsoft.com/windows/ie_intl/nl/)
Als u niet over een hersteloptie voor Internet Explorer beschikt (bijvoorbeeld als u Microsoft Windows XP gebruikt), moet u de bestanden Mshtml.dll en Mshtml.tlb handmatig vervangen door de oudere versies van deze bestanden. De oudere versies van deze bestanden staan in Q313675 in de Veilige modus. Hoewel u de oorspronkelijke Mshtml-bestanden op de Microsoft Windows XP-cd wel kunt gebruiken, bieden deze niet hetzelfde beveiligingsniveau.

Als u meer informatie over het verwijderen van Internet Explorer wilt, klikt u op de volgende artikelnummers in de Microsoft Knowledge Base:
293907  (http://support.microsoft.com/kb/293907/NL/ ) Internet Explorer 6 verwijderen

Status

Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden genoemd in de sectie "De informatie in dit artikel is van toepassing op:" worden vermeld.

Meer informatie

Stappen om het gedrag te reproduceren

  1. Maak in Kladblok een nieuw bestand met de naam Parent.html en plak hier vervolgens de volgende code in:
    <html>
    <title>Internet Explorer loopt vast wanneer u execScript vanuit een frame binnen een bovenliggend frame aanroept</title>
     <head>
     <script>
     function test() {  alert("test"); } </script>
     </head>
     <body>
     <iframe src="child.html"></iframe>
     </body>
    </html>
  2. Sla Parent.html op de webserver op.
  3. Maak een nieuw bestand met de naam Child.html en plak hier de volgende code in:
    <html>
     <head>
     <script>
    			function Test() 			{ 				window.parent.execScript('test()'); //Voeg een opmerking aan de bovenstaande regel toe en verwijder de opmerkingen van de volgende regel om het probleem te omzeilen 				//window.parent.test(); 			} </script>
     </head>
     <body>
    Klik op deze knop om een script binnen het bovenliggende frame uit te voeren<br></br>
    <button onclick=Test()>Klik op</button>
     </body>
    </html>
  4. Sla Child.html op de webserver op.
  5. Navigeer naar de pagina Parent.html en klik vervolgens op de knop waarmee het script wordt uitgevoerd.

De informatie in dit artikel is van toepassing op:
    Trefwoorden: 
    kbbug kbfix KB318426
    Retired KB ArticleVrijwaring inhoud KB-artikelen over niet langer ondersteunde producten
    Dit artikel heeft betrekking op producten waarvoor Microsoft geen ondersteuning meer biedt. Daarom wordt dit artikel alleen in de huidige vorm aangeboden en wordt het niet meer bijgewerkt.

    Vertaalde artikelen