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),跨站请求伪装的更多相关文章

  1. CSRF(Cross Site Request Forgery, 跨站请求伪造)

    一.CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患, ...

  2. 转: CSRF(Cross Site Request Forgery 跨站域请求伪造) 背景与介绍

    from:  https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/   在 IBM Bluemix 云平台上开发并部署您的下一个应用 ...

  3. CSRF(Cross Site Request Forgery, 跨站域请求伪造)

    CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的 ...

  4. CSRF(Cross-site request forgery)跨站请求伪造

    CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...

  5. Cross-site request forgery 跨站请求伪造

    Cross-site request forgery 跨站请求伪造 简称为CSRF或者XSRF,通过伪装来自受信任用户的请求来利用受信任的网站 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来 ...

  6. 浅谈CSRF(Cross-site request forgery)跨站请求伪造

    本文目录 CSRF是什么 CSRF攻击原理 CSRF攻击防范 CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack” ...

  7. CSRF Cross-site request forgery 跨站请求伪造

    跨站请求伪造目标站---无知用户---恶意站 http://fallensnow-jack.blogspot.com/2011/08/webgoat-csrf.html https://wiki.ca ...

  8. CSRF Laravel Cross Site Request Forgery protection¶

    Laravel 使得防止应用 遭到跨站请求伪造攻击变得简单. Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF "令牌",该令牌用于验证授权用 户和发起请求者 ...

  9. Django:CSRF(Cross-request forgery)跨站请求伪造

    一.CSRF是什么 二.CSRF攻击原理 三.CSRF攻击防范 一.CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Atta ...

  10. WebGoat学习——跨站请求伪造(Cross Site Request Forgery (CSRF))

    跨站请求伪造(Cross Site Request Forgery (CSRF)) 跨站请求伪造(Cross Site Request Forgery (CSRF))也被称为:one click at ...

随机推荐

  1. kafka源码系列之mysql数据增量同步到kafka

    一,架构介绍 生产中由于历史原因web后端,mysql集群,kafka集群(或者其它消息队列)会存在一下三种结构. 1,数据先入mysql集群,再入kafka 数据入mysql集群是不可更改的,如何再 ...

  2. js 加密解密 TripleDES

    <!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF ...

  3. 通过while循环一步步实现九九乘法表

    # 打印#做出@列的效果height = int(input("height: ")) #用户输入一个高度 num_height = heightwhile num_height ...

  4. 字符输出、if判断

    1.这里学习交互性输入 #input  接受的所有数据都是字符串,即使你输入的是数字,但依然会被当成字符串来处理 #type 用来查看变量存入到内存时的属性 #int 将变量强制转化为整型 #str  ...

  5. 63.Python中contains和icontains

    1. contains: 进行大小写敏感的判断,某个字符串是否包含在指定的字段中,这个判断条件使用大小写敏感进行判断,因此在被翻译成"SQL"语句的时候,会使用"like ...

  6. Eclipse字体及背景色设置和工作空间字符编码设置

    一.字体设置 Window->Preferences->General->Appearance->Colors and fonts->Basic->Text Fon ...

  7. jQuery表格隔行换色和全选的实现

    1.下载jQuery,并导入:https://blog.csdn.net/weixin_44718300/article/details/88746796 2.代码实现: <!DOCTYPE h ...

  8. 如何把控好Essay写作结构

    留学生在国内写过作文,但是对于essay写作到底了解多少呢?大家觉得essay写作太难是语言问题,但是大家要明白,老师对于内容的考察远重于对语言的考察.同学们的essay写作如果能做到言之有理,自圆其 ...

  9. SpringMVC_执行原理

    什么是SpringMVC 概述 Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架. 查看官方文档:https://docs.spring.io ...

  10. OpenStack(四)——使用Kolla部署OpenStack多节点云

    (1).实验环境 主机名 IP地址 角色 内存 网卡 CPU 磁盘 OpenStack-con 192.168.128.110 controller(控制) 8G 桥接网卡ens32和ens33 4核 ...