首页 > 编程知识 正文

csrf攻击原理,ddos攻击能防住吗

时间:2023-05-05 18:31:22 阅读:150921 作者:1187

CSRF的全名是“跨站点请求挖掘”,XSS的全名是“跨站点脚本”。 虽然看起来有点相似,但这些都是通过跨网站攻击——不攻击服务器端,而是攻击普通接入网站的用户,但如上所述,攻击类型是不同维度上的分类。 CRF顾名思义,是伪造请求,冒充用户在车站内进行通常的操作。

据了解,大部分网站都会通过cookie等识别用户的id并授予许可。 这包括使用服务器端Session的站点。 因为Session ID也经常存储在cookie上。 因此,要伪造用户的正常操作,最好的方法是通过XSS或链接欺诈等方法在用户拥有本机或cookie的浏览器端发起用户不知道的请求。

严格来说,CSRF不能归类为注入攻击。 因为CSRF的实现途径不仅仅是XSS注入。 在XSS中实现CSRF很简单,但在设计不佳的网站上,正常的链接会导致CSRF。

CRF要求伪造,而不是注入攻击,因此不一定需要站内输入。 伪造的账单不一定在车站里,可以是任何来源。 所以我们只有一条路可以走,就是过滤请求的处理者。

CRF顾名思义,是伪造请求,冒充用户在车站内进行通常的操作。 据了解,大部分网站都会通过cookie等识别用户的id并授予许可。 这包括使用服务器端Session的站点。 因为Session ID也经常存储在cookie上。 因此,要伪造用户的正常操作,最好的方法是通过XSS或链接欺诈等方法在用户拥有本机或cookie的浏览器端发起用户不知道的请求。

要完成CSRF攻击,受害者需要按顺序完成两个步骤。

1 .登录受信任的站点a并在本地生成cookie。

2 .不注销a,进入危险网站b。

虽然可以从任何一个请求开始,但开始请求的方式各不相同,iframe、ajax (因为这不能跨越域,所以首先可以从XSS )、Flash内部开始请求)总是存在很大的风险因为几乎没有完全根除CSRF的方法,所以我们的常用做法是通过各种方法提高攻击门槛。

“请求令牌”和“同步令牌”的原理相同,但目的不同。 后者是为了解决POST请求的重复提交问题,前者是为了确保收到的请求一定来自期望的页面。 实现方法非常简单,首先,服务器端通过某种策略生成随机字符串,并将其作为令牌(token )存储在Session中。 然后,在发出请求的页面上,将其令牌以隐藏域的形式,与其他信息一起发出。 在接收到请求的页面中,将接收到的消息中的令牌与Session中的令牌进行比较,只有在一致的情况下才处理请求,否则返回HTTP 403拒绝请求,或者要求用户重新登录认证

大家想知道更深的知识点。 而且很实用。 你可以通过以下链接看到。 目前,许多“”一类APP,(知识星)。

https://t.zsxq.com/F2JAIiu (搜索: php技术交流与共享,加入星球,就能一直了解你想要的知识点) ) ) )。

几种常见攻击类型GET类型的CSRF

这种类型的CSRF一般是程序员的安全意识不强造成的。 GET类型的CSRF的使用非常简单,只需要一个HTTP请求,因此通常用于:

img src=http://wooyun.org/csrf? xx=11 /访问包含此img的页面后,输入http://wooyun.org/csrf? xx=11发出了一次HTTP请求。

因此,用GET型CSRF所在的地址替换该网站,就可以完成攻击。

开机自检类型的CSRF

这种类型的CSRF危害没有GET型大,通常使用自动提交的表单。 例如,以下内容:

formaction=http://woo yun.org/csrf.PHP method=post input type=' text ' name=' xx ' value=' 11 '//formscriptdocumed 这相当于模拟用户完成了一次开机自检操作。

怎么防御?

1 .索要令牌(简单有效的防御方法) :

首先,服务器端通过某种策略生成随机字符串,并将其作为令牌(token )保存在Session中。 然后,在发出请求的页面上,将其令牌以隐藏域的形式,与其他信息一起发出。 在接收到请求的页面中,将接收到的消息中的令牌与Session中的令牌进行比较,只有在匹配时才处理请求,处理完成后清除Session中的值,否则返回到HTTP 403进行请求

要防止令牌出现CSRF,请注意以下事项:

a .请求令牌的原理与认证码相似,但不应该像认证码一样全局使用单个Se

ssion Key。因为请求令牌的方法在理论上是可破解的,破解方式是解析来源页面的文本,获取令牌内容。如果全局使用一个 Session Key,那么危险系数会上升。原则上来说,每个页面的请求令牌都应该放在独立的 Session Key 中。我们在设计服务器端的时候,可以稍加封装,编写一个令牌工具包,将页面的标识作为 Session 中保存令牌的键。

b.在 ajax 技术应用较多的场合,因为很有请求是 JavaScript 发起的,使用静态的模版输出令牌值或多或少有些不方便。但无论如何,请不要提供直接获取令牌值的 API。这么做无疑是锁上了大门,却又把钥匙放在门口,让我们的请求令牌退化为同步令牌。

 

c.第一点说了请求令牌理论上是可破解的,所以非常重要的场合,应该考虑使用验证码(令牌的一种升级,目前来看破解难度极大),或者要求用户再次输入密码(亚马逊、淘宝的做法)。但这两种方式用户体验都不好,所以需要产品开发者权衡。

 

d.无论是普通的请求令牌还是验证码,服务器端验证过一定记得销毁。忘记销毁用过的令牌是个很低级但是杀伤力很大的错误。我们学校的选课系统就有这个问题,验证码用完并未销毁,故只要获取一次验证码图片,其中的验证码可以在多次请求中使用(只要不再次刷新验证码图片),一直用到 Session 超时。这也是为何选课系统加了验证码,外挂软件升级一次之后仍然畅通无阻。

 

2. token验证

在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 
token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。token需要足够随机敏感的操作应该使用POST,而不是GET,以form表单的形式提交,可以避免token泄露。

关于token:

Token 应该被保存起来(放到 local / session stograge 或者 cookies)Tokens 除了像 cookie 一样有有效期,而且你可以有更多的操作方法。一旦 token 过期,只需要重新获取一个。你可以使用一个接口去刷新 token;你甚至可以把 token 原来的发布时间也保存起来,并且强制在两星期后重新登录什么的;如果你需要撤回 tokens(当 token 的生存期比较长的时候这很有必要)那么你需要一个 token 的生成管理器去作检查。Local / session storage 不会跨域工作,请使用一个标记 cookie有需要的话,要加密并且签名 token将 JSON Web Tokens 应用到 OAuth 2

使用token:

1.引入csrf

from flask_wtf.csrf import CsrfProtectcsrf = CsrfProtect()app = Flask(__name__)csrf.init_app(app)app.config['SECRET_KEY']='myblog' 1234567

2.在站内页面上head中,增加token

<meta name="csrf-token" content="{{ csrf_token() }}"> 1

3.配置angular提交表头

app.config(function ($httpProvider) { $httpProvider.defaults.headers.common['X-CSRF-Token'] = $('meta[name=csrf-token]').attr('content');}); 123

4.再次测试跨域post 
后台输出: 
 
前台输出: 

 

3. 提交验证码 
在表单中增加一个随机的数字或字母验证码,通过强制用户和应用进行交互,来有效地遏制CSRF攻击。

 

 

4. 在请求地址中添加 token 并验证

CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,

该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己

的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。

可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,

如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。 这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,

然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数

的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。

而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,

这样就把 token 以参数的形式加入请求了。但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求

都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,

对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,

这种方法就没有作用,还需要程序员在编码时手动添加 token。 该方法还有一个缺点是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,

黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,

并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的

,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,

黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器

Referer 功能的原因。

5. 在 HTTP 头中自定义属性并验证

这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,

而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个

HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest

请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。 然而这种方法的局限性非常大。XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,

并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,

从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,

要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

欢迎各位交流

忧伤的篮球每日会精选一至二篇技术文章发布在微信群,提供给各位交流探讨与学习。考虑到群内讨论内容会导致消息被顶,因此我每天会将分享的内容放在GitHub, 方便后进来的成员以及在线成员查找历史记录,而不需要翻聊天记录。

​链接:微信技术分享记录 

https://github.com/gtcarry888/WeChat-Sharing-record

原则:群内禁止鄙视、讽刺等任何初学者,否则直接踢群,禁止任何业余广告推广。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。