1

我需要在我的 JSP 中使用隐藏变量来进行会话跟踪。这是代码:

<input type="hidden" name="REQ_TOKEN" value="<%=session.getAttribute("SESN_TOKEN").toString()%>" />

我使用它来比较请求令牌和会话令牌,所以只有当两者相等时我才会评估该请求,否则我会抛出错误。

现在的问题是,当我将此代码放在<form></form>标签中时,它工作正常。不幸的是,我的应用程序中有一些 JSP 没有<form>标记(我知道这听起来很奇怪!)。我可以在哪里放置我的代码以便它可以工作?

我不能使用没有<form>标签的隐藏变量吗?

4

3 回答 3

1

听起来您所描述的隐藏值通常被称为随机数,它(在谈论 Web 表单时)是一个用于验证表单仅提交一次的值,并且由请求的同一会话提交表格。请参阅这些关于防止跨站点请求伪造的说明。

首先,您如何在没有 的情况下提交请求<form>?用户是否只是单击链接?如果是这样,您可以将 nonce 附加到查询字符串,但如果您使用 GET 请求来处理实际需要验证 nonce 的破坏性内容,那么您做错了。这些类型的请求只能通过 POST 发出,这意味着生成一个<form method="post">.

其次,不,您不能<input type="hidden" />在表格之外使用。给定的表单只提交自己的值,即 和 之间的<form>元素</form>

如果您希望您的隐藏值包含在回发的数据中,您必须在提交的表单中包含隐藏输入。如您所说,如果您无法<form>在 JSP 文件中包含所需的标签,则可以通过 Javascript 动态发出请求,但这会引入对 Javascript 的依赖,对于如此简单和基本的事情,您应该避免这种依赖。

于 2010-03-18T14:13:33.340 回答
0

据我所知,您需要在表单标签中包含隐藏字段才能正常工作。还在查,会repost的。到目前为止,我发现的网站说它们应该在表格内。

编辑* roseindia.net/jsp/jspsession/HiddenForm

于 2010-03-18T14:11:23.027 回答
0

如果只是为了防止 CSRF,那么在无形页面上根本不需要它。仅仅是因为没有什么可以保护的 :) 重点是将它包含<form method="post">在每个页面中,而不是每个页面中。

也就是说,“会话跟踪”是一个完全不同的概念。在HttpSessioncookie 或 URL 重写的帮助下,他们已经在幕后做到了这一点。这就是为什么我最初发现您的问题令人困惑并发表评论以进行澄清。您在这里只需要借助存储在会话范围中的基于请求的令牌来“请求跟踪”(并在请求通过后立即删除),以便您可以防止 CSRF。

更新:您可能会发现此答案有助于了解更多有关 CSRF 的实际含义。

于 2010-03-18T14:12:39.233 回答