0

假设我在 Web 应用程序中有一个 servlet,并且所有用户都需要登录才能执行任何操作。因此,在getandpost方法中有一个if块来测试用户是否已通过尝试提取会话属性来处理请求并else在未登录时重定向到登录页面来测试用户是否已登录。

在这种情况下,入侵者有没有办法在不知道密码的情况下操纵系统进入?假设密码被硬编码到 servlet 中。如果是,他会从哪里开始?

4

2 回答 2

2

我会查看http://docs.oracle.com/javaee/5/tutorial/doc/bncbe.html#bncbj以及从该部分链接的关于指定身份验证机制的部分。

另请参阅(在 Stackoverflow 上)寻找使用 servlet 和 JSP 的简单、安全的会话设计以及 servlet如何工作?实例化、会话、共享变量和多线程

简而言之,如果您使用这些页面上描述的机制,您不需要自己做太多检查会话属性的工作。您的登录表单可以在需要身份验证的“表单登录”配置中使用。

于 2013-03-30T23:18:17.127 回答
0

安全的关键在于你的评论extract a session attribute——你是怎么做到的?他们是否向您发送查询字符串参数?他们是否在方法标头中向您发送凭据?

对于@Hogan 的观点,除非这是通过 HTTPS,否则答案是:“不,它不安全。中间人 (MITM) 可以从您提交的内容中获取密码并简单地重新使用它来掩盖自己的密码恶意请求”。

如果通信是通过 HTTPS 完成的,那么你应该没问题。有一个硬编码的密码很好,但考虑一下密码被泄露的情况;现在每个客户/用户/等。必须更改他们的代码。

更好的设计是向客户颁发一个密钥,他们可以将其与他们的请求一起发送,您可以使用该密钥来识别他们是谁,如果密钥被泄露,则向该用户/客户端/等重新颁发一个新密钥。

这假设流量通过 HTTPS

如果没有流量,那么其中很多都会发生故障,您需要查看 HMAC 之类的东西。我写了这篇关于设计安全 API的文章——它应该很好地介绍了所有这些安全噩梦是如何工作的。

如果你的眼睛在你的后脑勺上滚动并且你在想“我的上帝,我只是想要一个是/否”,那么我的建议是:

  1. 要求所有流量都通过 HTTPS
  2. 向每个客户端发出单独的密码,这样如果一个被泄露,每个单独的密码都不会被泄露。
  3. 这应该让你走得很远。

希望有所帮助。这个话题非常棘手,我知道您不想上历史课,只想解决这个问题并继续前进。希望我给了你足够的东西来做到这一点。

于 2013-03-30T23:23:35.137 回答