ASP.Net MVC 当中XSS攻击的防范

XSS攻击的防范 什么是XSS攻击? XSS攻击中文为跨站脚本攻击,这种攻击方式分为两种: 被动注入 在被动注入当中,用户将“不干净”的内容输入到文本框中,这些数据又会保存在数据库中,以后又重新在页面上面显示。 主动注入 用户把内容输入到文本框当中,这些内容会立即在屏幕当中显示出来。 MVC中如何阻止XSS攻击? 对所有内容进行HTML编码 只需要在视图当中使用@Html.Encode与@Html.AttributeEncode方法对特性值的编码转换。 对于已经“净化”或者来自信任的数据源,我们可以使用@Html.Raw(Model.HtmlContent)辅助输出。 使用AntiXSS库作为ASP.Net的默认编码器 Install-Packeg AntiXSS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @using Microsoft.Security.Application @{ ViewBag.Title = "HomePage" } @section featured{ <section class="featured"> <div class="title"> <hgroup class="content-wrapper"> <h1>@ViewBag.Title.</h1> <h2 id="welcome-message"></h2> </hgroup> </div> </section> } @section scripts{ @if(ViewBag.UserName != null){ <script type="text/javascript"> $(function(){ var msg = 'Welcome,@Encoder.

ASP.Net MVC4学习 - 初学MVC控制器

什么是控制器? MVC当中的控制器主要负责响应用户的输入,并且在响应的时候修改模型。也就是说在MVC模式当中的控制器需要关注的是应用程序流,输入数据的处理,以及对相关视图输出数据的提供。 控制器的方法 控制器通过URL来响应不同的控制器方法并进行相应的处理。 例如 TestController 内有一个Index()方法。 那么在访问 www.myzony.com/Test 或者 www.myzony.com/Test/Index的时候会自动调用该方法。 控制器参数 我们可以通过对控制器方法添加一个新的参数来动态的响应URL传进来的参数。 1 2 3 4 5 public string Browse(string genre) { string message = HttpUtility.HtmlEncode("你选择的流派是:" + genre); // 通过HTMLEncode可以对传进来的参数进行编码,防止代码注入。 return message; } 我们通过 http://www.myzony.com/控制器名/Browse?Genre=参数1 访问 那么在浏览器会显示: 你选择的流派是:参数1 除此之外控制器默认的会将URL后面这个片段作为参数,传入方法: 1 2 3 4 5 public string Deatils(int id) { string message = "你选择的id是:" + id; return message; } 我们访问 http://www.myzony.com/控制器名/Deatils/5 那么在浏览器会显示: 你选择的id是:5 与视图的交互 控制器与视图的交互主要是通过方法的返回值来呈现新的视图。

EINTR-信号中断与慢系统调用

什么是慢系统调用? 慢系统调用指的是那些可能永远阻塞的系统调用,永远阻塞的系统调用意味着该调用永远无法返回,而多数网络支持函数都属于这一类系统调用。就如同**accept()**函数,如果没有客户连接,那么该调用将会一直阻塞。 读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞。 当打开某些特殊文件时,需要等待某些条件,才能打开。例如:打开中断设备时,需要等到连接设备的modem响应才能完成。 pause和wait函数。pause函数使调用进程睡眠,直到捕获到一个信号。wait等待子进程终止。 某些ioctl操作。 某些IPC操作。 EINTR介绍 早期的Unix系统,如果进程在一个慢系统调用(slow system call)中阻塞时,当捕获到某个信号且相应信号处理函数返回时,这个系统调用被中断,调用返回错误,设置errno为EINTR(相应的错误描述为“Interrupted system call”)。 不同函数产生EINTR错误,所代表的含义也不尽相同。 系统调用函数 errno为EINTR表征的意义 write 由于信号中断,没有成功任何数据。 open 由于信号中断,没有读到任何数据。 recv 由于信号中断返回,没有任何数据可用。 sem_wait 函数调用被信号处理函数终端。 如何处理被中断的系统调用 既然系统调用会被中断,那么别忘了要处理被中断的系统调用。有三种处理方式: 人为重启被中断的系统调用 人为当碰到EINTR错误的时候,有一些可以重启的系统调用要进行重启,而对于有一些系统调用是不能够重启的。例如:accept、read、write、select、和open之类的函数来说,是可以进行重启的。不过对于套接字编程中的connect函数我们是不能重启的,若connect函数返回一个EINTR错误的时候,我们不能再次调用它,否则将立即返回一个错误。针对connect不能重启的处理方法是,必须调用select来等待连接完成。 这里的“重启”怎么理解? 一些IO系统调用执行时,如 read 等待输入期间,如果收到一个信号,系统将中断read, 转而执行信号处理函数. 当信号处理返回后, 系统遇到了一个问题: 是重新开始这个系统调用, 还是让系统调用失败?早期UNIX系统的做法是, 中断系统调用,并让系统调用失败, 比如read返回 -1, 同时设置 errno 为EINTR中断了的系统调用是没有完成的调用,它的失败是临时性的,如果再次调用则可能成功,这并不是真正的失败,所以要对这种情况进行处理, 典型的方式为: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 again: if ((n = read(fd, buf, BUFFSIZE)) < 0) { if (errno == EINTR) goto again; /* just an interrupted system call */ /* handle other errors */ } …… while ((r = read (fd, buf, len)) < 0 && errno == EINTR) /*do nothing*/ ; …… ssize_t Read(int fd, void *ptr, size_t nbytes) { ssize_t n; again: if((n = read(fd, ptr, nbytes)) == -1){ if(errno == EINTR) goto again; else return -1; } return n; } 安装信号时设置 SA_RESTART属性(该方法对有的系统调用无效)

C# Collection 与 Collection

Collection 是集合类的上级接口,继承它的接口主要有set和list. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作。

C# HashTable与HashMap的区别

HashTable的方法是同步的,HashMap的方法是未同步的,所以在多线程场合需要手动同步。 HashTable不允许null值,而HashMap则是允许null值存在的。 HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。 HashTable使用Enumeration,HashMap使用Iterator。 以上只是表面的不同,它们的实现也有很大的不同。 HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。 哈希值的使用不同。 简要区别: Hashtable是Dictionary的子类,HashMap是Map接口的一个实现类。 Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决: 1 Map Collections.synchronizedMap(Map m); 这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
Built with Hugo
主题 StackJimmy 设计