gpt4 book ai didi

delphi - 使用 TEmbeddedWB 或 TWebBrowser 检测外部内容

转载 作者:行者123 更新时间:2023-12-03 15:33:15 28 4
gpt4 key购买 nike

我试图阻止由 TEmbeddedWB 或 TWebBrowser(或 TCppWebBrowser)加载的任何外部内容。我想阻止从互联网加载的任何内容,包括图像、javascript、外部 CSS、外部 [embed] 或 [object] 或 [applet] 或 [frame] 或 [iframe]、执行可以加载外部内容的 JavaScript 等。

这个问题由两部分组成:

  • 将网络浏览器设置为“限制所有”(不含图像的基本 HTML 除外)并检测此类内容是否存在
  • 如果外部内容不存在,则可以,如果存在,则显示一个“下载栏”,单击该栏后,网络浏览器将进入“全部下载”模式并获取所有内容。

第一项有问题。在 TEmbeddedWB 中,您可以使用 DownloadOptions 开关阻止几乎所有内容,最重要的是 ForceOffline 开关,但即使所有这些都关闭,它仍然会传递一些内容,例如 [object][iframe]标签。我知道是这种情况,因为我实现了 OnBeforeNavigate2 事件,它会触发这些标签中包含的 URL,并且还会在本地服务器的日志中创建一个条目。在 TEmbeddedWB 中设置 OfflineModeForceOfflineMode 对这些项目没有帮助。

那么我怎样才能真正阻止所有呢?因此,它需要从基本 HTML 开始,并阻止外部元素(包括脚本和 CSS)。有没有办法在每次想要下载任何内容时触发一个事件,以便可以阻止它或通过阻止所有外部下载来避免首先触发此类事件?我是否需要调整 Internet Explorer 区域和安全性?任何指向正确方向的指针都会有所帮助。

第二项也很棘手,因为我需要检测是否存在有问题的标签(例如“applet”、“script”、“link”等。此检测不需要完美,但至少必须是好的足以覆盖大部分此类标签。我是这样做的:

//----------------------------------------------------------------------
// Check for external content (images, scripts, ActiveX, frames...)
//----------------------------------------------------------------------
try
{
bool HasExternalContent = false;
DelphiInterface<IHTMLDocument2> diDoc; // Smart pointer wrapper - should automatically call release() and do reference counting
diDoc = TEmbeddedWB->Document;

DelphiInterface<IHTMLElementCollection> diColApplets; DelphiInterface<IDispatch> diDispApplets; DelphiInterface<IHTMLObjectElement> diObj;
DelphiInterface<IHTMLElementCollection> diColEmbeds; DelphiInterface<IDispatch> diDispEmbeds;
DelphiInterface<IHTMLFramesCollection2> diColFrames; DelphiInterface<IDispatch> diDispFrames;
DelphiInterface<IHTMLElementCollection> diColImages; DelphiInterface<IDispatch> diDispImages; DelphiInterface<IHTMLImgElement> diImg;
DelphiInterface<IHTMLElementCollection> diColLinks; DelphiInterface<IDispatch> diDispLinks;
DelphiInterface<IHTMLElementCollection> diColPlugins; DelphiInterface<IDispatch> diDispPlugins;
DelphiInterface<IHTMLElementCollection> diColScripts; DelphiInterface<IDispatch> diDispScripts;
DelphiInterface<IHTMLStyleSheetsCollection> diColStyleSheets; DelphiInterface<IDispatch> diDispStyleSheets;

OleCheck(diDoc->Get_applets (diColApplets));
OleCheck(diDoc->Get_embeds (diColEmbeds));
OleCheck(diDoc->Get_frames (diColFrames));
OleCheck(diDoc->Get_images (diColImages));
OleCheck(diDoc->Get_links (diColLinks));
OleCheck(diDoc->Get_plugins (diColPlugins));
OleCheck(diDoc->Get_scripts (diColScripts));
OleCheck(diDoc->Get_styleSheets (diColStyleSheets));

// Scan for applets external links
for (int i = 0; i < diColApplets->length; i++)
{
OleCheck(diColApplets->item(i,i,diDispApplets));
if (diDispApplets != NULL)
{
diDispApplets->QueryInterface(IID_IHTMLObjectElement, (void**)&diObj);
if (diObj != NULL)
{
UnicodeString s1 = Sysutils::Trim(diObj->data),
s2 = Sysutils::Trim(diObj->codeBase),
s3 = Sysutils::Trim(diObj->classid);

if (StartsText("http", s1) || StartsText("http", s2) || StartsText("http", s3))
{
HasExternalContent = true;
break; // At least 1 found, bar will be shown, no further search needed
}
}
}
}

// Scan for images external links
for (int i = 0; i < diColImages->length; i++)
{
OleCheck(diColImages->item(i,i,diDispImages));
if (diDispImages != NULL) // Unnecessary? OleCheck throws exception if this applies?
{
diDispImages->QueryInterface(IID_IHTMLImgElement, (void**)&diImg);
if (diImg != NULL)
{
UnicodeString s1 = Sysutils::Trim(diImg->src);

// Case insensitive check
if (StartsText("http", s1))
{
HasExternalContent = true;
break; // At least 1 found, bar will be shown, no further search needed
}
}
}
}
}
catch (Exception &e)
{
// triggered by OleCheck
ShowMessage(e.Message);
}

是否有更简单的方法来扫描此问题,或者唯一的方法是使用其他接口(interface)函数(例如 Get_appletsGet_embedsGet_stylesheets 运行多个循环) code> 等类似于上面的代码?到目前为止,我发现我必须调用以下函数来涵盖所有这些:

    OleCheck(diDoc->Get_applets     (diColApplets));
OleCheck(diDoc->Get_embeds (diColEmbeds));
OleCheck(diDoc->Get_frames (diColFrames));
OleCheck(diDoc->Get_images (diColImages));
OleCheck(diDoc->Get_links (diColLinks));
OleCheck(diDoc->Get_plugins (diColPlugins));
OleCheck(diDoc->Get_scripts (diColScripts));
OleCheck(diDoc->Get_styleSheets (diColStyleSheets));

但是如果可以更轻松地处理的话,我宁愿不实现那么多循环。可以吗?

最佳答案

我建议你这个解决方案:

#include "html.h"
THTMLDocument doc;
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, LPDISPATCH pDisp,
Variant *URL)
{
doc.documentFromVariant(CppWebBrowser1->Document);

bool HasExternalContent = false;
for (int i=0; i<doc.images.length; i++) {
if(doc.images[i].src.SubString(1, 4) == "http")
{
HasExternalContent = true;
break;
}
}
for (int i=0; i<doc.applets.length; i++) {
THTMLObjectElement obj = doc.applets[i];
if(obj.data.SubString(1, 4) == "http")
HasExternalContent = true;
if(obj.codeBase.SubString(1, 4) == "http")
HasExternalContent = true;
if(obj.classid.SubString(1, 4) == "http")
HasExternalContent = true;
}
}

这个很棒的包装类可以从here下载。 .

关于delphi - 使用 TEmbeddedWB 或 TWebBrowser 检测外部内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10637550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com