常见安全问题
- xss
- csrf
- 点击劫持
- URL跳转漏洞
- SQL注入
- OS命令注入攻击
一、xss 跨站脚本攻击
- 原理:往web页面插入可执行的网页脚本代码
- 防御方式:
1、设置白名单csp
- 方式一:设置
HTTP Header
中的Content-Security-Policy
- 方式二:设置
meta
标签
Content-Security-Policy: default-src “self” // 只允许加载本站资源
Content-Security-Policy: img-src https://* // 只允许加载https协议图片
Content-Security-Policy: child-src “none” // 允许加载任何来源框架
<meta http-equiv = "Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:"/>
2、用户输入值限制
- 将输入输出的内容进行转义,对引号、尖括号、斜杠进行转义
- 转义方法
encode()
方法
3、HttpOnly cookie
- 设置cookie时,将其属性设为HttpOnly,可避免该网页cookie被恶意窃取,保护用户cookie信息
二、CSRF 跨站请求伪造
- 原理:利用用户已登录的身份,在用户毫不知情的情况下,以用户名义完成非法操作
- 防御方式
1、可以对cookie设置,sameSite属性,表示cookie不随跨域请求发送(兼容性不好)
2、通过Referer限制Referer信息,告诉服务器是从哪个页面链接过来的
3、加一个token值用于验证,发请求时在http中加一个随机token
4、验证码操作(体验不好)
三、点击劫持
- 原理:通过iframe透明化,漏出一个按钮诱惑用户点击
- 防御:
1、设置http响应头X-FRAME-OPTIONS
防御iframe点击劫持
参数:
DENY
,表示页面不允许通过iframe的方式展示
SAMEORIGIN
,表示页面可以在相同域名下通过iframe展示
ALLOW-FROM
,表示页面可以在指定来源的iframe中展示
2、通过js方法来判断,来隐藏iframe显示的页面
<script>
if (self == top) {
var style = document.getElementById('click-jack')
document.body.remove(style)
} else {
top.location = self.location
}
</script>
四、url跳转漏洞
- 借助未验证的URL跳转,将应用程序引导到不安全的第三方区域,从而导致的安全问题
- 防御方式
1、referer的限制
如果确定传递URL参数进入的来源,我们可以通过该方式实现安全限制,保证url的有效性,避免恶意用户自己生成跳转链接
2、加入有效性验证token
五、SQL注入
- 本质:数据和代码为未分离,即数据当做了代码来执行
- 影响:获取数据库信息,管理员后台用户名和密码,读取服务器敏感文件等,甚至修改数据库内容
- 防御:
1、严格限制web应用的数据库操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度减少注入攻击对数据库的危害
2、后端代码检查输入的数据是否符合预期,严格限制变量类型,可以使用正则表达式进行一些匹配处理
3、对进入数据库的特殊字符(’, ",空格, <, >, &, ;等)做转义处理或者编码转换,比如lodash escape 库
4、查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数,而不是将用户输入变量嵌入到SQL语句中,即不要直接拼接SQL语句
例:nodejs中的mysqljs库的query方法中?占位参数
六、OS命令注入攻击
- OS命令注入攻击指通过web应用,执行非法的操作系统命令达到攻击目的
- 防御
1、后端对前端提交内容进行规则限制,比如正则表达式
2、在调用系统命令前,对所有传入参数进行命令行参数转义过滤
3、不要直接拼接命令,借助工具拼接、转义预处理
例:nodejs的shell-escape npm 包