WEB安全问题,是不可忽视的,不管对于前端开发人员还是后台开发人员,或者其他。写这篇文章的意义,在于,分享下自己这5年开发,所接触的或者所了解的安全知识。
前些天,另一个团队的后台,突然问我,黄工,如何处理应用统计点击使用量,防止机器暴力防刷使用量的问题,加上去年底遇到的处理爬虫问题,扫描软件扫出的安全漏洞。因为身处公安行业,所以安全性方面,还是被重视的,所以想着记录分享一下。
xss攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容
前端的角度来处理xss攻击
- xss模块 用法:在提交文本框或者执行点击事件的时候添加。
- html中对于常见字符编码进行转换,如 ‘’< ‘’换为‘’<‘’
- 勿用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)、
- node-xss 模块 用法:在接收前端传递的参数时候使用,如xss(req.body)
- 对于常见字符编码进行转换 如 ‘’< ‘’换为‘’<‘’
- 响应头中设置 X-XSS-Protection: 1; mode=block ,可使用 helmet(注:如果没添加,扫描漏洞软件会扫出)
CSRF攻击
跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
- 使用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编写脚本,运用爬虫进行刷票,并发票达到千万级别,导致我们的平台的无法正常运行。
作为前端负责人,参与了方案讨论。
- 投票的时候开启验证码验证,
- 对数据传输进行加密处理,如AES
此两点措施,让刷票行为的成本和难度大大增加,所以在后续的投票时间里,没有发现刷票行为。
总结
多看,多写,多思考