1 为了防止跨站脚本,假设所有的输入都是恶意的,比如共享数据库、文件输入、Cookie值、QueryString变量、HTTP头部信息、有公共接口的Web服务、RSS订阅等等


2 有潜在危险的HTML标记:<applet> <body> <embed> <frame> <script> <frameset> <html> <iframe> <img> <style> <layer> <link> <ilayer> <meta> <object>


3 跨站脚本例子
<img src="javascript:alert('hello');">

<img src="java script:alert('hello');">

<img src="javascript:alert('hello');">

<style TYPE="text/javascript">
alert('hello');
</style>


4 防止跨站脚本
:对HTML编码、对URL编码、过滤用户的输入
<%@ Page Language="C#" ValidateRequest="false"%>

<script runat="server">

void submitBtn_Click(object sender, EventArgs e)
{
// Encode the string input
StringBuilder sb = new StringBuilder(HttpUtility.HtmlEncode(htmlInputTxt.Text));
// Selectively allow  <b> and <i>
sb.Replace("&lt;b&gt;", "<b>");
sb.Replace("&lt;/b&gt;", "");
sb.Replace("&lt;i&gt;", "<i>");
sb.Replace("&lt;/i&gt;", "");
Response.Write(sb.ToString());
}
</script>

编码的原则,只对有必要的输出进行编码,如

Response.Write("<b>First Name:</b> " + Microsoft.Security.Application.AntiXss.HtmlEncode(Request.Form["fname"]);

而不是

Response.Write(Microsoft.Security.Application.AntiXss.HtmlEncode("<b>First Name:</b> " + Request.Form["fname"]);

MVC中已经使用相关Helper方法的地方没必要再编码,因为Helper方法已经做了编码的处理,如

<%= Html.ActionLink(anchortext, "Modify") %>

ASP.NET 4.0中优先使用AntiXSS库或者<%:标记,<%:标记内部使用了HttpUtility.HtmlEncode方法,比如

<%: "output string" %> 相当于 <%= HttpUtility.HtmlEncode("output string") %>

如果URL输出到其它标记中,比如<a>标记中,则应使用HtmlAttributeEncode方法

<a href="<%= AntiXss.HtmlAttributeEncode(unsafeUrl) %>">Untrusted link example</a>

如果直接输出整个URL,则使用HtmlEncode方法
<%= AntiXss.HtmlEncode(unsafeUrl) %>

对内嵌的HTML进行编码

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="false" %>

<html>
<form >Web Client Guidance研究1感兴趣

相关文章: