对于经验丰富的Web开发人员来说,这可能是一个非常简单的新手问题,我不是,并且谷歌搜索并没有帮助。
我在Heroku上有一个非常简单的webapp,代码是here。它有两个JSP页面,一个索引,一个带有验证结果,没什么花哨的。这两个JSP页面是here (index.jsp)和here (results.jsp)。
问题在于validation servlet:它是一个POST,当使用应用程序本身时,通过index.jsp
中的输入按钮触发。但我已经测试过,如果我直接调用servlet,它也会工作......而且我不想那样。
有没有办法可靠地确保只在来自索引页面时调用此servlet(否则发送403)?
答案 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上发布。同样认为隐藏了哈希的输入。