今天的文章介绍了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. QLoo graphql engine 学习二 基本试用(kubernetes)

    已经测试过docker&& docker-compose 的运行模式,下面测试下kubernetes的运行模式 kubernetes 我使用docker for mac qloo 安装 ...

  2. C#.NET股票历史数据采集,【附18年历史数据和源代码】

    阅读目录 1.数据采集需求 2.股市数据接口 3.数据库设计 4.关键信息采集 5.源代码和数据库 如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 重点重点:我没有买股票,没有买股票, ...

  3. Hive之 数据存储

    首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据. 其次 ...

  4. asm335x系列adc和触摸屏驱动(转)

    An analog-to-digital converter (abbreviated ADC) is a device that uses sampling to convert a continu ...

  5. JSP的taglib示例

    web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2 ...

  6. [maven] 实战笔记 - maven 安装配置

    1.下载地址http://maven.apache.org/download.html 2.windows下安装maven(1)下载 apache-maven-3.0-bin.zip 解压到任意目录下 ...

  7. Centos 7.2基础安装和配置(含分区方案建议)

    景:windows桌面运维为主的我,前几天接到一个去某客户上架安装服务器的工作任务,含糊的说要上架几台服务器顺便安装Centos系统,于是我便下载了一个Centos7.2版本的镜像,顺利的用USBwr ...

  8. Changing the load order/delay the start of the Server service

    THE INFORMATION IN THIS ARTICLE APPLIES TO: Secure FTP Server (All Versions) EFT Server (All Version ...

  9. ffmpeg源码分析--av_find_best_stream <转>

    1. av_find_best_streama. 就是要获取音视频及字幕的stream_indexb.以前没有函数av_find_best_stream时,获取索引可以通过如下 ; i<is-& ...

  10. Spring集成Mybatis配置文件的简单理解

    详情可见官方文档http://www.mybatis.org/spring/zh/index.html 一.需要配置的对象实例 1.SqlSessionFactoryBean 在 MyBatis-Sp ...