今天的文章介绍了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. 大数据之 ZooKeeper原理及其在Hadoop和HBase中的应用

    ZooKeeper是一个开源的分布式协调服务,由雅虎创建,是Google Chubby的开源实现.分布式应用程序可以基于ZooKeeper实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知. ...

  2. 数据抽取 CDC

    什么是数据抽取 数据抽取是指从源数据源系统抽取目的数据源系统需要的数据.实际应用中,数据源较多采用的是关系数据库. [编辑] 数据抽取的方式 (一) 全量抽取 全量抽取类似于数据迁移或数据复制,它将数 ...

  3. Visual Studio Community 2013 中文语言包-离线安装版

    vs_langpack.exe /layout 命令运行或者批处理运行. 转自:http://www.tuicool.com/articles/uMzqAnA 现成安装包下载地址:链接: http:/ ...

  4. 02 - Unit010:关联映射

    关联映射 什么是? 数据库中有关联关系的表,通过实体对象引用的方式体现出来,叫关联映射. 为什么? 将多表的记录封装成实体对象. 何时用? 对数据库中的表进行多表查询时. 怎么用? cn_user-- ...

  5. emacs之配置auto-complete

    el-get-install安装auto-complete emacsConfig/auto-complete-setting.el ;这个是设置一个字母就自动完成的 (setq ac-auto-st ...

  6. 最小化安装CentOS7,没有ifconfig命令---yum search command_name搜索未知包名

    新安装的CentOS7系统,想查询ip的时候,发现没有ifconfig这个命令: -bash: ifconfig: 未找到命令 yum安装: 没有可用软件包 ifconfig 既然知道命令,搜索一下命 ...

  7. 关于centos7.5部署oelinker_php版本的问题点汇总

    1.下载开源版本https://github.com/eolinker/eoLinker-AMS-Lite-For-PHP到本地,将release文件夹内容copy到apache的/var/www/h ...

  8. 浏览器禁用Cookie

    做JavaWeb的都知道Session的底层是使用Cookie来实现的,服务器端会在本地文件中保存session信息,并将sessionID发给客户端(浏览器),浏览器就会把这个sessionID(准 ...

  9. CCproxy 设置代理服务器。

    CCproxy 设置代理服务器. 通过代理服务器上网,出口IP就固定成代理服务器的IP 设置安装比较简单,直接去ccproxy官网下载就行 如果服务器是公网服务器,记得在设置,高级里面的网络中,把禁止 ...

  10. 页面白屏并且报错PHP Parse error: syntax error, unexpected end of file in 试了很久总算解决了

    页面白屏并且报错PHP Parse error:  syntax error, unexpected end of file in 试了很久 啥短标记,打开,都试了 最简单的办法 是重新建立一个文件, ...