【问题标题】:Why won't my extension for Google Chrome work on this one specific page?为什么我的 Google Chrome 扩展程序无法在这一特定页面上运行?
【发布时间】:2014-03-30 06:02:10
【问题描述】:

我一直在为 Google Chrome 开发一个扩展程序,它允许用户使用简单的浏览器操作图标将页面共享到 Facebook。它提供了一些额外的功能,例如允许用户搜索过去的链接等。它几乎完美无缺,直到我今天尝试将one particular page (http://imgur.com/gallery/N0s079c) 分享到我的个人 Facebook 帐户。出于多种原因,这对我来说非常令人担忧,因为这可能意味着在其他页面上可能会发生类似的问题,我想在我的用户遇到扩展之前修补它。以下是我的扩展程序如何共享链接的(有点简短)概要:

  • 用户单击浏览器操作并从弹出窗口的小菜单中单击“共享”。然后弹出页面使用chrome.runtime.sendMessage() 向活动页面发送消息。
  • 事件页面处理传入的消息流并采取适当的行动,调用使用chrome.tabs.query() 的函数来获取当前选项卡。然后,它将这些信息传递给一个函数,该函数查询一个简单的 Web SQL 数据库以获取 URL 的精确匹配,以查看用户之前是否共享过它。如果他们有,如果在继续之前给他们一个基本的confirm() 对话框。如果没有,则在继续之前将链接添加到数据库中。我在下面包含了本节的代码。
  • 扩展程序处理 URL 并生成 Facebook Feed dialog
  • Facebook Feed 对话框将用户重定向到服务器页面,该页面将用户带回到他们共享的链接或新的 Facebook 帖子,具体取决于他们的设置。

但是,当我尝试分享上面提到的链接时,扩展程序并没有做任何事情。控制台中的事件或弹出页面都没有错误。我不知道可能导致它失败的原因。我唯一能想到的是它是由 Web SQL 查询中的一些极端情况错误引起的。按照当前的设置方式,查询中的错误会导致代码简单地停止执行。这是一个基本的SELECT column FROM table WHERE expression 查询,用于查找完全匹配,所以我觉得不需要编写任何错误处理。

我在 Imgur 上测试了其他几个链接,看看这是否可能是该网站特有的问题,但情况似乎并非如此。

检查共享链接历史/添加到历史的代码

simpleshare.shareLink.checkHistory = function(result) {
simpleshare.backend.database.transaction(function (tx) {
    tx.executeSql('SELECT url FROM history WHERE url=\'' + result[0].url + '\'', [], function(tx, results) {
        if(results.rows.length != 0) {
            reshare = confirm('It appears that you\'ve already shared (or started to share) this link in the past.');
            if (reshare == true) {
                simpleshare.shareLink.share(result);
            };
        };
        if(results.rows.length == 0) {
            var today = new Date();
            var month = today.getMonth();
            var day = today.getDate();
            var year = today.getFullYear();

            if (month == 0) {
                var monthAsWord = 'January';
            };
            if (month == 1) {
                var monthAsWord = 'February';
            };
            if (month == 2) {
                var monthAsWord = 'March';
            };
            if (month == 3) {
                var monthAsWord = 'April';
            };
            if (month == 4) {
                var monthAsWord = 'May';
            };
            if (month == 5) {
                var monthAsWord = 'June';
            };
            if (month == 6) {
                var monthAsWord = 'July';
            };
            if (month == 7) {
                var monthAsWord = 'August';
            };
            if (month == 8) {
                var monthAsWord = 'September';
            };
            if (month == 9) {
                var monthAsWord = 'October';
            };
            if (month == 10) {
                var monthAsWord = 'November';
            };
            if (month == 11) {
                var monthAsWord = 'December';
            };

            var fullDate = monthAsWord + ' ' + day + ', ' + year;

            tx.executeSql('INSERT INTO history VALUES (\'' + fullDate + '\', \'' + result[0].title + '\', \'' + result[0].url + '\')', [], function(tx, results) {
                simpleshare.shareLink.share(result);
            });
        };
    });
});
};

【问题讨论】:

  • 不相关,但能否请您使用数组来获取月份名称?
  • 仔细检查一下,您只是对这个 imgur URL 有问题(即imgur.com/gallery/N0s079c)?其他 imgur URL 可以与您的扩展程序一起使用吗?
  • @Fresh 是的,出于某种奇怪的原因,它只是那个特定的 imgur URL。我尝试过的所有其他 imgur URL 都可以正常工作。

标签: javascript google-chrome google-chrome-extension web-sql


【解决方案1】:

嘿,好问题,根据您所说的内容,这是一个猜测,但我想我可以告诉您为什么是那一页(我知道这一点,因为我过去曾遇到过类似的问题) .

您的插入查询:

INSERT INTO history VALUES (\'' + fullDate + '\', \'' + result[0].title + '\', \'' + result[0].url + '\')

正在解决(针对该页面):

INSERT INTO history VALUES ('April 5, 2014', 'It's a graduated cylinder', 'http://imgur.com/gallery/N0s079c'); 

这是无效的,您可以在语法突出显示中看到问题——It's,特别是那里的单引号,提前结束了该字符串并使其余的查询变得无意义。

所以,是的,这将发生在其他页面上,实际上攻击者可以猜测发生了什么并尝试使用巧妙设计的页面标题来破坏数据库。

这里的教训是清理您用作 SQL 查询输入的任何内容。实际上从不信任任何输入并在主体上验证/清理它。

第二课,也是我很多次都没有学过的课,如果有什么东西可以返回错误——抓住它并用它做点什么。

希望对您有所帮助。

【讨论】:

  • 这很有意义!事后看来,我不知道我是怎么错过的!仍在学习质量代码编写的这些细微差别。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多