所谓的安全,其实是指两个方面
- 私密性:不被非法获取和利用(Get)
- 代码层面
- 架构层面
- 运维层面
- 问题
- 用户身份被盗用
- 用户密码泄露
- 用户资料被盗取
- 网站数据库泄露
- 其他
- 可靠性:不丢失不损坏不被篡改
跨站脚本攻击XSS(Cross Site Scripting)
跨站脚本攻击(Cross Site Scripting),缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
XSS原理
- 攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。
- 诱使受害者打开受到攻击的服务器URL。
- 受害者在Web浏览器中打开URL,恶意脚本执行
XSS分类
- 反射型(url参数直接注入)
- URL转换(转网址)
- 存储型(存储到DB后读取时注入)
- 把恶意脚本存储到攻击目标的数据库中,等待猎物点击
XSS注入点
- HTML节点内容
<div>#{content}</div>
注入点 <div><script>alert(1)</script></div>
- HTML属性(提前终止属性)
<img src="#{image}" />
注入点<img src="1" οnerrοr="alert(1)"/>
- Javascript代码(字符串提前关闭)
<script type="text/javascript">
var data = "#{data}";
var data = "hello";alert(1);"";
</script>
1
- 富文本
- 富文本具有HTML
- HTML有XSS攻击的风险
XSS实例
http://localhost:8045/?from=%3Cscript%20src=%22https://cdn.bootcss.com/jquery/3.2.1/jquery.js%22%3Ealert(1)%3C/script%3E;hanxiao
XSS防御(浏览器,只针对反射性)
chrome浏览器自带防御,反射性XSS(HTML内容和属性),就两种
ctx.set('X-XSS-Protection',1);
参数出现在HTML内容或属性
js和富文本的无法拦截
HTML内容的防御
- 用户发表,进入数据库之前转义
- 显示时进行转义
转义< < > >
<script></script>
HTML属性的防御
空格,单引号,双引号
一般空格不转义,但是这样我们就需要想到使用单引号或者双引号
JavaScript的防御
/ " 转义
小心注释符//和引号提前截断
富文本防御
js可以藏在标签里,超链接url里,何种属性里
<script>alert(1)</script>
<a href="javascript:alert(1)"></a>
<img src="abc" οnerrοr="alert(1)"/>
- 过滤
- 黑名单(正则过滤,简单,全面困难)
- 去掉
<script/>
….
- 去掉
- 白名单(麻烦,html解析树状结构,过滤,组转HTML)
- 只允许部分标签和属性
- npm install cheerio库(jquery)
- npm install xss(中国人写的)
- 黑名单(正则过滤,简单,全面困难)