今天的文章介绍了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. c#:Json字符串转成xml对象

    没看到.net framework中有这样的功能, 懒得到处找了, 索性花点时间自己写一个 /* * Created by SharpDevelop. * Date: 2013/6/24 * User ...

  2. centos下memcached安装

    memcached是一款高速.分布式的内存缓存系统.其官方主页在http://www.danga.com/memcached/ 1.安装前的准备 要安装memcached,需要有libevent的支持 ...

  3. vue通过(NGINX)部署在子目录或者二级目录实践

    1.修改 router/index.js 添加一行 base: 'admin', 2.然后修改 config/index.js 增加一行 const assetsPublicPath = '/admi ...

  4. Mysql向存储过程中传递中文参数变成乱码的解决方案

    今天做程序需要用到一个存储过程,然后用php程序调用.  存储过程如下: delimiter $$ CREATE PROCEDURE disagree_upgrade_detail(a int,b t ...

  5. 转--NLTK的内置函数

    NLTK的内置函数 1. 词语索引 (1) concordance函数    给出一个指定单词每一次出现,连同上下文一起显示. >>>text1.concordance('monst ...

  6. log4net 使用指南,最常遇到的问题整理。。。

    一.    Log4net特征    Log4net是一个用于.NET开发环境的日志记录组件,由于它的超快及超灵活,很多大型的应用都会用到.    它有如下特点:    1.自定义日志输出级别    ...

  7. rpc简易实现-zookeeper

    一.RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP, ...

  8. sql 如何更改表的字段属性

    alter table tablename alter column colname newDataType 比如:ALTER   TABLE   mytable ALTER COLUMN  myco ...

  9. [saiku] schema文件分析

    上一篇讲到了如何在管理台配置数据源 [ http://www.cnblogs.com/avivaye/p/4877767.html ] 这次来说明下shema文件里面是怎样配置Cube和角色权限的 通 ...

  10. 给iOS开发新手送点福利,简述UISegment的属性和用法

    UISegment属性 1.segmentedControlStyle 设置segment的显示样式. typedef NS_ENUM(NSInteger, UISegmentedControlSty ...