如何禁用所有webkit浏览器插件?

时间:2015-01-18 10:53:02

标签: python webview webkit

我正在使用Ubuntu 14.04。

我安装了Pipelight - 这个NPAPI浏览器插件允许我查看Silverlight& Firefox中新的基于Flash的东西。

然而,这有一个不幸的副作用 - 支持NPAPI插件的所有Web浏览器(如WebKit)也会加载此插件。

以编程方式,我想在创建WebKit.WebView时禁用所有浏览器插件 - 因此我的问题。我该怎么做?


调查:

我已经看过使用WebKit2 - 这确实可行,因为WebKit2没有NPAPI支持。但是我不能使用这种方法,因为默认情况下Rhythmbox有另一个本机插件,即WebKit,即我正在创建另一个Rhythmbox插件。当我尝试同时加载WebKit.WebView和WebKit2.WebView时,进程挂起。

我已经查看了使用WebKit.WebSettings及其enable-plugins属性,但看起来您在创建WebView之前无法应用新的WebSettings实例(因此已经加载了管道光浏览器插件)。

再次 - 我尝试通过构造函数分配新的WebSettings实例,但没有快乐:x = WebKit.WebView(settings=webkit_settings)

安装了管道灯后,像这样的简单测试程序(web.py)会显示问题:

from gi.repository import WebKit

webkit_settings = WebKit.WebSettings.new()
webkit_settings.props.enable_plugins=False
x = WebKit.WebView.new()
x.set_settings(webkit_settings)

然后运行python web.py会显示

的示例输出
[PIPELIGHT:LIN:unknown] attached to process.
[PIPELIGHT:LIN:unknown] checking environment variable PIPELIGHT_SILVERLIGHT5_0_CONFIG.
[PIPELIGHT:LIN:unknown] searching for config file pipelight-silverlight5.0.
[PIPELIGHT:LIN:unknown] trying to load config file from '/home/foss/.config/pipelight-silverlight5.0'.
[PIPELIGHT:LIN:unknown] unrecognized configuration key 'diagnosticmode'.
[PIPELIGHT:LIN:unknown] sandbox not found or not installed!
[PIPELIGHT:LIN:silverlight5.0] using wine prefix directory /home/foss/.wine-pipelight.

我已经向Pipelight开发人员提出了这个question,他们表示我需要通过WebKit引擎禁用插件。正如你所看到的 - 我认为WebKit2是我的解决方案,但我不能如上所述使用它。

我已经看过这个stackoverflow question但是我在禁用特定插件后并不是真的 - 至少我不这么认为 - 只是想禁用所有外部插件

我是用Python3编写的,但是我不认为python版本是问题所在,因为我使用python和python3解释器运行测试程序,并且可以看到相同的结果。

1 个答案:

答案 0 :(得分:0)

我通过编写自己的access()函数来攻击它 调用strstr(pathname," / plugins /");如果返回非null function将errno设置为ENOENT并返回-1。

否则我的access()调用原始access()(系统调用包装器) 来自c库。

在c程序中,可以为其他程序实现这样的功能 可以使用单独的c模块和LD_PRELOAD ......

像这样:

static void * dlsym_next(const char * symbol)
{
    void * sym = dlsym(RTLD_NEXT, symbol);
    char * str = dlerror();

    if (str != null)
        exit(1);

    return sym;
}
#define set_next(name) *(void**)(&name##_next) = dlsym_next(#name)

int access(const char * pathname, int mode)
{
    static int (*access_next)(const char *, int) = NULL;
    if (! access_next)
        set_next(access);

    if (strstr(pathname, "/plugins/") != NULL) {
        errno = ENOENT;
        return -1;
    }
    return access_next(pathname, mode);
}