浅谈WEB 安全问题

WEB安全问题,是不可忽视的,不管对于前端开发人员还是后台开发人员,或者其他。写这篇文章的意义,在于,分享下自己这5年开发,所接触的或者所了解的安全知识。

前些天,另一个团队的后台,突然问我,黄工,如何处理应用统计点击使用量,防止机器暴力防刷使用量的问题,加上去年底遇到的处理爬虫问题,扫描软件扫出的安全漏洞。因为身处公安行业,所以安全性方面,还是被重视的,所以想着记录分享一下。

xss攻击

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容

前端的角度来处理xss攻击

  1. xss模块 用法:在提交文本框或者执行点击事件的时候添加。
  2. html中对于常见字符编码进行转换,如 ‘’< ‘’换为‘’&lt‘’
  3. 勿用eval,如
<script>eval(String.fromCharCode(97,108,101,114,116,40,47,120,115,115,47,41));</script>
其作用相当于
<script>alert(/xss/)</script>

后端的角度来处理xss攻击(此处语言为Node.js)、

  1. node-xss 模块 用法:在接收前端传递的参数时候使用,如xss(req.body)
  2. 对于常见字符编码进行转换 如 ‘’< ‘’换为‘’&lt‘’
  3. 响应头中设置 X-XSS-Protection: 1; mode=block ,可使用 helmet(注:如果没添加,扫描漏洞软件会扫出

CSRF攻击

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。

  1. 使用JWT认证, 即前后端通讯,要携带生成的Token.

数据安全问题

在一些场景中,数据是很私密很重要,如即时通讯的聊天内容,如公安行业的一些重要会议。这些都是不允许明文传输的。 即时在登录的时候,前端输入的密码在前端也需要加密,在后台解密,或者其他加密手段。

例如:AES加密算法

AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB

例子:

前端加密:

function encrypt(word){
    var publickey = "46cc793c53dc4511"  //秘钥,长度取决于ase的类型
    var key = CryptoJS.enc.Utf8.parse();     

    var srcs = CryptoJS.enc.Utf8.parse(word);

    var encrypted = CryptoJS.AES.encrypt(srcs, key, {

        mode: CryptoJS.mode.ECB,

        padding: CryptoJS.pad.Pkcs7   //和后端pkcs7 一致

    });

    return encrypted.toString();

}


console.log( encrypt('你好') )

node.js作为后端解密

const crypto = require('crypto');


let decrypt=(data)=>{

    let key = '46cc793c53dc4511';   //长度取决于aes的类型

    let decipher = crypto.createDecipheriv('aes-128-ecb', key,"");

    const buf1 = new Buffer(data,"base64").toString('hex');

    let decrypted = decipher.update(buf1, 'hex', 'utf8');

    decrypted += decipher.final('utf8');

    return decrypted;

  };


console.log( decrypt("6RJhDqqcXtghRvwUFi6VRA==") );

爬虫

在去年的一个政府项目中,有个投票功能,根据ip进行投票,一天只能投一票,发现有几个个团队进行了伪造ip,用python编写脚本,运用爬虫进行刷票,并发票达到千万级别,导致我们的平台的无法正常运行。

作为前端负责人,参与了方案讨论。

  1. 投票的时候开启验证码验证,
  2. 对数据传输进行加密处理,如AES

此两点措施,让刷票行为的成本和难度大大增加,所以在后续的投票时间里,没有发现刷票行为。

总结

多看,多写,多思考

猜你喜欢

转载自blog.csdn.net/qq_32341603/article/details/106406266