13

我正在使用 Greasemonkey 并尝试在特定域中添加规则。但这会导致错误提示The operation is insecure
该代码在 Chrome 上运行良好。

脚本运行在http://mydomain.com/test/test.php
并且 CSS 文件是http://cdn.mydomain.com/test/css/global.css

我的功能:

function css(selector, property, value) {
    for (var i=0; i<document.styleSheets.length;i++) 
    {
        try 
        { 
            document.styleSheets[i].insertRule(selector+ ' {'+property+':'+value+'}', document.styleSheets[i].cssRules.length);
        } 
        catch(err) 
        { 
            try // IE
            { 
                document.styleSheets[i].addRule(selector, property+':'+value);
            } 
            catch(err) {}
        }
    }
}

在 Google 上,我发现这可能是因为我正在尝试访问跨域,所以我尝试将 CSS 文件的 URL 添加到“接受的 URL”,但没有结果。

我该如何解决?

4

3 回答 3

5

我发现这个解决方案可以解决这个问题:

var style = document.createElement("style");
document.head.appendChild(style);
style.sheet.insertRule("body { font-size:40px; }", 0);
于 2015-04-23T20:32:35.793 回答
4

是的,Firefox 会阻止对跨域样式表的访问。它可以(或至少曾经)抛出异常:

“访问受限 URI 被拒绝”代码:“1012”
nsresult:“0x805303f4 (NS_ERROR_DOM_BAD_URI)”
位置:......


但是,使用 CSS,您无需向特定样式表添加规则。只需覆盖您关心的样式。

例如,如果页面设置:

body {
    background: white;
}

你的脚本集:

body {
    background: red;
}    

然后页面将是红色的(名义上)。

有关更改目标页面样式的最简单、最智能的方法,请参阅以前的答案,例如这个

于 2013-03-05T20:41:09.607 回答
2

样式表中的规则以各种方式使用该样式表的权限运行。这意味着如果您可以将规则注入到跨站点样式表中,您就可以进行一些跨站点攻击。这就是 Firefox 阻止向跨站点样式表添加规则的原因。

Chrome 可能会使用链接文档的权限运行所有规则,这就是为什么它允许您向工作表添加内容....但是请注意,Chrome 不会让您阅读跨站点样式表。

请注意,如果您使用 CORS 加载样式表(通过在 上设置“crossorigin”属性<link>并确保您的 CDN 提供正确的标头),那么您将能够跨站点访问它。

于 2013-03-05T20:36:35.923 回答