HTTP POST:如何确保仅从上一页调用它?

时间:2013-01-16 10:35:26

标签: java jsp jetty http-post

对于经验丰富的Web开发人员来说,这可能是一个非常简单的新手问题,我不是,并且谷歌搜索并没有帮助。

我在Heroku上有一个非常简单的webapp,代码是here。它有两个JSP页面,一个索引,一个带有验证结果,没什么花哨的。这两个JSP页面是here (index.jsp)here (results.jsp)

问题在于validation servlet:它是一个POST,当使用应用程序本身时,通过index.jsp中的输入按钮触发。但我已经测试过,如果我直接调用servlet,它也会工作......而且我不想那样。

有没有办法可靠地确保只在来自索引页面时调用此servlet(否则发送403)?

3 个答案:

答案 0 :(得分:1)

我使用的一种方法是让index.jsp上的输入表单包含一个隐藏字段,其中包含md5哈希值,results.jsp也可以计算。我使用客户端机器的IP地址的md5哈希与一个共享密码短语连接。

我猜对于给定的客户端IP地址,散列总是相同的,所以你也可以将它与其他值(如当前时间)一起使用,该值在另一个隐藏字段中传递,以包含在results.jsp的计算中

答案 1 :(得分:1)

您可以在加载第一页时生成指纹(例如UUID.randomUUID())并将值保存在当前会话中。

将结果发布到验证servlet时,将该指纹包含为隐藏字段,并检查会话中是否存在指纹。

答案 2 :(得分:0)

你无法100%确定这一点。最终你可以检查引用者,但它可以伪造它。您还可以在加载index.jsp时设置cookie并检查servlet中的值。但也有人可以加载index.jsp来检索cookie,然后使用它在验证servlet上发布。同样认为隐藏了哈希的输入。