我需要在JSP中使用隐藏变量进行会话跟踪。这是代码:
<input type="hidden" name="REQ_TOKEN" value="<%=session.getAttribute("SESN_TOKEN").toString()%>" />
我使用它来比较请求令牌和会话令牌,所以只有当两者相等时我才会评估该请求,否则我会抛出错误。
现在的问题是,当我将此代码放在<form></form>
标记内时,它运行正常。不幸的是,在我的应用程序中有一些JSP,我们没有<form>
标签(我知道这听起来很奇怪!)。我在哪里可以放置我的代码以便它可以工作?
我不能使用没有<form>
标签的隐藏变量吗?
答案 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
。到目前为止,我发现的网站说它们应该在表格内。
答案 2 :(得分:0)
如果它仅用于CSRF预防,那么在无形页面上根本不需要它。只是因为没有什么可以保护的:)重点是将它包含在每个<form method="post">
中,而不是每个页面。
那就是说,“会话跟踪”是一个完全不同的概念。 HttpSession
已经在cookie或URL重写的帮助下完成了幕后操作。这就是为什么我发现你的问题最初令人困惑,并发表评论澄清。您在这里只需要在请求基于令牌的帮助下进行“请求跟踪”,该令牌存储在会话范围内(并在请求通过后立即删除),以便您可以阻止CSRF。
更新:您可能会发现this answer对了解CSRF的实际情况非常有用。