Web安全
同源策略
- 两个URL协议、端口、域名/IP 都相同时,则为同源
- 以前可以通过document.domain来设置页面源,但该方式已被废弃
- 默认情况下,浏览器支持跨域写和跨域资源嵌入,但不支持跨域读
- 实现跨域
- iframe + location.hash 或者 iframe +window.name,在父文档中设置iframe的url变化或者 iframe.contentWindow.name,在子文档中读取对应的值来实现跨域
- postMessage:适用于浏览器不同标签页或者iframe之间的通信
- jsonp:通过script的src属性加url中的callback参数实现,但只能实现get方法
- CORS:目前主流的跨域解决方案,浏览器发起请求前会先发送一个OPTIONS方法来,服务端根据OPTIONS请求的内容来判断是否允许接下来的请求跨域
- 服务端判断跨域的条件在OPTIONS请求头中返回
- Access-Control-Allow-Origin:允许跨域请求的origin
- Access-Control-Allow-Methods:允许跨域请求的方法
- Access-Control-Allow-Headers:允许跨域请求头
- Access-Control-Max-Age:预检的OPTIONS请求缓存时间
- WebSocket:WS用于客户端和服务端的全双工通信,默认支持跨域
CSP
- 内容安全策略,由html中的meta标签指定或者服务端响应头中的Content-Secrity-Policy进行设置
- CSP通过指定有效的资源域来保护客户端安全
XSS
- 主要可以分为三类:存储型XSS(持久型)、反射型XSS(非持久型)、DOM型XSS
- 存储型XSS:黑客恶意通过页面输入框提交一段脚本代码到服务器,用户从服务器访问页面时会自动执行该脚本代码,从而进行攻击
- 反射型XSS:黑客提供给用户一个包含恶意脚本的URL,用户打开URL后重定向到正常页面,同时执行恶意脚本代码
- DOM型XSS:黑客通过修改DOM节点绑定的方法来促使用户正常交互时产生攻击行为
- 如何防范
- 只将明确可信的内容赋值给 innerHTML
- 富文本编辑时对内容进行转义后存储
- 现代框架默认都会在HTML渲染到页面前进行XSS转义处理
CSRF
- 用户在正常网站中登录后,访问了钓鱼网站,钓鱼网站获取到正常网站中的认证信息并伪造请求发送给正常网站服务端
- 攻击方式主要包含:img标签等src属性、form标签的action、a标签的href
- 如何防护
- 正确的使用GET和POST方法,GET方法只用来查询数据
- 添加Token认证,客户端每次发起请求是都携带一个token标记,服务端对该标记进行验证
- 服务端处理请求前验证来源,Origin或者Referer请求头
- 服务端返回Cookie时设置 Samesite,不允许第三方Cookie
SQL注入
- SQL注入为黑客在表单中填写SQL中关键字来让服务端查询非正常数据的行为
- 可通过参数转义,控制变量类型等方式进行防护,目前主流的服务端框架都已支持防SQL注入处理
SSO
- 单点登录,即在多个系统中,只需要登录一个系统即可调用多系统
- 最简单的SSO:把登录和权限校验单独抽离成一个SSO系统,其他所有系统的登录校验都调用SSO系统来进行判断
- CAS
- CAS作为全局的SSO系统,业务系统访问CAS时携带ServiceURL参数
- 若用户已登录,则CAS系统重定向到ServiceURL并添加ST参数
- 业务系统拿到ST参数后再通过ST参数请求CAS
- CAS验证ST有效后,业务系统再次重定向到业务页面
- 缺点是每一个业务系统访问CAS时都会生成一个新的ST,不同业务之间不共享SessionID
- Oauth2
- Oauth2是一个开放授权协议,支持第三方系统在无需登录的情况下访问服务器资源
- 第三方系统在访问资源时先跳转至授权页面,并携带第三方系统的URL
- 用户在页面点击授权后,授权服务器将页面重定向到上文中的URL,并返回授权码
- 第三方系统获取到授权码后再次通过授权码访问授权服务器
- 授权服务器将access_token返回给第三方系统
- 第三方系统通过access_token的方式去调用服务器资源