今天的文章介绍了ASP.NET 4中引入的一个小而且非常有用的新语法功能 - 这是在代码块中自动对输出进行HTML编码的功能。这有助于保护您的应用程序和站点免受跨站点脚本注入(XSS)和HTML注入攻击,并且使您能够使用简洁的语法来执行此操作。

HTML编码

跨网站脚本注入(XSS)和HTML编码攻击是困扰网站和应用程序的两个最常见的安全问题。当黑客找到一种方法将客户端脚本或HTML标记注入网页,然后由其他访问者查看网站时,就会发生这种情况。这既可以用来破坏网站,也可以让黑客运行客户端脚本代码,窃取cookie数据和/或利用用户的身份在网站上做坏事。

帮助缓解跨站脚本攻击的一种方法是确保呈现的输出是在页面内编码的HTML。这有助于确保任何可能由最终用户输入/修改的内容都不能输出到包含<script>或<img>元素的标签的页面上。

如何HTML编码今天的内容

ASP.NET应用程序(尤其是使用ASP.NET MVC的应用程序)通常依靠使用<%=%>代码块表达式来呈现输出。今天的开发人员经常使用这些表达式中的Server.HtmlEncode()或HttpUtility.Encode()帮助器方法在呈现之前对输出进行HTML编码。这可以使用如下代码来完成:

虽然这工作正常,但有两个缺点:

  1. 这是一个有点冗长
  2. 开发人员经常忘记调用Server.HtmlEncode方法 - 并且没有简单的方法来验证应用程序的使用情况

新的<%:%>代码块语法

使用ASP.NET 4,我们引入了一种新的代码表达式语法(<%:%>),它可以呈现像<%=%>块这样的输出,但是也会在执行之前自动对HTML进行编码。这消除了像上面的例子那样显式地HTML编码内容的需要。相反,你可以在下面写出更简洁的代码来完成完全相同的事情:

我们选择了<%:%>语法,以便快速替换<%=%>代码块的现有实例。它还使您能够轻松搜索代码库中的<%=%>元素,以查找和验证在应用程序中没有使用HTML编码的任何情况,以确保您具有正确的行为。

避免双重编码

虽然HTML编码内容通常是一个很好的实践,但是有时您输出的内容是HTML或已经被编码 - 在这种情况下,您不想再对HTML进行编码。

ASP.NET 4引入了一个新的IHtmlString接口 (以及一个具体的实现:HtmlString),您可以在类型上实现以表明其值已经正确编码(或以其他方式)显示为HTML,因此值不应该再次进行HTML编码。<%:%>代码块语法检查IHtmlString接口是否存在,如果代码表达式的值实现了此接口,则不会对代码表达式的输出进行HTML编码。这允许开发人员避免必须根据每个案例来决定是使用<%=%>还是<%:%>代码块。相反,您始终可以使用<%:%>代码块, 接口。

使用带有<%:%>的ASP.NET MVC HTML Helper方法

有关此HTML编码转义机制有用的实际示例,请考虑在ASP.NET MVC中使用HTML帮助程序方法的情况。这些辅助方法通常返回HTML。例如:Html.TextBox()辅助方法返回标记,如<input type =“text”/>。在ASP.NET MVC 2中,这些辅助方法现在默认返回HtmlString类型 - 这表示返回的字符串内容对于渲染是安全的,不应该由<%:%>块编码。

这使您可以在<%=%>代码块块中使用这些方法:

以及在<%:%>代码块块中:

在这两种情况下,从helper方法返回的HTML内容都将以HTML的形式呈现给客户端,并且<%:%>代码块将避免对其进行双重编码。

这使您可以默认在应用程序中始终使用<%:%>代码块代替<%=%>代码块。如果你想要真正的核心,你甚至可以创建一个构建规则,搜索你的应用程序寻找<%=%>的用法,并标记任何它发现的错误,以强制HTML编码总是发生。

脚手架ASP.NET MVC 2视图

当您使用VS 2010(或免费的Visual Web Developer 2010 Express)来构建ASP.NET MVC 2应用程序时,您会发现默认情况下使用“添加视图”对话框的脚手架视图始终使用<%:% >输出任何内容时阻止。例如,下面我为一个Article对象搭建了一个简单的“编辑”视图。请注意标签,文本框和验证消息的<%:%>代码块的三种用法(所有使用HTML帮助程序方法的输出):

概要

新的<%:%>语法提供了一种自动HTML编码内容的简明方法,然后将其作为输出呈现。它可以让你的代码不那么冗长,并且可以轻松地检查/验证你的网站是否始终是HTML编码内容。这可以帮助保护您的应用程序免受跨站点脚本注入(XSS)和HTML注入攻击。

