一、 HttpOnly
HttpOnly最早是由微软提出的,并在IE6中实现的,至今已经成为一个标准。浏览器将禁止页面的JavaScript访问带有HttpOnly属性的Cookie。
严格的说,HttpOnly并非为了对抗XSS——HttpOnly解决的是XSS后的cookie劫持攻击。
在“初探XSSpayload”一节中,曾经演示过“如何使用XSS窃取用户的Cookie,然后登陆进该用户的账户”。但如果该Cookie设置了HttpOnly,则这种攻击会失败,因为JavaScript取不到cookie的值。
一个cookie的使用过程如下:
Step1:浏览器向服务器发送请求,这时候没有cookie
Step2:服务器返回时发送set-cookie头,向客户端浏览器写入cookie。
Step3:在该cookie到期前,浏览器访问该域下的所有页面,都将发送该cookie。
需要注意的是,服务器可能会设置多个cookie(多个key-value对),而HttpOnly可以有选择性地加在任何一个Cookie值上。
在某些时候,应用可能需要JavaScript访问某几项cookie,这种cookie可以不设置HttpOnly标记;而仅把HttpOnly标记给用于认证的关键cookie。
但是HttpOnly不是万能的,添加了HttpOnly不等于解决了XSS问题。
二、输入检查
输入检查的逻辑,必须放在服务器端代码中实现。如果只是在客户端使用JavaScript进行输入检查,是很容易被攻击者绕过的。目前web开发的普遍做法是同时在客户端JavaScript中和服务器端代码中实现相同的输入检查。客户端JavaScript的输入检查,可以阻挡大部分误操作的正常用户,从而节约服务器资源。
在XSS的防御上,输入检查一般是检查用户输入的数据中是否包含一些特殊的字符,比如<、>、’、”、等等。如果发现存在特殊字符,则将这些特殊字符过滤或者编码。
比较睿智的“输入检查”可能还会匹配XSS的特征。比如查找用户数据是否包含了“<script>”、“JavaScript”等敏感字符。
三、输出检查
对于变量输出到HTML页面时,可以使用编码或者转义的方式来防御XSS攻击。