这里主要记录在平常中对知识的学习,经过结合笔记与自身理解的方式尝试写下总结
文章对细节可能不会一一介绍解释,内容仅做参考
复制代码
最近几天面试都有被提到关于前端安全的了解,虽然以前看过,但只能说出个大概。趁着还记得感受学习一波~javascript
前端安全常见的攻击方式有两种:XSS(CRoss Site Scripting 跨站脚本攻击)、CSRF(Cross-site request forgery 跨域请求伪造)css
为了控制篇幅~今天先写XSShtml
原理:程序+数据=结果,然而数据里面包含了程序,致使结果运行,而不仅仅是展现前端
XSS能够作:java
XSS攻击可能的注入点(均是写入可执行脚本的方式):node
XSS是发生在目标用户的浏览器层面上的,当渲染DOM树的过程成发生了不在预期内执行的JS代码时,就发生了XSS攻击。 跨站脚本的重点不在‘跨站’上,而在于‘脚本’上。大多数XSS攻击的主要方式是嵌入一段远程或者第三方域上的JS代码。其实是在目标网站的做用域下执行了这段js代码web
反射型XSS,也叫非持久型XSS,是指发生请求时,XSS代码出如今请求URL中,做为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行 (通过服务器,不通过数据库)面试
从概念上能够看出,反射型XSS代码是首先出如今URL中的,而后须要服务端解析,最后须要浏览器解析以后XSS代码才可以攻击数据库
举个栗子:express
<textarea name="txt" id="txt" cols="80" rows="10">
<button type="button" id="test">点我</button>
复制代码
let test = document.querySelector('#test')
test.addEventListener('click', function () {
// 1. 发送一个GET请求
let url = `/test?test=${txt.value}`
let xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
// 3. 客户端解析JSON并执行
let str = JSON.parse(xhr.responseText).test
let node = `${str}`
document.body.insertAdjacentHTML('beforeend', node)
} else {
console.log('error', xhr.responseText)
}
}
}
xhr.open('GET', url, true)
xhr.send(null)
}, false)
复制代码
var express = require('express');
var router = express.Router();
router.get('/test', function (req, res, next) {
// 2. 服务端解析成JSON后响应
res.json({
test: req.query.test
})
})
复制代码
启一个web服务器,而后设置请求接口。经过Ajax的GET请求将参数发往服务器,服务器解析成json后响应。将返回的数据解析后显示到页面上(没有对返回的数据进行解码和过滤等操做)
此时咱们往textarea输入一段带有攻击目的的文本:'<img src="null" onerror='alert(document.cookie)' />'
而后点击按钮,一个XSS攻击就发生了,页面会alert出cookie信息
实际上,咱们只是模拟攻击,经过alert获取到了我的的cookie信息。可是若是是黑客的话,他们会注入一段第三方的js代码,而后将获取到的cookie信息存到他们的服务器上。这样的话黑客们就有机会拿到咱们的身份认证作一些违法的事情了
存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不论是数据库、内存仍是文件系统等),而后在下次请求页面的时候就不用带上XSS代码了 (通过服务器,通过数据库)
最典型的就是留言板XSS:用户提交了一条包含XSS代码的留言到数据库,当目标用户查询留言时,那些留言的内容会从服务器解析以后加载出来,浏览器发现有XSS代码,就当作正常的HTML和JS解析执行。XSS攻击就发生了
从以上的反射型和DOM XSS攻击能够看出,咱们不能原样的将用户输入的数据直接存到服务器,须要对数据进行一些处理。以上的代码出现的一些问题以下:
解决方法以下:
对cookie的保护
对重要的cookie设置httpOnly,防止客户端经过document.cookie读取cookie。服务端能够设置此字段
对用户输入数据的处理