1. 前端安全类
- XSS
- CSRF
- sql 注入:使用 parameterized stored procedure
1.1. CSRF
cross-site request forgery 跨站请求伪造
1.1.1. 原理
- 用户登录过网站 A
- A 网站给用户下发 cookie
- 用户访问网站 B
- B 网站引诱用户点击
- 用户点击后请求了网站 A 的某个接口,因为 cookie 还在,A 网站认为该登录用户进行了操作,可能添加删除数据
很多年前微博一些大 V 突然同时关注了一些人 就是 csrf 造成的。
发生前提: 用户登陆过网站 A,用户点击请求时 cookie 有效
document.write(`<form method="post" name="commentForm" target="csrf" action="http://loacalhost">
<input type="hidden" name="postId" value="13">
<textarea name="content" >来自csrf</textarea>
</form>`);
var iframe = document.createElement('iframe');
iframe.name = 'csrf';
iframe.style.display = 'none';
document.body.appendChild(iframe);
setTimeout(() => {
document.querySelector('[name=commentForm]').submit(); //执行在攻击页面该脚本
}, 1000);
防御测试:
- Token 验证: 访问网站是会主动上传 cookie,但不会主动传 token。访问接口是没有 token 则不予通过验证,或者 验证码
- referral 验证: 页面来源是自己站点(同域名)才通过
- 隐层令牌: 隐藏在 http head 中,类似 token,使用方式有些区别
1.2. XSS
cross-site scripting 跨站脚本攻击
1.2.1. 原理
不需要登录认证,向页面注入脚本,写入标签,执行有害脚本。可能是评论区添加注入的
1.2.2. XSS 攻击类型
反射型
URL 参数直接注入。
http://loacalhost:8080/?from<script>alert(1)</script>Google
存储型
存储到 DB 后读取时注入。xss 代码会保存到网站的数据中,比如保存到数据库,当其他用户在访问到一篇文章或一个评论时,这段代码会被从数据库中读取取出来,显示在用户页面上。XSS 攻击注入点: HTML 节点内容、HTML 属性、JavaScript 代码、富文本
1.2.3. 防御措施
让插入的东西无法执行。KBB 编辑器。html escape。
转义
< <
和> >
var escapeHtml = function(str) { if (!str) return ''; str = str.replace(/</g, '<'); //替换成html实体 str = str.replace(/>/g, '>'); return str; };
- .net 默认开启 XSS 防御,在提交表单的数据时会检测是否有
<>
这样危险字符,并自动转义 - kbb 编辑器
- .net 默认开启 XSS 防御,在提交表单的数据时会检测是否有
使用 cookie 的 httpOnly 属性,加上了这个属性的 cookie 字段,js 是无法进行读写的
浏览器自带的 XSS 攻击拦截机制:
设置
Header X-XSS-Protection
。此机制只适用于参数出现在 HTML 内容或属性 才会去拦截。只适用于反射型。并不是所有浏览器都支持新的防御方法-CSP 内容安全策略
该安全策略的实现基于一个称作 Content-Security-Policy
的 HTTP 首部。
限制规则:
child-src: 为 web workers 和其他内嵌浏览器内容定义 合法的源,例如用 <frame> 和 <iframe> 加载到页面的内容。
connect-src: 限制能通过脚本接口加载的URL。
default-src: 为其他取指令提供备用服务 fetch directives.
font-src: 限制通过 @font-face 加载的字体源。
frame-src: 限制通过类似 <frame> 和 <iframe> 标签加载的内嵌内容源。
img-src: 限制图片和图标源
manifest-src: 限制 application manifest 文件源。
media-src: 限制通过 <audio> 或 <video> 标签加载的媒体文件源。
object-src: 限制通过 <object>, <embed>, <applet> 标签加载源。
script-src: 限制 javascript 源。
style-src: 限制层叠样式表文件源。
worker-src: 限制 Worker, SharedWorker, 或者 ServiceWorker 脚本源。
指定哪些可信,哪些不可信
<host-source><scheme-source>'self'
'unsafe-inline''ubsafe-eval''none'
XSS 攻击重点: 检测页面内容(信任规则)'nonce-<base64-value>' <hash-source>
一次性凭证 后台 hash 传递'strit-dynamic'
后续脚本的信任
事例
<!-- 在Content中设置规则 -->
<meta http-equiv="Content-Security-Policy" content="default-src https:">
<!-- 这样设置页面上的脚本会失效,但是外链引用的脚本会有效 -->
<meta http-equiv="Content-Security-Policy" content="default-src self">
<!-- 但是这样还会导致页面图片失效 因为没有设置相应的'img-src' 规则 ,所以他只会信赖本域下的图片 -->
<!-- 为了更精准的操作防止 XSS 攻击,则采用script-src 这样图片不会受到影响 -->
<meta http-equiv="Content-Security-Policy" content="script-src self">
<!-- 但是页面上有需要的呢,那就需要设置新规则nonce+随即字符串. nonce+随机🔀字符串 -->
<meta http-equiv="Content-Security-Policy" content="script-src self nonce-1234">
<script type="text/javascript" nonce="1234">
</script>
<!--通过计算页面 hash 值也可以保证界面不受XSS攻击-->