我一直致力于谷歌浏览器的扩展,允许用户使用简单的浏览器操作图标将页面分享到Facebook。它提供了一些额外的功能,例如允许用户搜索过去的链接等。在我今天尝试将one particular page(http://imgur.com/gallery/N0s079c
)分享到我个人的Facebook帐户之前,它几乎完美无缺。出于多种原因,这对我非常关注,因为它可能意味着在其他页面上可能会发生类似的问题,并且我想在用户遇到它之前修补扩展。这是我的扩展分享链接的一个(有点简短的)纲要:
chrome.runtime.sendMessage()
向活动页面发送消息。chrome.tabs.query()
获取当前选项卡的函数。然后,它将此信息传递给一个函数,该函数查询简单的Web SQL数据库以获得URL的完全匹配,以查看用户之前是否已共享它。如果他们有,如果在继续之前给他们一个基本的confirm()
对话框。如果没有,则在继续之前将链接添加到数据库中。我已经在下面列出了此部分的代码。但是,当我尝试共享上述链接时,扩展程序不会执行任何。控制台中没有事件或弹出页面的错误。我不知道可能导致它失败的原因。我唯一能想到的是它是由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);
});
};
});
});
};
答案 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查询输入的任何内容。实际上从不信任任何输入,无论如何都要在校长上验证/清理它。
第二课,一个我未能多次学习,如果有什么东西可以返回错误 - 抓住它并用它做点什么。
希望有所帮助。