我的MVC网站上有一个页面,其中有多个项目,用户可以点击这些项目添加到他们的购物篮中。
点击“添加”后,我执行$ .ajax()命令来调用后端并执行计算,返回结果并更新页面上的价格。
最近发现,快速连续点击许多“添加”按钮意味着用户依次等待每个呼叫进行处理。也就是说,他们点击10'添加'按钮,他们看到价格变化10次。
我不关心用户界面。我 关注的是webservice调用可以被垃圾邮件,这反过来可能会给数据库服务器带来压力,因为每个请求都需要数据库查找和其他计算。
我已经开始像这样设置一个“锁定”标志,以阻止Joe Public多次点击。
var flag=0;
function updateBasket() {
if (flag = 0) {
flag = 1; // Processing
var form = $("#ItemsForm");
$.ajax({
url: '@Url.Action("UpdateBasket")',
data: form.serialize(),
type: 'POST',
cache: false,
success: function (response) {
// code
},
error: function (jqXHR, textStatus, errorThrown) {
// code
}
});
flag = 0;
} else {
// Still processing previous request
alert('please wait');
}
HOWEVER 这一定可以通过进入控制台并执行
来规避flag=0;updateBasket();
我可以在后端做些什么来防止此来电被垃圾邮件?我关心的是我控制的代码,而不是网络基础架构级别。
更新:检查用户的凭据(用户名0是不可能的,因为他们可以在不登录的情况下执行此操作。 如果我在序列化的页面加载中为表单添加了一个唯一值,我可以检查后端是否反对我上次看到它,但所有攻击者都会做的是$('#uniqueValue')。val('newValue );否定这一点。
更新:提醒我控制MVC后端,即调用数据库服务器。这是我认为我可以阻止垃圾邮件调用数据库的地方,但我不知道如何。
答案 0 :(得分:0)
我会将所有JavaScript与最终用户隔离开来,做这样的事情。
(function () {
function updateBasket() {
...
}
})();
这样做意味着无法在控制台中调用updateBasket()
。
这称为自执行匿名函数。这里有一篇很棒的文章:http://markdalgleish.com/2011/03/self-executing-anonymous-functions/