另一种传输会话ID的流行方式是通过URL。Web或应用服务器知道如何查找URL中包含了会话ID的特定模式,如果找到了,就从URL中获得会话。
不同的技术对如何在URL中内嵌和定位会话ID使用不同的策略:
PHP,使用名为PHPSESSID的查询参数:
?PHPSESSID=xxxxxxx&foo=bar
Java,使用矩阵参数:
;JSESSIONID=xxxxxxx?foo=bar
当使用这种方法的时候,必须将会话ID内嵌在应用程序返回的所有URL中,包括页面的链接、表单操作以及302重定向。
会话是存在漏洞的,在执行重要任务、含有敏感数据的应用程序中,使用某些商业的扫描器检测应用程序中的漏洞是更加明智的选择。
会话漏洞及解决方案:
复制并粘贴错误
漏洞:用户复制并粘贴地址栏中的URL
方案:完全禁止在URL中内嵌会话ID
会话固定:
攻击者可能会首先找到一些允许在URL中内嵌会话ID的网站。通过此种方式获得一个会话,然后将含有会话ID的URL发送给目标用户,此时,如果用户点击链接进入网站,它的会话ID就变成了URL中含有的固定ID--攻击者已经持有该ID。如果用户接着在该会话期间登录网站,那么攻击者也可以登录成功,因为这个会话ID是他共享的。解决方案:
禁止在URL中内嵌会话ID
在登录后采用会话迁移
跨站脚本和会话劫持
漏洞:使用JavaScript读取会话cookie的内容解决方案:
不要在网站中使用跨站脚本
在所有的cookie中使用HttpOnly特性
不安全的cookie
中间人攻击(MitM攻击),典型的如:数据截获攻击
解决方案:使用HTTPS保护网络通信将有效地防止MitM攻击,并保护会话ID cookie不被盗用。不过用户可能首先使用HTTP访问网站,即使立刻将请求进行重定向到HTTPS,攻击可能已经发生了。使用cookie的Secure标志可以解决此问题。
在许多情况下,都可以在Java EE中直接使用HTTP会话,不需要显式的配置,不过可以在部署描述符中配置它们,并且处于安全的目的也应该配置。在部署描述符中使用标签配置会话。
所有在和中的标签都是可选的,但是如果选择了这些标签就要按照如下顺序添加到部署描述符中:
表达式语言(EL)源于JSP标准库(JSTL)的一部分,用于在不使用脚本、声明或者表达式的情况下,在JSP页面中渲染数据。
EL的基本语法描述了一个必须与其他JSP页面语法分开执行的表达式。基本的EL语法有两种类型:立即执行和延迟执行。
1. 立即执行
立即执行EL表达式将在页面渲染的时候,被JSP引擎解析和执行。因为JSP从上向下执行,这意味着EL表达式将在JSP引擎发现它,并在继续执行其他页面部分之前执行它。如下为一个有效的EL表达式:
${expr}
美元符号和开始/结束花括号定义了EL表达式的边界。
2. 延迟执行
延迟执行EL表达式是统一表达式的一部分,主要用于满足JavaServer Faces的需要。尽管延迟执行语法在JSP中是合法的,但通常不会出现在JSP中。如下,其中expr是一个合法的表达式:
#{expr}
在JSF中,延迟执行表达式将在页面渲染或者回传到页面时执行,或者同时在两个阶段内执行。在JSP中,#{}延迟执行语法只是一个有效的JSP标签特性,用于将EL表达式的执行推迟到标签的渲染过程中。不同于在特性值绑定到标签之前执行EL表达式的方式,该标签的特性将获得一个对未执行EL表达式的引用。该标签可以在之后一个合适的时间,调用一个方法来执行EL表达式。
EL可以直接用在JSP的任何位置,除了少数例外情况。首先,EL表达式不能用在任何指令中。在编译JSP时,指令(<%@ page %>、<%@ include %>和<%@ taglib %>)将会被执行,但EL表达式是在稍后渲染JSP时执行,所以在其中添加EL表达式是无法正常工作的。另外,JSP声明(<%! %>)、脚本(<% %>)或者表达式(<%= %>)中的EL表达式也是无效的。除此之外,EL表达式可以添加到其他任何位置。一种常见的情况是将EL表达式添加到输出到屏幕的简单文本中。:
The user will see ${expr} text and will know that ${expr} is good.当表达式执行时,结果会内嵌在文本中显示到屏幕。
另外,表达式还可以用在标准的HTML标签特性中:
表达式也可以使用在JSP标签特性中:
<c:url value="/something/${expr}/${expr}" />JSP引擎不会解析这些HTML 特性中的内容,它会将其中的内容当作普通文本输出到响应中,所以可以在引用或者文本形式中包含EL表达式。