【问题标题】:How to secure by Ajax calls from BOTs?如何保护来自 BOT 的 Ajax 调用?
【发布时间】:2013-12-17 01:01:52
【问题描述】:

我确定之前有人问过这个问题,但找不到所以我再问一次。

在我的站点中,我有一个 ajax 调用,可以保存用户的电子邮件和一些随机的站点特定属性。带有属性的请求 URL 如下所示。这是一个数据库写入请求并给出一个 JSON 响应。

http://mysite.com/my-ajax-write-to-db?email=abc@xyz.com&siteattribute=XYZABCDEF

现在我觉得的问题是,一旦这个代码生效,如果有人/机器人知道这个 URL,它可以直接在我的数据库中输入很多垃圾。我应该怎么做才能阻止它?有什么建议吗?我应该添加一些加密机制吗?

【问题讨论】:

  • 首先您可以使用 POST 方法而不是 GET。您还可以创建一个 robots.txt 文件来阻止 google 等机器人。
  • 是的,我可以做 POST,但不能解决我的问题。 robots.txt 只会阻止无论如何都无害的好机器人。考虑阻止某个故意编写机器人来执行此操作的人。 Robot.txt 无济于事。如果他们想遵循 robots.txt 而不是相反,这取决于机器人。

标签: java ajax


【解决方案1】:

您可以模拟 Spring 使用的样式(或使用 Spring) - 每次您的服务器加载页面时,它都会以 csrf 令牌的形式发出一个密码。您可以将此 csrf 令牌放入您的 ajax 请求并在服务器端对其进行验证。我是一名 Python 程序员,所以我对 Java 服务器不太熟悉,但this answer 包含一个可能工作代码的链接。

编辑 如果你不使用 Spring,DeveloperForce 列出了 2 个实现 CSRF 令牌的 Java 库。我自动假设 Spring,因为 Spring MVC 是 Java 中最流行的 MVC 之一。

作为一般经验法则,更改服务器端数据的页面通常应该是 POST 而不是 GET,因为如果有人为 URL 添加书签或查看浏览器历史日志,则会记录 GET 数据。

【讨论】:

  • 我没有在 Spring 上工作。我必须定制它。但我认为这是正确的方向。让我对此进行一些研究。
【解决方案2】:

AJAX 设置 “X-Requested-With=XMLHttpRequest” 标头,然后可以在服务器端使用它来检测调用是通过 ajax 调用还是来自机器人。

我不会说它会 100% 停止但会抵抗基本伤害。

到目前为止,我正在我的 MainFilter 类中检查这一点,以检测仅来自我的页面发出的 BOt 或 AJAX 调用的请求。

希望我们能得到一个确定的解决方案。

【讨论】:

  • 是的,这是一种方法,但正如你所说,这不是一种完全证明的方法。等待更安全的数据库写入是一项昂贵的操作,特别是在托管在云上时
  • 我可以编写一个 js 脚本,以与他的 JS 相同的方式发送他的 AJAX,并且这将是合法的。
【解决方案3】:

概括蛇和咖啡的答案:

您需要将初始 HTML 请求链接到 AJAX 请求 在其 javascript 中制作。

您可以通过在每次进行 AJAX 调用时传递一个 GUID/ID 并在服务器端检查其有效性来做到这一点。

  • 只要您的后端通过从 后端语言(ASP/PHP/Django/等),那么你可以很容易地嵌入一个 当服务器接收到初始 HTML 时,带有 HTML 的 GUID 的隐藏标记 请求,并将 GUID 存储在服务器上。

  • 在服务器上获得有效的 GUID 后,您可以格外小心 通过在设定的时间后丢弃它,设定使用次数和/或识别单个实例 的 HTML 页面发送太多/太快的 AJAX 请求。

请记住,即使使用 GUID,只要浏览器拥有它,机器人/恶意用户就可以抓住它并将其用作有效的 AJAX 请求。

因此,这里的关键安全措施是能够将 ajax 的请求限定为单个 HTML 请求并限制对它的使用

问自己一些问题,例如“我是否需要在此页面的每个实例中多次发出此 ajax 请求?” - 如果没有,那么当它发生在服务器端时,你就会知道它是恶意的。

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 2011-06-18
    • 2017-11-24
    • 2015-05-12
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2021-04-14
    相关资源
    最近更新 更多