csdn的各位大虾们,大家好。
小弟在做论坛相关的web应用程序,涉及到跨站脚本攻击的问题,首先我贴出我现在知道的一些这方面的资料。
如果我们的网站没有做任何这方面的处理,此时ASP.Net的引擎会引发一个 HttpRequestValidationExceptioin,帮我们阻止了这些请求,此时如果我们想自己处理这个错误消息,我们可以通过把页面描述中的ValidateRequest="false"来禁用这个特性。
举例而言,处理这个异常其实只需要很简短的一小段代码就够了。在页面的Code-behind页面中加入这么一段代码:
- C# code
protected void Page_Error(object sender, EventArgs e){ Exception ex = Server.GetLastError(); if (ex is HttpRequestValidationException) { Response.Write("请您输入合法字符串。"); Server.ClearError(); // 如果不ClearError()这个异常会继续传到Application_Error()。 }}
这样这个程序就可以截获 HttpRequestValidationException 异常,而且可以按照程序员的意愿返回一个合理的报错信息。
如果页面有富文本编辑器的控件的,那么必然会导致有<xxx>类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?
首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。
然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有"<b>"标签,那么我们就将"<b>"显式的替换回"<b>"。
- C# code
void submitBtn_Click(object sender, EventArgs e) { // 将输入字符串编码,这样所有的HTML标签都失效了。 StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text)); // 然后我们选择性的允许<b> 和 <i> sb.Replace("<b>", "<b>"); sb.Replace("</b>", ""); sb.Replace("<i>", "<i>"); sb.Replace("</i>", ""); Response.Write(sb.ToString()); }
这样我们即允许了部分HTML标签,又禁止了危险的标签。
根据微软提供的建议,我们要慎重允许下列HTML标签,因为这些HTML标签都是有可能导致跨站脚本攻击的。
<applet>
<body>
<embed>
<frame>
<script>
<frameset>
<html>
<iframe>
<img>
<style>
<layer>
<link>
<ilayer>
<meta>
<object>
通过这种做法我们能够屏蔽所有的危险了,但我的问题是:我们在很多场合是必须允许用户进行html很多标签的输入的,比如论坛里的超链接或图片。比如在qq空间发表文章时,要想插入图片就要用[img]图片地址[/img],如果完全屏蔽很简单,只需要进行编码即可,但如果使用类似qq的模式,如果我把图片地址写成:javascript:alert("test");,类似于这样:
- HTML code
[img]javascript:alert('welcome');[/img]
在这种情况下比如cnblog会把这段代码进行编码后原样显示,但如果img标签里面的确是个图片的地址他就会显示一个图片,现在的问题就是如何做到这一点?如何在用户提交的是一个图片的时候就显示一个图片,而如果是恶意的代码就直接编码原样显示?根据微软的建议,“默认禁止,显式允许”,也就是只有后面是图片的时候才显示图片其他情况都原样输出。因为恶意代码的方法有很多,比如如果我img标签是这样:
- HTML code
[img]http://www.xx.xx.aspx[/img]
而xx.aspx内容很简单,类似这样:
- C# code
response.write("<script language='javascript'>alert('xxx');</script>");
这样的又该如何处理?
总起来现在的问题就是,如果将服务器自定义的标签比如[img]安全准确的显示出来,也就是说服务器是如何对这些标签进行处理的?
小弟刚接触这些甚是不懂,希望做过的给点资料或思路。谢谢csdn的大虾们。
------解决方案--------------------------------------------------------
打比方:
某服务器上有n个站点,a,b,c,d,e...,站点文件夹放到d盘,且整个d盘都给了users或来宾帐号读写权限,当其中一个网站被人上传一个可遍历整个硬盘的文件(asp木马)上去时,是不是就可以对你的整个d盘上的所有文件进行操作呢?
所以我们首先要确定我们的权限问题
将D盘的users和其它没有必要的用户删除掉,在a(一个站点一个文件夹,文件夹名称越复杂越好)文件夹下创建www(也可以是别的IIS映射进来的文件夹),然后针对www给权限,一般我们这里可以给users读写权限,这里木马只能查看和操作www文件夹下的文件