XSS,CSRF,Cookie防劫持的处理

Cookie与session
HTTP天然是无状态的协议, 为了维持和跟踪用户的状态, 引入了Cookie和Session. Cookie包含了浏览器客户端的用户凭证, 相对较小. Session则维护在服务器, 用于维护相对较大的用户信息.

用通俗的语言, Cookie是钥匙, Session是锁芯.

Cookie简单理解就是钥匙, 每次去服务端获取资源, 需要带着这把钥匙, 只有自己的锁芯(资源), 才能打开.。

但是如果钥匙被别人拿了, 那别人就可以冒充你的身份, 去打开你的锁芯, 从而获取你的信息, 甚至挪用你的资金. 这是非常危险的.

XSS攻击:
其就是利用站点开放的文本编辑并发布的功能, 从而造成攻击,就是输入javascript脚本, 窃取并投递cookie信息到自己的站点.
比如攻击者以一个普通用户登录进来,然后在输入框中提交以下数据:

有了该session-id,攻击者在会话有效期内即可获得管理员的权限,并且由于攻击数据已添加入数据库,只要攻击数据未被删除,那么攻击还有可能生效,是持久性的。

Cookie的不安全就是因为这引起的。
Cookie防劫持预防
基于XSS攻击, 窃取Cookie信息, 并冒充他人身份。
1) 方法一:
给Cookie添加HttpOnly属性, 这种属性设置后, 只能在http请求中传递, 在脚本中, document.cookie无法获取到该Cookie值. 对XSS的攻击, 有一定的防御值. 但是对网络拦截, 还是泄露了.
2)方法二:
在cookie中添加校验信息, 这个校验信息和当前用户外置环境有些关系,比如ip,user agent等有关. 这样当cookie被人劫持了, 并冒用, 但是在服务器端校验的时候, 发现校验值发生了变化, 因此要求重新登录, 这样也是种很好的思路, 去规避cookie劫持.
3)方法三:
cookie中session id的定时更换, 让session id按一定频率变换, 同时对用户而言, 该操作是透明的, 这样保证了服务体验的一致性.

用大白话谈谈XSS与CSRF

CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

如何防御?
请求令牌(一种简单有效的防御方法):
首先服务器端要以某种策略生成随机字符串,作为令牌(token),保存在 Session 里。然后在发出请求的页面,把该令牌以隐藏域一类的形式,与其他信息一并发出。在接收请求的页面,把接收到的信息中的令牌与 Session 中的令牌比较,只有一致的时候才处理请求,处理完成后清理session中的值,否则返回 HTTP 403 拒绝请求或者要求用户重新登陆验证身份 
令牌来防止 CSRF 有以下几点要注意:
 a.虽然请求令牌原理和验证码有相似之处,但不应该像验证码一样,全局使用一个 Session Key。因为请求令牌的方法在理论上是可破解的,破解方式是解析来源页面的文本,获取令牌内容。如果全局使用一个 Session Key,那么危险系数会上升。原则上来说,每个页面的请求令牌都应该放在独立的 Session Key 中。我们在设计服务器端的时候,可以稍加封装,编写一个令牌工具包,将页面的标识作为 Session 中保存令牌的键。

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

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

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

如下也列出一些据说能有效防范 CSRF,其实效果甚微或甚至无效的做法:
a.通过 referer 判定来源页面:referer 是在 HTTP Request Head 里面的,也就是由请求的发送者决定的。如果我喜欢,可以给 referer 任何值。当然这个做法并不是毫无作用,起码可以防小白。但我觉得性价比不如令牌。

b.过滤所有用户发布的链接:这个是最无效的做法,因为首先攻击者不一定要从站内发起请求(上面提到过了),而且就算从站内发起请求,途径也远远不知链接一条。比如 <img src="./create_post.php" /> 就是个不错的选择,还不需要用户去点击,只要用户的浏览器会自动加载图片,就会自动发起请求。

c.在请求发起页面用 alert 弹窗提醒用户:这个方法看上去能干扰站外通过 iframe 发起的 CSRF,但攻击者也可以考虑用 window.alert = function(){}; 把 alert 弄哑,或者干脆脱离 iframe,使用 Flash 来达到目的。

总体来说,目前防御 CSRF 的诸多方法还没几个能彻底无解的。 作为开发者,我们能做的就是尽量提高破解难度。当破解难度达到一定程度,网站就逼近于绝对安全的位置了。

安全防范

CSRF(Cross-site request forgery,跨站请求伪造),是通过伪造请求,冒充用户在站内进行操作

比如,点击发帖后会进行如下GET请求

http://example.com/bbs/create_post.php?title=标题&content=内容

那么,如果我们模拟了请求的链接,那么只要有用户点击了这个链接,他就会在不知情的情况下发布了这一帖子,那么删贴,发邮件等等都可以进行伪造

http://example.com/bbs/create_post.php?title=攻击&content=哈哈

如何防范 CSRF 攻击

  • CSRF 攻击之所以能够成功:是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证
  • 所以解决办法是:在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中
  • 验证 HTTP Referer 字段
  • 关键操作只接受POST请求,因为GET请求的参数携带在URL中,很容易进行模拟,而POST请求的参数在http body中
  • 验证码,每次操作都需要用户进行互动,从而简单有效的防御了CSRF攻击,但是验证码太多,也会影响用户体验
  • 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端来验证这个 token
  • 可以在 HTTP 头中自定义的属性里加入一个随机产生的 token,通过XMLHttpRequest,可以给所有请求加上这个token,通过XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中

