这段代码很简单,所以我希望所有不是真的要允许用户输入之类字符的朋友,千万不要随意的禁止这个安全特性,如果只是需要异常处理,那么请用类似于上面的代码来处理即可。
而对于那些通过 明确禁止了这个特性的程序员,自己一定要明白自己在做什么,而且一定要自己手动的检查必须过滤的字符串,否则你的站点很容易引发跨站脚本攻击。
关于存在Rich Text Editor的页面应该如何处理?
如果页面有富文本编辑器的控件的,那么必然会导致有类的HTML标签提交回来。在这种情况下,我们不得不将validateRequest="false"。那么安全性怎么处理?如何在这种情况下最大限度的预防跨站脚本攻击呢?
根据微软的建议,我们应该采取安全上称为“默认禁止,显式允许”的策略。
首先,我们将输入字符串用 HttpUtility.HtmlEncode()来编码,将其中的HTML标签彻底禁止。
然后,我们再对我们所感兴趣的、并且是安全标签,通过Replace()进行替换。比如,我们希望有""标签,那么我们就将""显式的替换回""。
示例代码如下:
以下是引用片段: 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标签都是有可能导致跨站脚本攻击的。
以下是引用片段: |
可能这里最让人不能理解的是<img>。但是,看过下列代码后,就应该明白其危险性了。
以下是引用片段: <img src="javascript:alert(''hello'');"> <img src="java script:alert(''hello'');"> <img src="java script:alert(''hello'');"> |
通过<img>标签是有可能导致script执行的,这样攻击者就可以做他想伪装的任何事情。
关于<style>也是一样:
以下是引用片段: <style TYPE="text/javascript"> alert(''hello''); </style> |