2010-03-18 56 views
1

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

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

我用这比较与会话令牌请求令牌,所以只有当两者相等,我会评估该请求,否则我将抛出一个错误。

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

如果没有<form>标记,我不能使用隐藏变量吗?

+0

我想代码不显示在那里,这里是: " /> micheal 2010-03-18 14:03:41

+0

这种方法闻起来。你需要什么?你不是在重塑'HttpSession'已经在做什么吗?如果只是为了CSRF预防,那么你根本不需要它在无形的页面上。 – BalusC 2010-03-18 14:07:21

+0

@ Balus C,我试图用这段代码来阻止跨站请求伪造。 – micheal 2010-03-18 14:10:22

回答

1

听起来你正在描述的隐藏价值是什么更通常被称为nonce,它(当谈论web表单时)是一个值,用于验证表单只提交一次,请求表单的同一会话。请参阅防止cross-site request forgery的注意事项。

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

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

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

0

就我所知,您需要在窗体标记中使用隐藏字段才能正常工作。仍然查找它,将repost。到目前为止,我发现的网站都表示它们应该在表格中。

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

+0

然而,值得注意的是,与其他网站/博客相比,roseindia.net的文章通常会将不良的编码做法引入到非常高的程度。该网站*可能*包含良好的技术信息,但代码示例应该极其谨慎地接管。当你对所有的东西仍然是绿色/新的,并因此不知道什么是“好”和什么是“坏”时,这是有问题的。 – BalusC 2010-03-18 14:35:02

+0

@BalusC感谢您的提示。我自己对编码还是比较陌生,并且非常感谢我得到的任何提示和帮助。在那个笔记上,是否有任何博客或网站,你可以推荐给我的正确的编码程序,而不是一个快速修复。我发现很难真正找到解释做什么的网站。我通常使用php,html,.net框架,java,mysql代码。我访问php.net,w3schools和其他这样的网站,但无法找到提供更多答案而不是提问的博客或论坛。 – 2010-03-18 16:15:42

0

如果它只是一个CSRF的预防,那么你不需要它了,在无形的页面。只是因为没有什么可以保护:)关键是将它包含在每个<form method="post">中,而不是每个页面中。

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

更新:您可能会发现this answer有助于了解更多关于CSRF的实际情况。

+0

感谢您的回复BalusC, 我们不需要照顾一个网页上没有FORM标签的CSRF问题?在我的情况下,我有JSP没有FORM标签,他们使用HYPERLINKS(window.open/window.location)提交页面。 我仍然可以通过将标记添加到URL来实现CSRF修复(将REQ标记与会话标记进行比较),我现在正在执行此操作。但它是如何安全地显示(在URL中)给用户的REQ令牌? – micheal 2010-03-19 12:33:59

+0

Window.open和window.location只会触发GET请求,并且它们是无害的(至少应该是无害的),所以没有CSRF风险。但是,如果他们实际执行敏感操作(如删除/更新数据库中的某些内容),那么使用window.open/window.location就是错误的选择。无论如何,看起来你仍然不明白CSRF的关键。我建议再次阅读发布的链接。 – BalusC 2010-03-19 12:41:04

相关问题