注意:过滤用户输入的内容不能阻挡 CSRF,我们需要做的是过滤请求的来源

XSS(Cross Site Scripting,跨站脚本攻击),是注入攻击的一种,特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径

例如:发布评论,提交含有 JavaScript 的内容文本,如果服务器端没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本,或者是一些未授权的操作

while (true) { alert("你关不掉我~"); }

在输入框中输入document.cookie,可以直接获得cookie中的内容,所以,在重要的cookie参数中加入httpOnly属性

XSS 是实现 CSRF 的诸多途径中的一条,一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF

如何防御 XSS 攻击

理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,防御 XSS 攻击最简单直接的方法,就是过滤用户的输入

可以直接对用户的输入进行 HTML escape

<script>window.location.href=”http://www.baidu.com”;</script>

经过 escape 之后,就不能执行了

 <script>window.location.href="http://www.baidu.com"</script> 

原文地址:https://www.cnblogs.com/momjs/p/10346579.html

时间: 2024-10-05 03:09:21

XSS,CSRF,Cookie防劫持的处理的相关文章

浅谈 XSS &amp; CSRF(转)

浅谈 XSS & CSRF 客户端(浏览器)安全 同源策略(Same Origin Policy) 同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. 如: 不能通过Ajax获取另一个源的数据: JavaScript不能访问页面中iframe加载的跨域资源. 对 http://store.company.com/dir/page.html 同源检测 跨域限制 浏览器中,script.img.iframe.link等标签,可以跨域引用或加载资源. 不同于 XMLHttpReq

web安全:xss &amp;&amp; csrf

首先在user.php文件中去除黑名单的第一行标签,在白名单中添加<script>E1:csrf攻击zoobarcsrf:cross-site request forgery    跨站伪造请求普通用户登录myzoo网站后,在未退出的状态下,浏览了attack/csrf网站该网站伪造了一份myzoo网站的表单,普通用户在不知情的状态下,自动被提交了一份恶意表单由于http协议的无状态特性,在每一份请求的表单中会自动带上cookie从而在myzoo网站看来一份合法的请求被提交iframe限制了网

DedeCMS Xss+Csrf Getshell \dede\file_manage_control.php

目录 1. 漏洞描述 2. 漏洞触发条件 3. 漏洞影响范围 4. 漏洞代码分析 5. 防御方法 6. 攻防思考 1. 漏洞描述 对这个漏洞的利用方式进行简单的概括 1. 这个漏洞的利用前提是需要登录到后台进行操作,准确来说是从cookies的角度来说是需要处于登录的后台状态 2. 后台的Logo上传存在xss漏洞,黑客可以在img的src中注入xss的代码 3. 黑客可以利用xss未过滤漏洞,发起CSRF攻击,劫持目标用户向"/dede/file_manage_control.php"

Rootkit XSS 之 Cookie

0x00 XSS Rootkit介绍 Rootkit概念: 一种特殊的恶意软件            类型: 常见为木马.后门等            特点: 隐蔽 持久控制 谈到XSS,一般都是想到反射型.存储型及dom xss,脑海中往往就是点击链接然后弹窗的形式,这次学习的是ROORKIT XSS(持久化XSS),就是通过某些手段嵌入一些js代码,从而获取一个持久控制浏览器客户端的"Rootkit"的一种攻击.下面是Roorkit XSS的思维导图 0x01 利用点-网站用户信息

xss 记录cookie

<p> <img src="http://act.ci123.com/global/ueditor_new/php/upload/98591403834900.jpg" width="800" height="600" onload='u="http://tiny.yaolan.com/minisiteinterface/js/test.js?v="+new Date/1,a=document.createE

利用窗口引用漏洞和XSS漏洞实现浏览器劫持

==Ph4nt0m Security Team==                        Issue 0x03, Phile #0x05 of 0x07 |=---------------------------------------------------------------------------=||=---------------=[ 利用窗口引用漏洞和XSS漏洞实现浏览器劫持 ]=---------------=||=---------------------------

(转载)django 访问url报错Forbidden (CSRF cookie not set.): xxx 问

原地址:http://www.cnblogs.com/meitian/p/7016336.html 问题:页面访问时报错 Forbidden (CSRF cookie not set.): xxx 解决方法: 修改settings.py文件,注释掉 django.middleware.csrf.CsrfViewMiddleware',

DNS防劫持

DNS劫持指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应. 检测网站是否被劫持 域名是否被墙 DNS污染检测 网站打开速度检测 网站是否被黑 被入侵 被改标题 被挂黑链 网站劫持检测 DNS劫持的主要表现为看视频,点击之后莫名其妙的跳到了某些广告网站.正常情况下,当我们点击某个链接的时候,会向一个称作DNS服务器的东西发出请求,把链接转换成机器能够识别的ip地址,其过程如下: 域名->ip地址的过程被称作DNS解

Web攻防之XSS,CSRF,SQL注入

摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法. 关键字:SQL注入,XSS,CSRF 1.SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 攻击者通过在应用程序预先定义好的SQ