Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Analyse der Datenfilterung in Asp.net

Eine kurze Analyse der Datenfilterung in Asp.net

高洛峰
高洛峰Original
2017-01-21 15:13:341296Durchsuche

在Asp.net开如中,引发安全问题最多的大多来自于以下三个方面: 
  1.上传 
  2.跨站 
  3.注入 
  上传的安全问题不在本文讨论范围内,这里只讨论跨站与注入的问题,而这两者都是基本可以通过过滤来处理的!把注入放在最后面是因为,SQL注入玩了这么多年,大家应当有了一定的防范,只要稍有点注意,能在asp.net上面玩下的注入还是相当少的!注意这以下几点。 
  1.所有的参数。如果是int类型的,请转换成int再处理! 别拿装箱与拆箱来说事!估计现在大家也不会把sql语句直接在web里面拼接了,起码也要用上几个类,中间的一些简单的逻辑处理!类型转换还是要涉及到的 
  2.尽量使用参数化查询! 
  3.起码要注意过滤单引号(其实如果使用参数化查询,不过滤也没事,不过我还是习惯性过滤)! 
  4.不要直接把错误赤裸裸的暴露给用户!这点不仅仅是为了防范注入,同时也是一个用户体验问题!通过重写OnError事件,再继承,能很好的处理! 
  而相对于跨站,防洗耳范起来就麻烦多了,过滤一直是个很纠结的东西,过滤太严了,影响正常使用,没过滤好,又引发安全问题!我把我刚写的过滤类拿出来,也许其中还有没有考虑到的地方,希望大家指点, 

public static string StringFilters(string input) 
{ 
if (string.IsNullOrEmpty(input)) 
return input; 
/*跨站攻击过虑*/ 
input = input.Replace("&#", "&#");//过滤&# 攻击方式javascript:alert('XSS') 
input = Regex.Replace(input, @"javascript:", "Javascript:", RegexOptions.IgnoreCase);//过滤JS 攻击方式:javascript:alert('XSS'); 
input = Regex.Replace(input, @"vbscript:", "Vbscript:", RegexOptions.IgnoreCase);//过滤JS 攻击方式:vbscript:msgbox('XSS'); 
input = Regex.Replace(input, @"j *a *v *a *s *c *r *i *p *t:", "Vbscript:", RegexOptions.IgnoreCase);//攻击方式:java script:alert('XSS'); 
input = Regex.Replace(input, @"\/\*[sS]*\*\/", "<!-- code -->", RegexOptions.IgnoreCase); 
input = Regex.Replace(input, @"expression", "expression", RegexOptions.IgnoreCase); 
input = Regex.Replace(input, @"<[\u0020]*style[^>]*>", "S:yle", RegexOptions.IgnoreCase); 
input = Regex.Replace(input, @"<[^>]*object[^>]*>", "objec&$58", RegexOptions.IgnoreCase);//攻击方式 <OBJECT TYPE="text/x-scriptlet" DATA="http://www.cnblog.cn"></OBJECT> 注意,这样过滤后将无法使用FLASH 
/*各种事件过滤*/ 
input = Regex.Replace(input, @"<[^>]*[\u0020]+on[A-Za-z]{3,20}[\u0020]*=[\u0020]*[^>]*>", "Js Event", RegexOptions.IgnoreCase);// 
input = input.Replace("&#39;", "&#39;");//单引号防止SQL注入 
input = Regex.Replace(input, @"script", "Script", RegexOptions.IgnoreCase);//防止脚本攻击 
input = Regex.Replace(input, @"frame", "frame", RegexOptions.IgnoreCase);//防止iframe 挂马 
input = Regex.Replace(input, @"form", "form", RegexOptions.IgnoreCase);//禁止表单提交 
input = Regex.Replace(input, @"meta", "meta", RegexOptions.IgnoreCase);//防止用使meta跳转到非法网页 
return input; 
}

补充一下,过滤千万不要把字符串过虑成空,这样同样存在安全问题,必须过虑成另外一个字符串,比如过滤你好,那么用户可以构建这样一个字符“你你好好”,通过Replace("你好","")之后,输出的结果,我不说大家也知道! 
另外,这里是考虑了支持HTML的情况,所以没有直接过虑尖括号!

更多Asp.net之数据过滤浅析相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn