首页 新闻 会员 周边 捐助

CSRF攻击求解答

0
悬赏园豆:50 [已解决问题] 解决于 2020-03-25 09:26

网上搜了好多,感觉都不符合我所需要的。

在我看来,防止此攻击的本质就是前后端均设置一个生成随机数的方法,进行值匹配,同时这个随机数的生成规律不被他人掌握。

比如前端每次请求均会携带一个随机key,key=func(param)。param的组成有两个,

1.后端也能获取到的相同参数,比如请求的浏览器信息

2.用于随机数生成的参数,比如时间

两者组件如何生成随机key的函数是个性化的,也就是不公开的。

那现在的问题是随机数的参数如果定为时间,那么后端生成key时的时间与前端生成key的时间应该要一致的。

现实是前端调用func的时间跟后端获取到请求再调用func的时间是有一定时间差的。

这就导致了我的问题:前后端匹配不了这个随机数。

当然简单的解决:把时间参数设置粗一点,比如以分钟为单位,这样也能保证大部分情况下前后端的时间参数能一致。

但,现在这个安全问题是项目点抛出来的,他们用工具来测试的,所以一分钟显得还是略长。

跪求解答。感激

大兄弟竹子的主页 大兄弟竹子 | 初学一级 | 园豆:55
提问于:2020-02-13 18:36

@dudu 嘟嘟站长,貌似没有@功能- -

大兄弟竹子 4年前
< >
分享
最佳答案
0

可以参考微软 MVC 的设计思路,每次请求包含表单的页面时会由服务器生成一对 Token,其中一个放进表单的隐藏输入框,提交表单时会一起带回去(也可以放进请求头部),另一个放进 cookie,也会在提交表单时带回去。在验证时会同时解码表单 token 和 cookie token,确认这两个 token 是一对以后验证通过,继续走请求处理,否则直接返回错误页面。两个 token 都是服务器生成,微软使用只有后端知道的加密方案进行加密,防止前端篡改,每对 token 都是一次性的。
至于生成方式和校验,微软有一整套配套方案,使用起来相当方便,你可以参考看看自己实现一套。
MVC 的 Razor 视图引擎有种东西叫 Html助手(.Net Core 升级为 标签助手),在渲染引擎渲染表单标签时会自动调用 token 服务生成 token 并把表单 token 自动写入隐藏输入框,而 cookie token 会由 token 服务在生成时自动插入响应 cookie。在提交表单后请求处理管道中有一个管道步骤专门负责验证 token(可以通过全局设置或特性标记某个请求是否需要验证,比如默认情况下所有 get 请求不验证 token,Razor Page 的 post 请求自动要求验证 token),如果验证失败则直接返回失败响应,不再继续走管道中的剩余步骤。这个自动化程度相当高,如果你想自己实现这种级别的自动化成本很高,但相应的,安全性也相当高,如果跨域伪造请求,cookie 不会自动带回,且跨域 cookie 会被浏览器限制,同域伪造请求也会因为没有表单 token 而失败。这里是一对步骤,get 表单页面时自动写入 token,post 表单数据时自动验证,没有 get 这个步骤就没有 token,单独伪造 post 请求也没用。

收获园豆:50
coredx | 小虾三级 |园豆:683 | 2020-02-23 00:01
其他回答(3)
0

CSRF 后端可以根据 refer 来判断拦截,使用token和cookie双重验证。

muamaker | 园豆:763 (小虾三级) | 2020-02-14 14:06

有啥用呢,都能直接伪造的。你说的就是我前面提到的百度一搜就搜到的解决不了问题的东西。

支持(0) 反对(0) 大兄弟竹子 | 园豆:55 (初学一级) | 2020-02-14 15:43
0

token從前端產生就沒有意義了
隨便什麼人都可以把你的方法抄走
應該由後端產生給前端
前端發送請求時一起送回
用過即丟

RosonJ | 园豆:4910 (老鸟四级) | 2020-02-15 13:25

这是对的,最好是每次请求前先请求后端生成token。
但我也没个完整的思路,如何每次请求前发请求后端获取token呢?

支持(0) 反对(0) 大兄弟竹子 | 园豆:55 (初学一级) | 2020-02-18 19:44

“你的方法抄走”,这个前端方法本质是不保险的,但是起码也通过项目的安全测试。

支持(0) 反对(0) 大兄弟竹子 | 园豆:55 (初学一级) | 2020-02-18 19:45
0

后端产生token,前端使用token,也没必要用过就扔,可以重新登录生成新的token,如果可以的话,前端利用一些其他的参数时间进行token加密并一同返回给后端,后端进行解密,得到token,并判断时间是否在合理范围内,前端js进行压缩加密,都差不多,只是为了增加干扰用的。如果实在想破除,你拦不住,只不过成本就拉高了

你说累不累 | 园豆:200 (初学一级) | 2020-02-21 17:42

也有其他的方法就是安装自定义的证书,证书内容自定义,浏览器请求时,服务器反向验证电脑是否安装了正确的证书,并对证书内容进行修改,这样就只有服务器知道能不能成功了

支持(0) 反对(0) 你说累不累 | 园豆:200 (初学一级) | 2020-02-21 17:50

说白了就是在电脑是安装了辅助程序,如果没有这个程序服务器根本不理你请求的是啥,当然也就极的降低了风险

支持(0) 反对(0) 你说累不累 | 园豆:200 (初学一级) | 2020-02-21 17:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册