为什么我的Google Chrome扩展程序无法在这个特定页面上运行?

时间:2014-03-30 06:02:11

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

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

  • 用户点击浏览器操作,然后点击弹出窗口中的小菜单中的“分享”。然后,弹出页面使用chrome.runtime.sendMessage()向活动页面发送消息。
  • 事件页面处理传入的消息流并采取适当的行动,调用使用chrome.tabs.query()获取当前选项卡的函数。然后,它将此信息传递给一个函数,该函数查询简单的Web SQL数据库以获得URL的完全匹配,以查看用户之前是否已共享它。如果他们有,如果在继续之前给他们一个基本的confirm()对话框。如果没有,则在继续之前将链接添加到数据库中。我已经在下面列出了此部分的代码。
  • 该扩展程序处理该网址并生成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);
            });
        };
    });
});
};

1 个答案:

答案 0 :(得分:4)

嘿,好问题,根据你所说的内容,这是一个猜测,但我想我可以告诉你为什么它是一页(我知道这是因为我'在之前的打击类似于以前)。

您的插入查询:

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查询输入的任何内容。实际上从不信任任何输入,无论如何都要在校长上验证/清理它。

第二课,一个我未能多次学习,如果有什么东西可以返回错误 - 抓住它并用它做点什么。

希望有所帮助。