ASP.NET 4(和ASP.NET MVC 2)中输出HTML编码的新语法<%:%>的更多相关文章

  1. 针对Linux ASP.NET MVC网站中 httpHandlers配置无效的解决方案

    近期有Linux ASP.NET用户反映,在MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404(找不到网页) ...

  2. 【初学者指南】在ASP.NET MVC 5中创建GridView

    介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...

  3. 创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段

    创建ASP.NET Core MVC应用程序(5)-添加查询功能 & 新字段 添加查询功能 本文将实现通过Name查询用户信息. 首先更新GetAll方法以启用查询: public async ...

  4. 1、ASP.NET MVC入门到精通——新语法

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特 ...

  5. ASP.NET Web API - ASP.NET MVC 4 系列

           Web API 项目是 Windows 通信接口(Windows Communication Foundation,WCF)团队及其用户激情下的产物,他们想与 HTTP 深度整合.WCF ...

  6. [转]在 ASP.NET MVC 4 中创建为移动设备优化的视图

    原文链接 https://msdn.microsoft.com/zh-cn/magazine/dn296507.aspx 如果深入探讨有关编写移动设备网站的常识性考虑因素,会发现其中有一种内在矛盾.  ...

  7. ASP.NET MVC 4中如何为不同的浏览器自适应布局和视图

    在ASP.NET MVC 4中,可以很简单地实现针对不同的浏览器自适应布局和视图.这个得归功于MVC中的"约定甚于配置"的设计理念. 默认的自适应 MVC 4自动地为移动设备浏览器 ...

  8. ASP.NET 5与MVC 6中的新特性

    差点忘了提一句,MVC 6中默认的渲染引擎Razor也将得到更新,以支持C# 6中的新语法.而Razor中的新特性还不只这一点. 在某些情况下,直接在Web页面中嵌入某些JSON数据的方式可能比向服务 ...

  9. 对ASP.NET 5和ASP.NET MVC 6应用程序进行集成测试

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:之前有文章谈到如何对ASP.NET 5的应用程序进行单元测试(需使用xunit),今天 ...

随机推荐

  1. Centos7配置 SNMP服务

    本文转载至:http://blog.51cto.com/5001660/2097212   一.安装yum源安装SNMP软件包 1.更新yum源: yum clean all yum makecach ...

  2. 让APK 成功在 Windows 运行并可以设置本地文件

    让APK 成功在 Windows 运行并可以设置本地文件 安装 ARC Welder. 启动 ARC Welder 后选反apk 文件,下载 zip. 将 zip 解压修改 manifest.json ...

  3. java局部变量和临时变量

    局部变量:temp=1, 临时变量:return a+b 临时变量会有一点的性能优势 局部变量会比成员变量和静态成员变量有优势,改进的方法是吧成员变量和静态成员变量赋值在局部变量:https://bl ...

  4. LogHelp 日记分天记录,只记30天日记

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  5. CentOS 6.5 下HeartBeat的安装与配置

    CentOS 6.5 下HeartBeat的安装与配置 参考网站: http://wenku.baidu.com/link?url=BvqJatdx1m12PLil-7YA1zkM0yUOEO8OnN ...

  6. mysql 计算经纬度函数(米)

    ) CHARSET utf8mb4 begin return ROUND( * ASIN( SQRT( POW( SIN( ( lat1 ) ), ) ) ) * POW( SIN( ( lon1 ) ...

  7. Centos6.5安装phpldapadmin

    phpLDAPadmin是一个基于Web的LDAP管理工具用于管理LDAP服务器的各个方面.你可以利用它浏览LDAP Tree,创建/删除/修改和复制节点(entry) ,执行搜索,导入/导出LDIF ...

  8. SCN与数据恢复的关系

    Oracle内部主要存在以下四种SCN 1.系统检查点(system checkpoint)SCN 每当一个检查点完成时,Oracle就把该检查点对应的SCN记录到控制文件中,可以用以下语句查看当前数 ...

  9. ES6系列_4之扩展运算符和rest运算符

    运算符可以很好的为我们解决参数和对象数组未知情况下的编程,让我们的代码更健壮和简洁. 运算符有两种:对象扩展运算符与rest运算符. 1.对象扩展( spread)运算符(...) (1)解决参数个数 ...

  10. extjs [1]

    1.JS 类的声明,和对象的创建 2.原始方法用EXTJS创建一个window 3.利用一个按钮触发window窗体,了解一下EXTJS的事件机制 4.用EXTJS4.0的create来创建windo ...