Cookie(和间接sessions)用于保存两个HTTP请求之间的信息。如果浏览器在没有cookie的情况下发送两次相同的请求,则服务器无法看到它是同一个人。你可以认为IP地址是足够的,然而很多人在企业环境和移动网络中共享相同的IP地址(因为他们通过相同的代理)。也可以将信息作为URL的一部分保存在当前用户的信息中,但这可能会很快变得难看,并且信息很容易在浏览器的历史记录中找到。
Cookies首先由服务器使用HTTP标头发送:Set-Cookie。一旦接收到这个头文件,浏览器就会自动发送cookie到服务器,在发送到这个服务器的所有后续请求中,使用一个Cookie头文件。
该Set-Cookie头包含了许多可选字段:
- 到期日期:告诉浏览器何时应该删除cookie。
- Domain:告诉浏览器该cookie应该发送到哪个子域或主机名。
- Path:告诉浏览器哪些路径应该被发送。
- 安全标志。
默认情况下,Path和Domain主要用于增加或限制同一个域内或同一服务器内的应用程序的给定Cookie的可用性。
我曾经审查过一个web应用程序,可以通过将A.domain.com收到的Cookie发送到B.domain.com来访问其他公司的信息…… Cookie范围限于每个子域,因此它没有被早一点发现。
Cookies可以有两个安全相关的标志:
- httpOnly:阻止通过JavaScript代码访问Cookie。该机制通过限制直接访问document.cookie JavaScript中使用的Cookie来防止跨站脚本的琐碎利用。
- secure:防止浏览器通过未加密的通信发送Cookie。这主要用于限制某人在没有安全连接的情况下浏览网站时被盗的cookie的风险。
sessions是使用Cookie作为传输媒介的机制。Cookie的主要问题是用户可以拦截并篡改它们。为了防止这种情况,开发者开始使用sessions发回给用户的cookie包含sessions标识符(session id)。当用户在接下来的请求中发回cookie时,应用程序使用此sessions标识符访问本地存储的信息。这些信息可以存储在文件,数据库或内存中。出于安全原因,某些sessions的机制也会对数据进行加密。
Rack::Session::Cookie在基于机架的应用程序中默认使用(大多数Ruby应用程序使用Rack)。这提供了一个不同的sessions机制。信息被发回给用户,但是用秘密签名。这样,用户不能篡改sessions中的信息(但是一旦他们解码,他们仍然可以访问它)。
默认情况下,在PHP中,会话使用每个sessions一个文件进行保存,并且未加密存储(在Debian中/var/lib/php5/)。如果您有本地访问系统,您可以阅读其他人的sessions信息。
例如,如果您的session id(cookie值中发回的值)是o8d7lr4p16d9gec7ofkdbnhm93,您将看到一个名为的文件sess_o8d7lr4p16d9gec7ofkdbnhm93,其中包含会话中的信息:
# cat /var/lib/php5/sess_o8d7lr4p16d9gec7ofkdbnhm93 pentesterlab|s:12:"pentesterlab";
Web服务器可以在多个应用程序之间共享sessions。检查一个应用程序的有效sessions是否可以让您访问另一个应用程序总是很有趣。