如何区分从 HTML 表单提交的 HTTP 请求和从客户端提交的 HTTP 请求?

Posted

技术标签:

【中文标题】如何区分从 HTML 表单提交的 HTTP 请求和从客户端提交的 HTTP 请求?【英文标题】:How to differentiate a HTTP Request submitted from a HTML form and a HTTP Request submitted from a client? 【发布时间】:2010-09-12 23:58:04 【问题描述】:

有什么方法(在 Java Servlet 中)可以确定 HTTP POST 或 GET 请求是来自 html 表单提交还是其他结果?

【问题讨论】:

我想更多的上下文会给你更好的答案,你为什么要这样做? 【参考方案1】:

您可以使用隐藏的表单域 + cookie 来实现。

您可以设置一个nonce,并将其作为表单的隐藏字段。然后,您将其应用于与表单一起发送的 cookie。 cookie 应该链接到隐藏字段,并且还应该包含某种随机数。最后,当表单提交时,你可以检查cookie和隐藏字段,看看它们是否正确。如果需要,将其链接到表单原始请求的 IP 地址和用户代理。你甚至可以用一些 javascript 来增加这一切。首先将隐藏字段设为空白,然后通过一些 ajax 向服务器请求隐藏字段随机数。

这并不完美,但应该可以让你完成 80%-90% 的工作。不过,具有良好 HTTP 技能的人仍然可以欺骗它。

然而,它提出了一个问题,为什么要在该级别区分请求?

或者你真的只是想弄清楚用户是否点击了“提交”按钮? (如果是这种情况,那么提交按钮的名称/值对应该在请求实体/查询字符串中......取决于表单方法。)

【讨论】:

【参考方案2】:

我认为这是不可能的,除非客户端本身是合作的(意味着客户端设置了一些标头)

【讨论】:

【参考方案3】:

不是真的。您可以检查用户代理字符串,但可以由调用者设置。

【讨论】:

【参考方案4】:

好吧,您可以查看代理字符串,看看它是来自浏览器还是来自您的客户端应用程序(假设它有自己的代理字符串)

【讨论】:

【参考方案5】:

如果您可以控制客户端,则可以附加自定义标头来识别发件人。

一些 javascript 库在发出 XmlHTTPRequests 时已经这样做了,因此您可以处理不同于标准请求的 Ajax 调用。

检查每个传入请求的标头,看看是否有什么可以使用的。

【讨论】:

【参考方案6】:

使用一些 JavaScript 来设置一些值。

【讨论】:

【参考方案7】:

您不清楚是要区分合法的不同访问方法,还是要针对伪造的攻击(即试图看起来像普通用户的机器人或黑客)。

在第一种情况下,keprao 有一些检查标题的好建议。在第二种情况下,基本上无法区分请求,尽管机器人可能会受到验证码或身份验证的阻碍。

【讨论】:

以上是关于如何区分从 HTML 表单提交的 HTTP 请求和从客户端提交的 HTTP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

QtWebkit:如何跟踪/修改 HTTP 请求?

如何拦截所有http请求,包括表单提交

如何接收 HTML 表单请求

如何使用两个提交按钮,并区分使用哪个提交表单? [复制]

restful有几种请求,表单如何提交put请求

如何使用HTML表单发送电子邮件并使用Node.js和Gulp提交?