xb18
xb18
文章39
标签0
分类0
前端安全

前端安全

XSS

跨站脚本攻击(全称Cross Site Scripting,为和CSS(层叠样式表)区分,简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码(也可能包含html代码),当用户浏览网页之时,嵌入其中Web里面的javascript代码会被执行,从而达到恶意攻击用户的目的。XSS是攻击客户端,最终受害者是用户,当然,网站管理员也是用户之一。

XSS漏洞通常是通过php的输出函数(echo)将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。

XSS有三类:反射型XSS(非持久型)、存储型XSS(持久型)和DOM XSS

防御:

XSS 来源于用户提供的内容,只要过滤掉其中的输入的恶意代码即可。

不信任用户的输入;编码;

CSRF

跨站请求伪造

1)原理是:浏览器机制,用户访问一个url就会带上对应域名的cookie,这就方便了CSRF;此时cookie有效;

2)get和post攻击:

1、get攻击:若是服务器接受get请求

用户登录银行网站后,用户没有退出网站,就点击恶意网站图片或隐藏的iframe,然后src为https://bank.com/zhuanzhang?to=111&fee=222,这样恶意网站伪造的请求就携带银行cookie请求成功了;

2、post攻击

构造一个点击按钮,触发js提交post;例如隐藏一个iframe,target指向隐藏iframe,填入input内容,js触发submit,诱导用户点击按钮,提交请求,例如关闭广告按钮等等

3)防御

使用完后退出正常网站登录;

refer校验,对请求来源网址校验;

增加手机验证码;

token防御:每次生成随机字符串,设置隐藏,提交的时候会带上token,服务端校验token是否正确,伪造的网站是不会拿到token的

加密

RSA非对称加密、md5加密

ddos

加签

AES对称加密

对称加密:如AES,DES,3DES

含义:加密和解密使用的是同一把钥匙。密钥不能在网络中传输,避免被拦截。如果要传输,必须要对密钥进行非对称加密再加密一次。

优点:算法简单,加密解密容易,效率高,执行快。

缺点:相对来说不算特别安全,只有一把钥匙,密文如果被拦截,且密钥也被劫持,那么,信息很容易被破译。

非对称加密:如RSA DSA RCC

含义:有两个钥匙,及公钥(Public Key)和私钥(Private Key)。公钥和私钥是成对的存在,如果对原文使用公钥加密,则只能使用对应的私钥才能解密。通过私钥经过一系列算法是可以推导出公钥的,但是无法通过公钥反向推倒出私钥,这个过程的单向的。

优点:安全,即使密文被拦截、公钥被获取,但是无法获取到私钥,也就无法破译密文。作为接收方,务必要保管好自己的密钥。

缺点:加密算法及其复杂,安全性依赖算法与密钥,而且加密和解密效率很低。

AES:AES(高级加密标准)是一种对称加密算法,即加密和解密使用相同的密钥。它可以加密长度为128、192和256位的数据块,并使用128位的密钥进行加密。AES算法使用了固定的块长度和密钥长度,并且被广泛应用于许多安全协议和标准中,例如SSL/TLS、SSH、IPSec等。

https://cryptojs.gitbook.io/docs/#ciphers

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import CryptoJS from 'crypto-js'

// ------------AES-------------

function getAesString(data, key, iv) { //加密
let keys = CryptoJS.enc.Utf8.parse(key)
let vis = CryptoJS.enc.Utf8.parse(iv)
// CryptoJS.AES.encrypt(data, 'xxxxxxxxxxxxx');
let encrypt = CryptoJS.AES.encrypt(data, keys, {
iv: vis, //iv偏移量 CBC需加偏移量
mode: CryptoJS.mode.CBC, //CBC模式
// mode: CryptoJS.mode.ECB, //ECB模式
padding: CryptoJS.pad.Pkcs7 //padding处理
});
// debugger
return encrypt.toString(); //加密完成后,转换成字符串
}

function getDAesString(encrypted, key, iv) { // 解密
var key = CryptoJS.enc.Utf8.parse(key);
var iv = CryptoJS.enc.Utf8.parse(iv);
var decrypted =CryptoJS.AES.decrypt(encrypted,key,{
iv:iv,
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}

// AES 对称秘钥加密
const aes = {
en: (data, key) => getAesString(data, key.key, key.iv),
de: (data, key) => getDAesString(data, key.key, key.iv)
};
// BASE64
const base64 = {
en: (data) => CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data)),
de: (data) => CryptoJS.enc.Base64.parse(data).toString(CryptoJS.enc.Utf8)
};
// SHA256
const sha256 = (data) => {
return CryptoJS.SHA256(data).toString();
};
// MD5
const md5 = (data) => {
return CryptoJS.MD5(data).toString();
};

export { aes, md5, sha256, base64 };

Encoders

CryptoJS can convert from encoding formats such as Base64, Latin1 or Hex to WordArray objects and vice-versa.

1
2
var words = CryptoJS.enc.Base64.parse("SGVsbG8sIFdvcmxkIQ==");
var base64 = CryptoJS.enc.Base64.stringify(words);
本文作者:xb18
本文链接:http://xb18.github.io/2023/10/15/%E5%89%8D%E7%AB%AF%E5%AE%89%E5%85%A8/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可