今天的文章介绍了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. 打造基于jQuery的智能选择输入框

    UPDATE:修正了在FireFox下显示的问题,重新copy CSS即可 写完这个名字忽然觉得有点标题党的嫌疑,但是又不知道什么样的名字比较合适,那就暂且这样吧. 今天要讲的东西比较简单,其中会用到 ...

  2. java中的变量和常量

    也可以先声明后赋值  自动类型转换 1.  目标类型能与源类型兼容,如 double 型兼容 int 型,但是 char 型不能兼容 int 型 2.  目标类型大于源类型,如 double 类型长度 ...

  3. Gradle使用国内的maven仓库

    本文转载自:https://www.cnblogs.com/yoyotl/p/6291703.html 感谢阿里云! 找到gradle的配置文件路径,例如Windows中的路径为C:\Users\${ ...

  4. Codeforces Round #474-E(树形dp)

    一.题目链接 http://codeforces.com/contest/960/problem/B 二.题意 给定一棵$N$个节点的树,每个节点的权值$V$.定义树中两点$u_1$和$u_m$的权值 ...

  5. django rest_framework 框架的使用03

    rest_framework的 数据解析器 首先需要知道前端发给后端的数据格式头有哪些: media_type = 'application/json' media_type = 'applicati ...

  6. sql 备忘

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; select dbms_metadata.get_ddl('TABLE','TAB ...

  7. Spring MVC 学习 之 - URL参数传递

    在学习 Spring Mvc 过程中,有必要来先了解几个关键参数:    @Controller: 在类上注解,则此类将编程一个控制器,在项目启动 Spring 将自动扫描此类,并进行对应URL路由映 ...

  8. c++类对象 指针区别

    class Test{ public: int a; Test(){ a = ; } }; int main1() { Test* t1 = new Test(); t1->a = ; Test ...

  9. vs配置D3D开发环境

    其实很简单直接上图吧: 主要include和lib目录指定: $(DXSDK_DIR)Include $(DXSDK_DIR)Lib\x86 下面是连接器-输入项: 主要包含: dxgi.libdxg ...

  10. spring学习---day01

    1,Spring Boot项目在启动的时,修改默认图标: 在src/main/resources目录下新建banner.txt文件,然后将自己的图案黏贴进去即可.ASCII图案可通过网站http:// ...