想知道如何消灭跨站点请求伪造漏洞?

Posted lingdaima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了想知道如何消灭跨站点请求伪造漏洞?相关的知识,希望对你有一定的参考价值。

Map基础梳理

javascript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。为了解决这个问题,ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object?结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。
例如Map构造函数接受一个数组作为其参数:

const map = new Map([
  [1, ‘网通‘],
  [2, ‘电信‘]
]);
// 0:{1 => "网通"}
// 1:{2 => "电信"}

Map实例的属性和操作方法:

  • size:返回成员总数
  • set(key, value):添加新的键值
  • get(key):读取键对应的值
  • has(key):是否有某个键
  • delete(key):删除某个键
  • clear():清空

Map实例的遍历方法:

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回键值对的遍历器。
  • forEach():遍历 Map 的所有成员。

数组去重(Map):

去重前:[1,5,2,3,4,2,3,1,3,4]
去重后:[1,5,2,3,4]
主要思路:创建一个空Map,遍历原始数组,把数组的每一个元素作为key存到Map中,因为Map中不会出现相同的key值,所以最终得到的Map中的所有key值就是去重后的结果。

function unique(arr) {
  let hashMap = new Map();
  let result = new Array();  // 数组用于返回结果
  for (let i = 0; i < arr.length; i++) {
    if(hashMap.has(arr[i])) { // 判断 hashMap 中是否已有该 key 值
      hashMap.set(arr[i], true);  // 后面的true 代表该 key 值在原始数组中重复了,false反之
    } else {  // 如果 hashMap 中没有该 key 值,添加
      hashMap.set(arr[i], false);  
      result.push(arr[i]);
    }
  } 
  return result;
}

let arr = [1,5,2,3,4,2,3,1,3,4];
console.log(unique(arr)); // [1,5,2,3,4]

**************************************************************


unique = (array) => {
  let map = new Map();
  let result = []
  for (let i = 0; i < array.length; i++) {
    if(map.has(array[i])) { // 判断 map 中是否已有该 key 
      continue
    } else {  // 如果 map 中没有该 key,就加入 result 中
      map.set(array[i], true);  
      result.push(array[i]);
    }
  } 
  return result;
}

缺点:API 太新,旧浏览器不支持。

Set:代码最少

function unique (arr) {
  return Array.from(new Set(arr))
}
let arr = [1,5,2,3,4,2,3,1,3,4];
console.log(unique(arr))
 //[1,5,2,3,4]
let arr = [1,5,2,3,4,2,3,1,3,4];
[...new Set(arr)]
//[1,5,2,3,4]

缺点:API 太新,旧浏览器不支持。

借鉴计数排序的原理

unique = (array) => {
    const hash = []
    for(let i=0;i<array.length; i++){
        hash[array[i]] = true
    }
    const result = []
    for(let k in hash){
        result.push(k)
    }
    return result
}

缺点:只支持数字或者字符串数组,如果数组里面有对象,比如 array = [{number:1}, 2],就会出错。

以上是关于想知道如何消灭跨站点请求伪造漏洞?的主要内容,如果未能解决你的问题,请参考以下文章

CSRFTester - 跨站点请求伪造漏洞测试程序

深入解析跨站请求伪造漏洞:原理剖析

CSRF跨站点请求伪造漏洞问题

深入解析跨站请求伪造漏洞:实例讲解

CSRF | 强大的防御跨站点请求伪造

CSRF(跨站请求伪造)