web网站漏洞防御&安全
web安全
互联网带给我们生活便捷的同时,也伴随着一系列安全问题的产生。
通常我们在上网的时候都会或多或少听说过什么 脚本攻击,行为劫持,传输安全,密码泄露 等一些名词,那么怎么能让我们的网站在部署后能够经受住哪些不法的网络攻击呢,下面让我们一起学习一下这些问题的产生背后和防御的正确姿势吧...
xss攻击
-
发射型攻击
-
内容 (html实体替换)
escapeHTML script
str.replace(/</g,"<")
str.replace(/>/g,">") -
属性 引号问题
str.replace(/"/g,"&quao;")
str.replace(/'/g,)escapeHTML “”
-
js脚本
-
引号问题 & \ 问题
-
转义
\str.replace(/\\/g,"\\\\")
str.replace(/"/g,"\"")
str.replace(/'/g,"\'") -
JSON.stringify(jsDetail)
-
-
富文本 (需要保存html格式,只能过滤filter)
xssFilter去除关键字- 黑名单 正则 进行 replace 一些关键字
str.replace(/<\s*\/?script\s*>/g,"")str.replace(/javascript:[^"']/g,"")...-
白名单
-
cheerio模块 load(类似jquery进行解析html 的dom)
npm install cheerio -Svar xssFilter = function(html){ //白名单 let whiteList={ "img": ['src'], "font": ['color','size'], "a": ['href'] } var cheerio = require('cheerio') let $ = cheerio.load(html) $("*").each(function(index,elem){ // elem {name: , attribs} if(!whiteList[elem.name]){ $(elem).remove() //删除这个标签 return; } // 在白名单里 查看属性 for(let attr in elem.attribs){ if(!whileList[elem.name].indexOf(attr)=== -1){ $(elem).attr(attr,null); //删除属性 } } }) console.log($.html()) return $.html() } -
xss 模块 (github 三方库 设置白名单)
npm install xss-Sxss(html) -
CSP
Content Security Policy
web http协议设置 header头
-
-
-
-
存储型攻击
csrf攻击
csrf条件
- 利用form等请求网站后台接口
- 携带了用户的票据(cookie)
- 进行了非法的业务处理
csrf防范
- cookie(samesite)
- 验证码 (原理:csrf攻击都没有进过前台| npm install ccap)
- token (原理:csrf攻击都没有进过前台)
- referer
cookie问题
cookie 存在被篡改的情况
-
cookie(uid=1) + 签名(签名机制)
-
sessionId
客户端不存储用户数据
-
加密解密
点击劫持问题
原理:iframe + 透明度0
防御: 不允许嵌套iframe
- top.location = window.location
- X-Frame-Options : DENY ( http头协议控制)
TLS(SSL)传输
传统的http传输协议都是明文传输的,故存在被劫持窃听的风险。
使用https协议进行安全升级。先得申请CA证书,其原理如下:
- 验证证书
- 颁发证书
- .出具证书
申请CA证书,http协议更改为https协议:
- 域名获取证书 www.sslforfree.com 去下载证书(域名)
- 域名下的内容验证获取证书
密码安全
密码: 确定用户的唯一身份。
存在密码泄露的风险:
- 数据库被盗(明文)
- web服务器被入侵
- http传输中被窃听
- 内部人员(倒卖用户信息,间谍等)
- 撞库(其他网站用户名,密码和本网站相同)
- 彩虹表
密码 ------ > 密文 (单向变换,无法倒推)
用hash哈希摘要算法: md5 sha1 sha256 sha512等
防御:
-
复杂密码 对抗 彩虹表 等泄露风险
-
salt 加盐(△密码升级)
密文 = md5(sha256(
原始密码+salt))数据库用户表字段设计:
uid用户名 password密文 salt随机盐 ...
-
密码的传输安全
- https
- 登录频率限制(比如 一分钟内1minute 最大 MaxLimit =5 ,错误就lock,设置解锁的未来时间)
- 前端密码加密 md5(userid+suger+password)(js-md5 npm的模块,防止撞库后密码泄露,但比较有限)
-
生物特征密码(私密性 唯一性 ,还是有安全隐患)
- 指纹 唇纹
- 声纹
- 虹膜
- 人脸
密码的加密总体原则:
- 绝对静止明文存储
- 复杂密码
- 加盐salt
- 多次转换md5(sha256(明文密码))
数据库脚本注入
探测注入漏洞: 1‘ and '1' = '1
1‘ and '1' = '0
注入 1‘ or '1' = '1
-
拆解账号密码 mid(version(),3,1) substring()函数
-
获取数据 union
-
删库删表
-
拖库 union
防御方式:
-
关闭错误输出
-
检查数据类型
parseInt(str,10) -
对数据进行转义
escape" select *from user where id=?" , [id] -
参数化 (mysql2)
connection.query.bind(connection)query改为executewireshark工具 验证
上传文件隐患
原理:通过上传后,可以直接访问,执行这个脚本脚本文件
防御:
- 后缀名控制
- 文件类型检查 image/png
- 文件实际内容控制
- 路由规则后,后台处理后返回原文脚本文件
- 设置文件可写可执行互斥
换种思路去控制密码传输隐患
OAUTH思路
申请accessToken,派发票据,携带票据作为身份认证唯一方式,进行敏感数据的传送!
典型案例 :QQ Oauth登录
-
这种思想如何应用到的自己的项目?
敏感数据模块(accessToken派发器) | 业务模块 分离
通过回环线路的携带票据方式进行认证,并获取数据
攻击的防范
-
DOS攻击(DDOS攻击)
时间记:2009.5.19一次dos的攻击,DSN解析服务器下架,暴风音影无限制访问,致使本地网络拥堵,瘫痪, 全国各地当天长时间断网
防御
-
轻的逻辑
-
快速失败快速返回
-
防雪崩现象(不封顶策略)
-
有损服务
-
CDN
-
-
重放攻击(replay)
多次恶意请求同一个URL
防御
- https
- 时间戳(控制过期时间)
- token(session)
- nonce
- 签名
posted on 2018-12-02 16:41 sidney.sun 阅读(83) 评论(0) 收藏 举报
浙公网安备 33010602011771号