微波EDA网,见证研发工程师的成长!
首页 > 通信和网络 > 通信网络业界新闻 > 实例:详解跨站脚本攻击的攻与防

实例:详解跨站脚本攻击的攻与防

时间:09-18 来源:IT专家网 点击:

觉中就点击这个链接,于是用户就会被欺骗,而邮件发送者会从中得到好处。那这是如何实现的?

  当你点击这个链接的时后,在链接里的script代码就会引导你所用浏览器去下载指定的JavaScript程序并执行它。攻击者的Script检查到你使用的是IE浏览器后,就着手下载ActiceX控件。由于你对一个网站可能已经产生了忠诚的认可,所以攻击者的script代码和Active控件就能在你机器上不受限制的运行。

  ActiveX攻击说明

  W3C在《安全常见问题解答》中对ActiveX的安全问题作了比较详尽的说明。Java applet对系统的控制受到严格限制。SUN开发它时就规定,只有那些对系统的安全不构成威胁的操作才被允许运行。在另一方面,ActiveX对系统的操作就没有严格地被限制。如果一但被下载,就可以象安装的可执行程序一样运行。针对这一特点IE浏览器也作了某些限制,如对于那些不安全的站点,在它的默认设置中就会不允许你进行下载或者会给你警告的提示。正在基于ActiveX进行开发的公司,如VeriSign公司,它们对ActiveX控件都给编了号。当你在下载控件时,IE浏览器会给你警告并显示它的可信籁程度,由用户决定是否相信这个控件。但是,不得不承认存在很多并不完全了解计算机使用的用户,由于他们很难分辨哪一个插件到底是做什么的,所以往往会直接默认许可。假如用户长期浏览一个站点,如某某门户网站,很多用户会把其设置为默认,由于你对该站点的信任,在出现可用ActiveX控件下载的时候,绝大多数用户会无所顾及的下载并运行。

  十六进制编码的ActiveX Script 攻击

  假如一个用户,即使是一个很有经验的用户,要区分恶意标签和脚本都是一件非常困难的事,Script脚本能够以十六进制的形式把自己藏起来。例如一封看似完整的邮件,里面包含了以十六进制伪造的URL参数:sender=xxx.com。当用户点击链接时,用户的浏览器就会直接弹出警告窗口。

讲了三种攻击形式,我们是不是应该来看看如何防御了?

  跨站Script攻击的防犯

  如何避免服务器受到跨站脚本攻击

  虽然跨站脚本攻击、社会工程学等一直很热,但防止跨站脚本攻击的技术正趋于完善。目前可采取这几种方式来防止跨站脚本的攻击:

1.对动态生成的页面的字符进行编码;

2.对输入进行过滤和限制;

  3.使用HTML和URL编码。

  对动态生成的页面的字符进行编码

  所谓对动态生成的页面的字符进行编码,其实是为了防止黑客更改你的字符设置而轻易地通过你的防线。如果我们的网站是个英语网站,这样只要我们把字符编码设成拉丁字符ISO-8859-1就行了,具体情况如下:

<META http-equiv="Content-Type" content="text/html;charset=ISO-8859-1">

过滤和限制所有输入的数据

  当用户在进行登录的时侯,不要让那些特殊的字符也输入进去。因此我们可在ONSUBMIT方法中加入JAVASCRIPT程序来完成这个功能。例如,我们限制最多只能输入15个字符,这样可以阻止那些较长的script的输入。 微软提供了一个简短的Javascript程序来完成对输入数据的过滤。结合上面的实例,我们来看如下代码:

function checkForm() { document.forms[0].userName.value = _ RemoveBad(document.forms[0].userName.value); return true; } // MICROSOFTS CODE function RemoveBad(strTemp) { strTemp = strTemp.replace(////"////%//;//(//)//&//+//-/g,""); return strTemp; }

用这个办法,可以过滤在输入中含有 % < > [ ] { } ; & + - " ( ) 的这些字符。

  使用HTML和URL编码

  尽管使用过滤和限制输入的办法是一种非常重要用防御手段,但却不是万能的。针对某些特殊情况,如URL的参数直接放在邮件中,我们不得不采取一种更有力的安全措施。如我们用的ASP,解决起来相对容易些,只要对动态生成的页面进行HTML和URL编码就OK。针对我们例子中的情况,在第一输入页中我们对redirect URL作了如下改动:

strRedirectUrl = strRedirectUrl & _ server.URLEncode(Response.Cookies("userName"))

  在执行页中我们加入:

strUserName =server.HTMLEncode(Request.QueryString("userName"))

strUserName =server.HTMLEncode(Request.Form("userName"))

微软推荐对所有动态页面的输入和输出都应进行编码,甚至在对数据库数据的存入和取出也应如此,这样可以在很大程度上避免跨站脚本攻击。

  要做到这些还要在Page1.asp中加入:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top