© zebra (汇百家之长,成一人之声)大部分的开发人员其实对web安全相关的知识是相对缺乏的,即便是我们作为程序员从业多年,也未必曾全面的对安全知识进行系统化的学习。初次出版于2012年的《白帽子讲web安全》是一本比较全面介绍web安全知识的图书,有非常强的工作指导意义,本书作者来自阿里P10安全专家吴翰清,大家可以去购买该书籍阅读。本文是我在几年前关于该书的读书笔记,总结了一些核心的知识点。本系列共3篇:白帽子讲web安全-学习笔记1白帽子讲web安全-学习笔记2白帽子讲web安全-学习笔记31.安全世界观1.1.网络安全要解决的基本问题机密性:信息的内容不能被轻易获取到,常见方式是加密(又分为对称加密,非对称加密)完整性:我们在传输或者使用过程中的内容信息是完整的,未被篡改的,常见技术手段是数字签名,我们的一些api签名等可用性:就是我们得保证服务是可用的,安全要保护的东西是可用的在现代密码学中,还有一些安全相关问题,比如抗抵赖性:比如你对某数据进行了电子签名,那么这个签名是唯一确定你身份认证:在公钥体系下,分配给不同的使用者不同的私钥,从而具备了身份认证的能力1.2.网络安全主要面临的威胁伪装,篡改,抵赖,信息泄露,拒绝服务,提升权限1.3.重要的安全原则secure by default原则,1)白黑名单原则,默认都不可信,尽可能开白名单2)最小权限原则3)纵深防御原则,通俗来讲就是要从整个系统进行防御,可以是从从web端,服务器,数据库,甚至代码规范,安全代码扫描,也可以是从业务系统本身4)数据代码分离原则,尤其是注入攻击5)不可预测性,让攻击者无法猜测,比如某网站保留处理的id是自增的,那么就很容易刷,我们完全可以把id加密,程序进程每一个启动栈基准地址都不一样,防止那种直接修改内容数据造成的攻击2.浏览器安全2.1同源策略浏览器的同源策略,限制了来自不同源document或者脚本,对当前document读取或者设置某些属性的能力。影响源的主要有host,域名,子域名,端口,协议script img,iframe,link的 src属性可以不受同源策略限制可以跨域资源,不过浏览器限制了使其不能读,写返回的内容,比如cookie这些敏感信息,是不会再请求的时候携带的而xmlhttpRequest遵守同源策略,在这种情况下如果允许跨域访问则需要目标站点设置Access-Control-Allow-Origin http头2.2浏览器安全机制浏览器沙箱是一种对 进程或者资源隔离技术,防止完整通过浏览器漏洞执行恶意代码一些先进的浏览器厂商建立了恶意网址库,防止script或者iframe引入了恶意的挂马网址第3章 跨站脚本攻击3.1什么是跨站脚本攻击cross site script,通常是指通过“HTML注入”篡改网页,插入了恶意的脚本从而在用户浏览网页是,控制用户浏览器的一种攻击.典型案例就是直接把用户输入的数据不encode直接渲染在html上面,如<?php$input=$GET['a'];echo "<div>".$input."</div>";直接渲染了echo $aa,造成了安全漏洞隐患3.2xss类型反射型xss,简单地把用户的输入数据“反射”给浏览器,诱导用户点击一个恶意链接,比如在工商应该网址上产生一个恶意链接吧你应道到登录密码存储型xss ,xss脚本被存储到服务端了,当页面展示的时候就执行,典型案例就是文章评论展示的时候显示的未经过处理的富文本。dom based xss,通过输入破坏原有dom节点,产生新的节点,插入可执行脚本,改变用户的视图界面,诱导用户操作或者点击。3.3xss攻击1)插入一个script引入的不安全js,这个js中读取用户的cookie,然后用js代码生成一个用img标签,frame这些可以跨域的标签吧请求带出去,可以截获用户的敏感信息cookie挟持非常敏感,我们需要设置HttpOnly报文头2)插入一个img标签,src上构造出发出get请求的url,img标签加载时就能请求3)构造一个form表单调用submit提交post4)构造xmlHttpResuel发送ajax请求5)xss钓鱼,构造伪造dom钓鱼,例如收集用户登录信息6)盗取用户信息7)识别用户浏览器,UserAgent,在浏览器设置自定义ua情况下,可以利用不同浏览器的特性试探从而收集用户信息8)识别用户安装软件,例如通过ActiveX检查是否存在某个软件,flash的system.capabilities就可以收集硬件信息9)查询用户访问过哪些网页链接,利用style的visited熟悉,点过的标签是蓝色的java applet获取用户真实ip10)xss worm实现自我复制3.4常见的xss构造漏洞(方法)1)利用字符编码,截断或者构造一些新的编码使得escape失效2)反注释用户html3)把信息存储在location.hash4)劫持标签修改url基准地址5)使用Windows.name赋值,跳过跨域的限制,Windows对象不是document对象跨域传递信息6)常见js框架漏洞7)利用css漏洞8)控制浏览器的url地址3.5xss防御大部分浏览器都内置了相关扩展1)HttpOnly 设置后禁止js获取携带httponly的cookie2)输入检查,特殊字符不能输入,或者输入后过滤,使用一些开源xss filter3)输出检查,避免原样输出,或者绑定在html attr上,如html或者直接echo,需要使用htmlencode,php中可用htmlentities(),htmlspecialchars(),在owasp esapi中有javascriptEncode/jsonencode/xmlencode的实现4)使用smart相关的view模板引擎渲染,不要使用php函数echo 直接绑定变量输出5)谨慎引入第三方库前端库6)可以使用OWasp esapi安全解决方案, https://www.owasp.org/index.php/OWASP_PHP_Security_Project7)urlencode8)过滤富文本编辑器中的内容 如HTMLpurify9)绑定变量到script标签是要进行javascriptEncode所有追加,渲染,替换dom的地方都要考虑4.跨站请求伪造4.1什么是跨站请求伪造csrf夸站点请求伪造,比如A站点存在一个安全漏洞,B站点在自己的网站构造一个指向A站点的url诱惑用户点击,因为你同时打开了AB,你在点击连接A的时候其实能够发送A的session cookie信息。第三方cookie也是本地cookie,大多数浏览器不会跨域携带P3P头,如果浏览器设置了P3P头,将会发送本地cookie4.2csrf的防御1).验证码必须有用户参与才能提交表单2)referer check验证请求来源,页面与页面之间是有请求关系的3)方式之一是 csrf token 在表单和session cookie中同时植入token,服务端做一致性验证,攻击者无法猜测到这个随机的token,主要原理是攻击者拿不到这个具体的token,而服务端有能够校验token的正确性.4)生成随机或者有自校验能力的id,不出现自动id递增的情形5)遵循resetfull规范,例如get就只能查询,如果页面存在跨站脚本攻击xss这种方式无用下一篇:白帽子讲web安全-学习笔记1白帽子讲web安全-学习笔记2白帽子讲web安全-学习笔记3