0

对于经验丰富的 Web 开发人员来说,这可能是一个非常简单的新手问题,而我不是,而且谷歌搜索也无济于事。

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

问题在于验证 servlet:它是一个 POST,并且在使用应用程序本身时通过index.jsp. 但是我已经测试过,如果我直接调用 servlet,它也可以工作......而且我不希望这样。

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

4

3 回答 3

1

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

我猜对于给定的客户端 IP 地址,哈希值总是相同的,因此您也可以使用另一个值(如当前时间)对其进行加盐,该值在另一个隐藏字段中传递,以包含在 results.jsp 的计算中。

于 2013-01-16T10:50:10.290 回答
1

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

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

于 2013-01-16T11:02:23.590 回答
0

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

于 2013-01-16T10:50:53.363 回答