如何区分从HTML表单提交的HTTP请求和从客户端提交的HTTP请求?
是否有任何方法(在Java Servlet中)确定HTTP POST或者GET请求是来自HTML表单的提交结果还是其他结果?
解决方案
我认为除非客户端本身进行合作,否则这是不可能的(意味着客户端设置了一些标头)
并不真地。我们可以检查用户代理字符串,但是可以由调用方设置。
好吧,我们可以查看代理字符串,看看它是来自于浏览器还是来自客户端应用程序(假设它具有自己的代理字符串)
我们可以使用隐藏的表单字段+ Cookie来完成此操作。
我们可以做的是设置一个随机数,并将其作为表单的隐藏字段。然后,我们可以将其应用于随表格一起发送的Cookie。 Cookie应该链接到隐藏字段,并且还应该包含某种随机数。最后,提交表单后,我们可以检查Cookie和隐藏字段,并查看它们是否正确。如果需要,可以将其链接到表单原始请求的IP地址和用户代理。我们甚至可以使用一些Javascript为所有这些添加香料。首先将隐藏字段设置为空白,然后再添加一些ajax来向服务器请求隐藏字段随机数。
这并不完美,但这应该可以让我们获得80%-90%的收益。拥有不错的HTTP技能的人仍然可以欺骗它。
但是,这引发了一个问题,为什么我们要在该级别区分请求?
还是我们真的只是想弄清楚用户是否点击了"提交"按钮? (如果是这种情况,那么提交按钮的名称/值对应该在请求实体/查询字符串中...取决于表单方法。)
如果我们可以控制客户端,则可以添加一个自定义标头以标识发件人。
进行XmlHTTPRequest时,一些javascript库已经执行了此操作,因此我们可以处理不同于标准请求的Ajax调用。
检查每个传入请求的标头,以查看是否可以使用任何内容。
使用一些JavaScript设置一些值。
我们不清楚是要区分合法的不同访问方法,还是要反对伪造的附件(即试图看起来像普通用户的机器人或者黑客)。
在第一种情况下,keprao对于检查割台有一些很好的建议。在第二种情况下,尽管验证码或者身份验证可能会阻碍机器人,但基本上没有办法区分请求。