【问题标题】:high-order function causes unsafe eval in chrome extension高阶函数导致 chrome 扩展中的不安全 eval
【发布时间】:2016-03-04 04:45:20
【问题描述】:

我正在制作一个非常简单的 chrome 扩展程序来随机更改我的 chromebook 上的壁纸。但是我在加载 Javascript 控制台后遇到了一个奇怪的错误:

拒绝将字符串评估为 JavaScript,因为“unsafe-eval”不是以下内容安全策略指令中允许的脚本来源:“script-src 'self' blob: filesystem: chrome-extension-resource:”。 @background.js:27

这是我的 manifest.json:

{
  "manifest_version": 2,

  "name": "Abyss Wallpapers for Chrome OS",
  "description": "Sets the Chrome OS wallpaper to a random wallpaper from the
                      Wallpaper Abyss (wall.alphacoders.com), once a minute",
  "version": "1.0",
  "background":
  {
    "scripts":["background.js"]
  },
  "permissions": [
    "wallpaper",
    "https://wall.alphacoders.com/api2.0/",
    "background"
  ]
}

这是我的 background.js:

var baseUrl = "https://wall.alphacoders.com/api2.0/get.php?"
var apiKey = "c160c64ef4c79e61e325ddf944183dfe"
var params = "auth=" + apiKey + "&method=random"
var interval = 30000;
var xhr = new XMLHttpRequest();
xhr.open("GET", baseUrl + params, true);
xhr.onreadystatechange = function()
{
  if (xhr.readyState == 4 && xhr.status == 200)
  {
    var data = xhr.responseText;
    if (data.success)
    {
      chrome.wallpaper.setWallpaper
      (
        {url:data.wallpapers[1].url_image,
        layout:"CENTER_CROPPED",
        filename:data.wallpapers[1].id + "." + data.wallpapers[1].file_type},
        function(thumbnail)
        {
          thumbnail = null;
        }
      )
    }
  }
}
setInterval(xhr.send(), interval);

它似乎正在拒绝setInterval() 方法,但那里没有 eval 甚至没有字符串。

编辑:所以我更改了setInterval() 语句以反映Bergi 的答案,现在后台脚本运行了大约一分钟,这意味着设置了时间间隔,但之后我又遇到了另一个错误:

未捕获的 InvalidStateError:无法在“XMLHttpRequest”上执行“发送”:对象的状态必须是 OPENED。(匿名函数)@background.js:27

为什么我在第 5 行专门调用xhr.open() 时对象不打开?

【问题讨论】:

  • 我不认为setInterval 是一个高阶函数。
  • 是的,我一开始以为 Chrome 会在 onreadystatechange() 中进行回调,但事实并非如此。

标签: javascript google-chrome-extension eval


【解决方案1】:

setInterval,当被传递一个非函数值时,接受代码字符串的第一个参数和evals。你传递的是xhr.send()的返回值,这确实不是一个函数。

解决这个问题

setInterval(function() { xhr.send(); }, interval);

或

setInterval(xhr.send.bind(xhr), interval);

我猜这也是你真正打算做的。

【讨论】:

【解决方案2】:

创建后您只能.send() 一次,并且.open() 一个 XHR。

如果需要在区间内执行此操作,则每次都需要重新创建 XHR。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多