为什么有必要验证通过调用HttpSession.getAttribute()获得的servlet中的数据?

时间:2012-11-16 18:15:47

标签: java security

我是WebApp编程的新手,我正在尝试了解不通过调用javax.servlet.http.HttpSession.getAttribute()接口方法获得的数据验证的安全隐患。我正在使用安全代码扫描程序标记了此潜在漏洞。

我知道作为一般规则,我应该始终验证从不受信任的来源获得的数据,但我想我不明白为什么会话的内容不受信任。这是基于我(可能是无根据的)假设,即数据可以添加到会话的唯一方法是调用HttpSession.setAttribute()并且只有在同一应用程序范围内的受信任代码应该能够这样做

我想我真正在问的是攻击者如何利用从HttpSession获取验证数据失败的应用程序。是因为实现是未知的,并且不能保证会话的内容不是以某种方式从HTTP请求中的数据构建的(除了会话ID)并因此受到篡改?或者是因为信任会话的内容意味着隐含地信任会话ID,这可能会被破坏并指向错误的会话? (虽然为了实现这一点,似乎攻击者必须有一些方法来创建包含受损数据的备用会话。)

假设会话的内容不是根据请求中的数据构建的,是否可以利用此漏洞的唯一方法是,是否存在允许攻击者创建错误会话的另一个漏洞?例如。上传可执行代码并让服务器执行它并返回捕获并重放的会话ID?

THX

3 个答案:

答案 0 :(得分:0)

我认为它所说的是,如果用户可能输入数据,则无法确定用户输入的内容或是否存在任何类型的客户端验证。如果您根据请求中收到的内容盲目调用函数,则可能存在安全问题。例如,在检索用户输入的客户ID的客户信息之前,请确保该ID有效并确保用户有权查看数据。

答案 1 :(得分:0)

数据也可以从表单添加到会话中。请求可能来自另一个servlet /应用程序,而不一定来自表单。有人可以很容易地在表单/ servlet中为SQL注入设置SQL语句并将其转发给servlet。这只是我能想到的一种可能性。 话虽如此,我不记得验证会话属性......永远!

答案 2 :(得分:0)

只要您不向HttpSession中放入任何您不信任的内容,就不需要验证HttpSession中的数据。 HttpSession是为您的webapp创建的,当您要求它时,并且应该只包含您在其中一个servlet或JSP中添加的内容 - 尽管可能是间接的,如果您使用的是其他框架。

我个人会确保我从未在HttpSession中添加任何内容,以后我将其取出后再进行验证。在一个简单的servlet容器环境中,它只是你自己的代码来更新会话(除非容器自动删除它,如果它超时)。

除非您使用的框架会自动将内容添加到HttpSession ,否则这些内容可能直接来自用户而未经过清理,那么您应该没问题。如果您自己的代码当前正在HttpSession中放置您不信任的内容,我会将其更改为不执行此操作。

请注意,JSP在这方面没有任何区别;编译后,JSP servlet。如果您相信您的servlet放入HttpSession中,您应该能够信任您的JSP对它的作用。 (毕竟,它们是你的 JSP。)

Re'是因为实现是未知的,并且不能保证会话的内容不是以某种方式从HTTP请求中的数据构建的(除了会话ID)因此受到篡改?'。 servlet规范中没有任何内容可以强制执行或允许这种情况发生。所以不,这不是原因。

Re'或者是因为信任会话的内容意味着隐含地信任会话ID,这可能会被破坏并指向错误的会话?我不确定'错误的会话'。但是,一旦某人(除了打算用户)拥有会话ID(JSESSIONID),他们基本上 预期用户,并且可以做任何用户可以做的事情(在所讨论的webapp的能力范围内) 。无论受损数据来自会话,数据库还是其他任何内容,都是如此。

一种常见的servlet / MVC / JSP方法是将用户登录(通过任何方式),并在那时为用户创建一个包含该用户的最小表示的HttpSession(例如,包含用户ID的UserLogin POJO,名称等等)。从那时起,webapp信任该信息是有效的,并使用它来识别用户 - 例如HTTP请求到达时使用JSESSIONID,它映射到HttpSession,后者映射到会话中的某些数据(UserLogin POJO),然后在从webapp中调用底层系统时识别请求用户(例如,进行数据库调用)。缺少HttpSession和UserLogin会话数据则表明用户未登录。这在webapps中很常见,并且依赖于能够信任它映射到的JSESSIONID和HttpSession。 (重要的是JSESSIONID是系统用来表示此会话的用户的临时令牌;而用户USER_ID [例如在SQL数据库中]通常是永久性的而不是可撤销的,因此不应该用于标识发出请求的登录用户。)

顺便说一下(因为有人提到过上面的JSP)我不会写一个JSP触及会话的webapp--我会限制JSP渲染基于MVC的servlet提供给他们的数据。

(如果我有选择的话,我根本不会使用JSP:JSP相当笨拙,语法很丑陋,还有许多其他限制 - 尝试使用JSP来模拟电子邮件,而不是HTML页面例如,没有跳过一堆箍。考虑使用Velocity或类似的。)