首先,我们来了解一些Web浏览器对于Cookie和HTTP身份验证信息之类的会话信息的处理方式。目前,浏览器会自动地发送标识用户对话的信息,而无须用户干预,换句话说,当浏览器发送这些身份信息的时候,用户根本感觉不到。假设站点A上有一个Web应用程序,并且受害者正好已经在该站点上通过了身份认证,这时,相应消息中就会有Cookie来记录这个信息。这个Cookie的作用是什么呢?主要是被站点作为用户会话的标志,即如果站点收到了带有受害者的Cookie的请求,那么它就会把这个请求看作是已登录的受害者发来的。一般情况下,浏览器收到站点设置的Cookie之后,每当向该站点发送请求的时候,浏览器都会"自动地"连同该Cookie一起发出。
然后,我们再来讨论一下攻击者对Web应用程序URL的了解。如果应用程序没有在URL中使用跟会话有关的信息,那么通过代码分析或者通过访问该应用程序并查看嵌入HTML/JavaScript中的URL以及表单来了解应用程序有关的URL、参数和允许值。
接下来,我们讨论一下应用程序赖以管理会话的信息对浏览器的透明性问题。我们知道,为了提高Web应用的便利性,用来管理会话的信息,如Cookie或者基于HTTP的身份验证(如HTTP基本认证、非基于表单的认证)等敏感信息,都是由浏览器来存放的,并在每当向需要身份验证的应用程序发送请求时自动捎带上。也就是说,浏览器可以访问会话管理信息,如果Web应用程序完全依赖于这类信息来识别一个用户会话,就为跨站请求伪造创造了条件,因为Web应用程序不会判断这个请求到底是否是合法用户发送的。
上面的3个因素是跨站请求伪造攻击的必要条件,而下面所说的,是一个"锦上添花"的因素,即没有它也能发动跨站请求伪造攻击,但是有了它能使该攻击更加容易。这就是存在多种HTML标签,如果页面内出现这些标签,会立刻引起浏览器对HTTP资源的访问,我们上面例子提到的img标签便是其中之一。
另外,不得不提的是,多窗口浏览器或多或少对跨站请求伪造推波助澜。现在主流的浏览器,如IE8+、Firefox、Chrome等都支持多窗口浏览器,在给我们浏览网页带来便捷的同时也带来了一些潜在的问题。因为多窗口浏览器新开的窗口是具有当前所有会话的,即用户用IE登录了用户的微博,然后想看新闻了,如果又打开另一个IE,则同时是打开了一个新的进程,这个时候两个IE窗口的会话是彼此独立的,从看新闻的IE发送请求到微博不会有用户微博登录的Cookie;但是多窗口浏览器永远都只有一个进程,各窗口的会话是通用的,即看新闻的窗口发请求到微博会带上用户在微博上登录的Cookie。想一想,当我们用鼠标点击新闻中别人留下的评论的时候,说不定一场精心准备的CSRF攻击正等着我们呢。
简单来说,跨站请求伪造具有以下特征:
只要你登录一个站点A且没有退出,则任何页面都可以发送一些你有权限执行的请求并执行。
站点A的会话持续的时间越长,受CSRF攻击的概率就越大。
目标站点的功能采用GET还是POST并不重要,只不过用POST只是加大了一点点CSRF攻击的难度而已(我们在后面会详细解释)。
XSS和CSRF是一对好兄弟(我们在后面会详细解释)。
有时候复杂的表单采用多步提交的方式来防止CSRF攻击其实并不可靠,因为我们可以发送多个请求来模拟多步提交。



