Nancy启用跨站攻击防护(CSRF)

什么是CSRF(跨站攻击)
可能很多人已经对CSRF有所了解,就简单的介绍下:
CSRF全程是 Cross-Site Request Forgery 。大概意思就是在登录用户不知情的情况下,由一个网站对已经登录的另外一个网站发送请求。
为了保证请求是来自我们自己的网站,在表单的隐藏域中添加一个唯一的值,这个值被成为 AntiForgeryToken。
如果你想详细的了解下CSRF,你可以看下百度百科。
CSRF和Nancy
正如Nancy的其他功能,你不可能在默认情况下就能获得一个完整的解决方案。由于Nancy是轻量级、自由开发的,我们还是需要付出一点努力才能使用CSRF防护。
- 在Bootstrapper中启用CSRF防护支持
- 在应用的每一个Form中添加AntiForgeryToken
- 使用Nancy内置的方法ValidateCsrfToken验证CSRF票据
- 处理Nancy无法接收正确票据的请求
启用CSRF
如果没有创建就创建一个NancyDefaultBootstrapper类,添加下面的代码到ApplicationStartup()方法中
Nancy.Security.Csrf.Enable(pipelines);
我们的Bootstrapper如下:
using Nancy;
using Nancy.Bootstrapper;
using Nancy.TinyIoc; namespace NancyCsrfDemo
{
public class Bootstrapper : DefaultNancyBootstrapper
{
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
base.ApplicationStartup(container, pipelines);
Nancy.Security.Csrf.Enable(pipelines);
}
}
}
在表单中添加AntiForgeryToken
如果你采用的是Razor视图引擎,视图文件应该是下面的样子:
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<h1>Welcome to Nancy CSRF Demo, @ViewBag.Name</h1>
<form action="/" method="POST">
Name:<br/>
<input type="text" name="name" value="@ViewBag.Name" />
<input type="submit" />
@Html.AntiForgeryToken()
</form>
</body>
</html>
如果采用的是SSVE (The Super Simple View Engine)
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<h1>Welcome to Nancy CSRF Demo, @Model.Name</h1>
<form action="/" method="POST">
Name:<br/>
<input type="text" name="name" value="@Model.Name" />
<input type="submit" />
@AntiForgeryToken
</form>
</body>
</html>
不管使用那个引擎,都会在表单中生成一个隐藏域
<input type="hidden" name="NCSRF" value="AAEAAAD/////AQAAAAAAAAAMAgAAAD1OYW5jeSwgVmVyc2lvbj0wLjIyLjIuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAYTmFuY3kuU2VjdXJpdHkuQ3NyZlRva2VuAwAAABw8UmFuZG9tQnl0ZXM+a19fQmFja2luZ0ZpZWxkHDxDcmVhdGVkRGF0ZT5rX19CYWNraW5nRmllbGQVPEhtYWM+a19fQmFja2luZ0ZpZWxkBwAHAg0CAgAAAAkDAAAAOrVPNrYs0YgJBAAAAA8DAAAACgAAAAI4qmisW7sYu2FlDwQAAAAgAAAAAsdnVjuuU1fzpb58LEjF1pcK98u9ENMjG0viyxLpvlv/CwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="/>
校验Token
当用户点击按钮的时候,浏览器就会向后台发送 AntiForgeryToken/CSRF 票据。
Nancy有一个内置方法ValidateCsrfToken,这个方法会自动检测隐藏域Request.Form.Ncsrf,如果票据不对会报错异常:CsrfValidationException
异常会默认返回一个500错误,我们需要捕捉这个异常,并进行一些处理:
using Nancy;
using Nancy.Security; namespace NancyCsrfDemo
{
public class HomeModule : NancyModule
{
public HomeModule()
{
Get["/"] = p =>
{
return View["Index"];
}; Post["/"] = p =>
{
try
{
this.ValidateCsrfToken();
}
catch (CsrfValidationException)
{
return Response.AsText("Csrf Token not valid.").WithStatusCode();
} ViewBag.Name = Request.Form.Name;
return View["Index"];
};
}
}
}
这样如果票据没有验证通过的话,用户就会收到一个 403禁止访问错误,而不是500错误。
Nancy启用跨站攻击防护(CSRF)的更多相关文章
- XSS/CSRF跨站攻击和防护方案
Xss(Cross Site Scripting 跨站脚本攻击)/CSRF(Cross-site request forgery 跨站请求伪造),它与著名的SQL注入攻击类似,都是利用了Web页面的编 ...
- 跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险
跨站请求伪造(CSRF)攻击原理解析:比你所想的更危险 跨站请求伪造(Cross-Site Request Forgery)或许是最令人难以理解的一种攻击方式了,但也正因如此,它的危险性也被人们所低估 ...
- SpringSecurity框架下实现CSRF跨站攻击防御
一.什么是CSRF 很多朋友在学习Spring Security的时候,会将CORS(跨站资源共享)和CSRF(跨站请求伪造)弄混,以为二者是一回事.其实不是,先解释一下: CORS(跨站资源共享)是 ...
- XSS与CSRF两种跨站攻击比较
XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery) 在那个年代,大家一般用拼接字符串的方式来构造动态SQL 语 ...
- 总结 XSS 与 CSRF 两种跨站攻击
前言 在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了 ...
- 云锁Linux服务器安全软件安装及防护webshell、CC、XSS跨站攻击设置
无论我们在使用电脑,还是使用VPS/服务器的时候,最为担心的就是服务器是否有安全问题,尤其是网站服务器再遭受攻击的时候如何得到防护.对于大 部分站长用户来说,我们可能只会使用基础的环境,如果真遇到问题 ...
- 总结XSS与CSRF两种跨站攻击
XSS:跨站脚本(Cross-site scripting),实际应是"CSS",但由于和层叠样式表CSS名称冲突,故改为"XSS" CSRF:跨站请求伪造(C ...
- XSS 与 CSRF 两种跨站攻击
在前几年,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式, 但是现在参数化查询 已经成了普遍用法,我们已经离 SQL 注入很远了.但是历史同样悠久的 ...
- XSS与CSRF两种跨站攻击总结
在那个年代,大家一般用拼接字符串的方式来构造动态 SQL 语句创建应用,于是 SQL 注入成了很流行的攻击方式.在这个年代, 参数化查询 [1] 已经成了普遍用法,我们已经离 SQL 注入很远了.但是 ...
随机推荐
- spring cron 定时任务
文章首发于个人博客:https://yeyouluo.github.io 0 预备知识:cron表达式 见 <5 参考>一节. 1 环境 eclipse mars2 + Maven3.3. ...
- 剑指offer第五天
28.数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数 ...
- hihoCoder1319 岛屿周长 (bfs)
思路:从给定坐标开始bfs,将所有联通点标记,然后把每个联通点的四个方向都判断一下,如果这个方向相邻的是一个非联通点说明需要把这条边实在最外围,即周长的一部分. AC代码 #include <s ...
- ACdream1032 Component 树形DP
思路:dp[i][j]表示以i为根结点有j个连通节点的最小和, 当进行状态转移时需要利用01背包,节点u下面有多个子节点,每个子节点可以最多可以贡献cnt[v]个节点,cnt[v]表示以v为根结点的树 ...
- 2017第八届蓝桥杯 K倍区间
标题: k倍区间 给定一个长度为N的数列,A1, A2, - AN,如果其中一段连续的子序列Ai, Ai+1, - Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...
- 【BZOJ3993】 星际战争
Time Limit: 1000 ms Memory Limit: 128 MB Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一 ...
- Subsequence Count (线段树)
Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一个01串 $S_{1 \cdots n}$ 和 $Q$ 个操作. 操作有两种类型: ...
- WPF文本框只允许输入数字
XAML代码 < TextBox Height="23" HorizontalAlignment="Left" Margin="100,5, ...
- mysql常用基础操作语法(六)--对数据排序和限制结果数量的条件查询【命令行模式】
1.使用order by对查询的结果进行排序,asc升序,desc降序: 也可以在order by后指定多个字段名和排序方式进行多级排序: 2.使用limit限制查询结果的数量: 上图中的0,代表查询 ...
- mysql 查询表死锁 和结束死锁的表步骤
1.查询是否锁表 show OPEN TABLES ; 2.查询进程 show processlist 查询到相对应的进程===然后 kill id 3.查看正在锁的事务 SELECT * FR ...