CSRF(cross-site request forgery),跨站请求伪装
1.CSRF(cross-site request forgery),跨站请求伪装
顾名思义,用户角度,访问成功并且登录成功我们的网站,没有推出情况下,又访问了病毒网站,于是病毒网站通过用户端,拿着用户的缓存请求我们的网站(尤其是些增删改查的致命操作),于是乎,成功影响了我们的网站,web-died。
登录成功(未退出)
User(A)----------------------->WEB(B)
| | -------------------->
| | 反向通过用户A,请求B网站
| <----------------------------
| |
| |
| 访问 |
-------------------------->WEB(C)病毒网站
确认的一点为:用户能发送请求,携带用户A的cookie数据,但是获取不到。
解决方式:
1.通过生成token值
在用户登录成功网站,会缓存token值存在cookie中,用户下一次的请求,需要携带token值与本地cookie中token值进行比对,如果不通过,则认为是攻击。
2.隐藏令牌
生成的token值,存入http的请求中。
3.Referer认证
Referer是指页面请求验证的意思,如果不是从该页面请求而来,则拒绝访问。
Java代码实现方式:
public class CSRFInterceptor implements Interceptor {
public static final String CSRF_ATTR_KEY = "CSRF_TOKEN";
public static final String CSRF_KEY = "csrf_token";
@Override
public void intercept(Invocation inv) {
//不是 do 开头的,让其通过
//在JPress里有一个共识:只要是 增、删、改的操作,都会用do开头对方法进行命名
if (inv.getMethodName().startsWith("do") == false) {
renderNormal(inv);
return;
}
//从cookie中读取token,因为 第三方网站 无法修改 和 获得 cookie
//所以从cookie获取存储的token是安全的
String cookieToken = inv.getController().getCookie(CSRF_KEY);
if (StrUtil.isBlank(cookieToken)) {
renderBad(inv);
return;
}
//url参数里的csrf_token
String paraToken = inv.getController().getPara(CSRF_KEY);
if (StrUtil.isBlank(paraToken)) {
renderBad(inv);
return;
}
if (cookieToken.equals(paraToken) == false) {
renderBad(inv);
return;
}
renderNormal(inv);
}
private void renderNormal(Invocation inv) {
// 不是 ajax 请求,才需要重置本地 的token
// ajax 请求,需要保证之前的token可以继续使用
if (RequestUtil.isAjaxRequest(inv.getController().getRequest()) == false) {
String uuid = StrUtil.uuid();
inv.getController().setCookie(CSRF_KEY, uuid, -1);
inv.getController().setAttr(CSRF_ATTR_KEY, uuid);
}
inv.invoke();
}
private void renderBad(Invocation inv) {
if (RequestUtil.isAjaxRequest(inv.getController().getRequest())) {
inv.getController().renderJson(Ret.fail().set("message", "bad or mission token!"));
} else {
inv.getController().renderError(403, new TextRender("bad or missing token!"));
}
}
}
CSRF(cross-site request forgery),跨站请求伪装的更多相关文章
- CSRF(Cross Site Request Forgery, 跨站请求伪造)
一.CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患, ...
- 转: CSRF(Cross Site Request Forgery 跨站域请求伪造) 背景与介绍
from: https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/ 在 IBM Bluemix 云平台上开发并部署您的下一个应用 ...
- CSRF(Cross Site Request Forgery, 跨站域请求伪造)
CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的 ...
- CSRF(Cross-site request forgery)跨站请求伪造
CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...
- Cross-site request forgery 跨站请求伪造
Cross-site request forgery 跨站请求伪造 简称为CSRF或者XSRF,通过伪装来自受信任用户的请求来利用受信任的网站 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来 ...
- 浅谈CSRF(Cross-site request forgery)跨站请求伪造
本文目录 CSRF是什么 CSRF攻击原理 CSRF攻击防范 CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack” ...
- CSRF Cross-site request forgery 跨站请求伪造
跨站请求伪造目标站---无知用户---恶意站 http://fallensnow-jack.blogspot.com/2011/08/webgoat-csrf.html https://wiki.ca ...
- CSRF Laravel Cross Site Request Forgery protection¶
Laravel 使得防止应用 遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF "令牌",该令牌用于验证授权用 户和发起请求者 ...
- Django:CSRF(Cross-request forgery)跨站请求伪造
一.CSRF是什么 二.CSRF攻击原理 三.CSRF攻击防范 一.CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Atta ...
- WebGoat学习——跨站请求伪造(Cross Site Request Forgery (CSRF))
跨站请求伪造(Cross Site Request Forgery (CSRF)) 跨站请求伪造(Cross Site Request Forgery (CSRF))也被称为:one click at ...
随机推荐
- 吴裕雄--天生自然C++语言学习笔记:C++ 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 算术运算符 下表显示 ...
- 课堂测试_WEB界面链接数据库
课堂测试_WEB界面链接数据库 一,题目: 一. 考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求 ...
- CCCC L3-015. 球队“食物链”(dfs+剪枝)
题意: 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席突发奇想,希望从中找出一条包含所有球队的 ...
- (1) JVM内存管理:内存模型
引子 一段简单的代码结果引发疑问,==到底比较的是什么?equals呢? public static void main(String args[]){ String s1="abc&quo ...
- 对input type=file 修改样式
效果图先给: 在html中涉及到文件选择的问题,文件选择使用 input(class="filter_input form-control" type="file) 但是 ...
- 吴裕雄--天生自然TensorFlow2教程:张量排序
import tensorflow as tf a = tf.random.shuffle(tf.range(5)) a tf.sort(a, direction='DESCENDING') # 返回 ...
- vue的开发中v-for报错 [vue/require-v-for-key] Elements in iteration expect to have 'v-bind:key' directives.
用的VS Code 工具,安装了vetur插件,报错了如下 [eslint-plugin-vue] [vue/require-v-for-key] Elements in iteration expe ...
- C++ 一般模板友元关系
//一般模板友元关系 #include "stdafx.h" #include <iostream> using namespace std; template< ...
- dp--分组背包 P1757 通天之分组背包
题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大 ...
- .NET微信开发 配置微信公众号基本配置的几种方法
自己最近搞了公众号,记录一下. 目的就是为了在微信公众号里启用服务器配置. 微信文档 其实微信文档已经写得很清楚了,也很简单.(微信的目的就是它发送一个get请求,希望我们能接受一下,然后给微信回个数 ...