我们应该在哪里放置HIDDEN变量在JSP中

时间:2010-03-18 14:00:33

标签: html jsp csrf

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

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

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

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

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

3 个答案:

答案 0 :(得分:1)

听起来你所描述的隐藏值是更常被称为nonce的内容,(当谈论Web表单时)是用于验证表单只提交一次的值,并且通过相同的值请求表单的会话。请参阅有关阻止cross-site request forgery的这些说明。

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

那就是说,“会话跟踪”是一个完全不同的概念。 HttpSession已经在cookie或URL重写的帮助下完成了幕后操作。这就是为什么我发现你的问题最初令人困惑,并发表评论澄清。您在这里只需要在请求基于令牌的帮助下进行“请求跟踪”,该令牌存储在会话范围内(并在请求通过后立即删除),以便您可以阻止CSRF。

更新:您可能会发现this answer对了解CSRF的实际情况非常有用。