【问题标题】:Prevent users from tampering with the view's increment code防止用户篡改视图的增量代码
【发布时间】:2015-07-15 12:05:08
【问题描述】:

我有一个在用户单击图像时调用的函数。我正在计算这些点击并增加数据库中服务器上的视图。该函数调用一个网络服务来更新数据库中的视图列。

我希望能够在用户与该图像交互并单击它后预测何时以合法方式调用该函数。我知道在客户端模仿点击行为很容易并且无法阻止。我也不想在服务器上跟踪每个 IP 和图像 ID。

有没有什么好的方法可以防止用户篡改该视图增量代码?我没有用户登录选项,用户对网站都是匿名的。

代码示例:

$(document).on("click", ".the-image", function(event){
    var imageId = parseInt($(this).attr("image-id"), 10);
    // webservice to increment the views of the image +1
    $.ajax({
       url: CONST_WEBSERVICE_URL,
       dataType: "json",
       contentType: "application/json; charset=utf-8",
       method: "POST",
       data: "{'imageId': " + imageId + "}"
   });
});

我使用 ASP.NET 4.5 / C# / jQuery 构建了我的网站。

【问题讨论】:

  • 我们怎么可能知道您什至没有提供一行代码让我们知道您在做什么以及正在发送什么。你在使用 CSRF 保护吗?当前触发ajax的是什么?问题太广泛了
  • @charlietfl 我用代码更新了问题
  • 肯定想要使用 csrf 保护,我可以复制该请求并每秒从另一台服务器发送它
  • @charlietfl 哈哈,你吓到我了,但确实如此。我在看什么是 csrf 保护
  • 不是我个人会做的事...只是想那些想要篡改您网站的人的方式

标签: javascript c# jquery asp.net .net


【解决方案1】:

在这里尝试开箱即用。您可以存储图像在会话中被点击的次数,并在您的服务中访问会话状态。然后您就知道他们是否已经查看过该图像。

[WebMethod (EnableSession=true)]

也许你可以对插入数据库的行数设置一个限制。

【讨论】:

  • 我想过,但这意味着为访问该站点的每个用户存储每个 ID 的数据。这可能是解决这个问题的唯一真正方法,但我渴望我的应用程序能够利用最低的资源。我投票给这个,但等待更多答案。
  • 我考虑将它存储在一个 List 的会话变量中,并检查该值是否已经存在。这就是你的意思吗?
  • 不,在我的脑海中,我想:Session["ImageID"] = Session["ImageID"] += 1; 您必须将会话变量处理为第一次单击时为 0
  • 它使用的资源是否比 List 少?
  • 我会选择Dictionary<int, int> 第一个是imageID,后者是它被点击的次数。
【解决方案2】:

您可以使用 JavaScript 设置 cookie,或使用 JavaScript 中的本地存储。不幸的是,这很容易被打败(只需擦除 cookie 或存储元素)。

将响应绑定到 IP 地址(您不想这样做)也不是防篡改的。可以只使用代理服务器。即使您可以获得某种绝对唯一的每台机器标识符,也可以通过启动一堆虚拟机或容器来解决这个问题。

在你的场景中,你最大的希望就是能够击败随便试图玩弄你系统的人。

【讨论】:

  • 嗨罗伯特,我想过这个,但这很容易解决。
【解决方案3】:

如何跟踪点击图片的用户?您可以检测它是否是爬虫,如果是,则不要增加计数。

您可以获取爬虫 IP 地址列表,也可以使用用户代理来跟踪它们。在这里,您可以获得标记为机器人的用户代理列表:http://www.user-agents.org/,在这里您可以看到机器人使用的 IP 地址列表:http://www.jafsoft.com/searchengines/webbots.html

【讨论】:

  • 当我与模仿真实用途的人打交道时,根据我的理解,我无法通过检查用户代理来识别攻击。
  • 如果它是一个机器人,你可以抓住它。如果是一个人,你将无法抓住它,因为他不是机器人。但问题是,一个人会模仿点击吗?他为什么不直接点击图片而不是模仿它呢?使用 IP 地址、用户代理和时间可以帮助您检测是否是同一个人点击过,您可以将其与 cookie/localStorage 结合使用。没有完美的解决方案,你需要结合不同的方法。
  • 我同意不同的方法是要走的路。现在我检查了触发器是否未定义,如果已定义,则它不是机器人。其次,我把 Jack 的想法也实现在 Session 上,但是寻找其他人有什么要说的。也许有人想出了另一种好方法。
  • “触发器未定义”是什么意思?还要考虑可以通过编程方式清除会话。
  • 你可以在开发者工具中编辑JS代码直接调用,这就是我要告诉你的。你不能相信你的 JS 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 2011-06-13
  • 2011-10-06
  • 2019-06-16
相关资源
最近更新 更多