2

我敢肯定这是以前问过的,但找不到所以我再问一次。

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

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

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

4

3 回答 3

1

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

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

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

于 2013-05-08T07:49:32.063 回答
0
于 2013-05-08T07:29:44.170 回答
0

概括蛇和咖啡的答案:

您需要将初始 HTML 请求链接到在其 javascript 中发出的 AJAX 请求。

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

  • 只要您的后端通过从后端语言(ASP/PHP/Django/等)呈现 HTML 页面来提供 HTML 页面,那么当服务器接收初始 HTML 请求时,您就可以轻松地将带有 GUID 的隐藏标签嵌入到 HTML 中,并将 GUID 存储在服务器上。

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

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

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

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

于 2013-12-16T14:04:26.563 回答