面试题之常见网络攻击及防御方法总结(XSS、SQL注入、CSRF攻击)、密码加密问题
目录
背景知识
从互联网诞生之初起,无时无刻不存在网络攻击,其中XSS攻击和SQL注入攻击是网站应用攻击的最主要的两种手段,全球大约70%的网站应用攻击都来自XSS攻击和SQL注入攻击。此外,常用的网站应用攻击还包括CSRF、Session劫持等。
一、XSS 攻击
- 全称跨站脚本攻击 Cross Site Scripting
- 为了与重叠样式表 CSS 进行区分,所以换了另一个缩写名称 XSS
- XSS攻击者通过篡改网页,注入恶意的 HTML 脚本,一般是 javascript,在用户浏览网页时,控制用户浏览器进行恶意操作的一种攻击方式
- XSS 攻击经常使用在论坛,博客等应用中。攻击者可以偷取用户Cookie、密码等重要数据,进而伪造交易、盗取用户财产、窃取情报等私密信息
防御措施
- 过滤一些特殊的字符,比如 javascript 脚本中的 <> 进行转移 <> 再进行存储,这样就能有效的进行 xss 攻击的预防
- 另外如果 cookie 中设置了 HttpOnly 属性,那么通过 js 脚本将无法读取到cookie 信息,这样也能有效的防止 XSS 攻击窃取 cookie 内容
二、SQL 注入
- SQL注入攻击指的是攻击者在 HTTP 请求中注入恶意 SQL 命令,服务器用请求参数构造数据库 SQL 命令时,恶意 SQL 被一起构造,并在数据库中执行,以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等敏感的操作,从而导致数据被随意篡改。
- 但是 SQL注入 攻击,需要攻击者对数据库表有所了解才行,比如你的项目 开源 了,不小心公开了数据库的账号和密码;另外你的网站上线没有 关闭调试模式,有心者可以网站的根据错误回显可以猜测表结构;另外还有就是 盲注,也即是很多有心者会盲猜数据表结构,但是这种难度最大。
防御措施
SQL注入 可以通过预编译手段进行预防,绑定参数是最好的防 SQL 注入方法。现在流行的框架基本都实现了 SQL预编译和 参数绑定,恶意攻击的 SQL 会被当做 SQL 的参数,而不是 SQL 命令被执行。
# 正常获取用户信息的sql
select * from users where id=1
# sql注入了 1 or 1=1,就可以把用户表中的所有数据全部查出,导致数据泄露
select * from users where id=1 or 1=1
老师讲得
怪像1:输对用户名就可以登录成功
怪像2:不需要对的用户名和密码也可以登录成功
SQL注入:利用特殊符合的组合产生特殊的含义 从而避开正常的业务逻辑
select * from userinfo where name='jason' -- kasdjksajd' and pwd=''
select * from userinfo where name='xyz' or 1=1 -- aksdjasldj' and pwd=''
针对上述的SQL注入问题 核心在于手动拼接了关键数据 交给execute处理即可
sql = " select * from userinfo where name=%s and pwd=%s "
cursor.execute(sql, (username, password))
三、CSRF 攻击
CSRF 全称 Cross Site Request Forgery,跨站点请求伪造,攻击者通过跨站请求,以合法的用户身份进行非法操作,如转账交易、发表评论等。其核心是利用了浏览器 Cookie 或服务器的 Session 策略,盗取用户的身份信息
- 在打开 A网站 的情况下,另开 Tab页面 打开恶意 网站B,此时在 B页面 的 恶意意图 下,浏览器发起一个对 网站A 的 HTTP 请求
- 因为之前 A网站 已经打开了,浏览器存有 A网站 中的 Cookie 或其他用于身份认证的信息,这一次被 恶意意图 的请求,将会自动带上这些信息,这将会导致身份劫持,造成并非本人意愿的操作结果
防御措施
对应 CSRF攻击 的防御策略有:表单token、 验证码、Referer 检测 等
四、密码加密问题
hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
加密方式有: md系列,sha系列
md系列
加密流程
# 首先使用python要使用加密数据,必须导入hashlib内置模块
import hashlib
# 1. 先确定你要使用的加密方式: md系列,sha系列
md5 = hashlib.md5() # 指定加密方式
# 2. 进行明文数据的加密
# data = '1234567890dfjkdfhsdjfhdskjfhsdjkfhddddddddddddddddddddddddddddddddds'
data = '45453154'
md5.update(data.encode('utf-8')) # 括号里面加密数据必须是字节类型,bytes类型
"""
1. 被加密的明文数据不管多长,得到的加密串的长度都是固定的
2. 针对md5数据,密文数据能不能倒推出明文数据?
记忆:不能倒推出明文数据
"""
# 3. 取出加密结果
print(md5.hexdigest())
加盐处理(固定加盐(干扰项)处理)
# 1. 先确定你要使用的加密方式: md系列,sha系列
md5 = hashlib.md5() # 指定加密方式
# 2. 进行明文数据的加密
# 2.1 内部在给他添加一个干扰项
random_str = '!@#$%^&dsfsdghdf432534!@#$%%'
data = '123456'
result = random_str + data
md5.update(result.encode('utf-8'))
"""
1. 被加密的明文数据不管多长,得到的加密串的长度都是固定的
2. 针对md5数据,密文数据能不能倒推出明文数据?
记忆:不能倒推出明文数据
"""
# 3. 取出加密结果
print(md5.hexdigest()) # eeb9bad681184779aa6570e402d6ef6c
动态加盐(干扰项)处理
# 1. 先确定你要使用的加密方式: md系列,sha系列
md5 = hashlib.md5() # 指定加密方式
# 2. 进行明文数据的加密
# 2.1 内部在给他添加一个干扰项
import s
random_str = s.get_code(6)
data = '123456'
result = random_str + data
md5.update(result.encode('utf-8'))
"""
1. 被加密的明文数据不管多长,得到的加密串的长度都是固定的
2. 针对md5数据,密文数据能不能倒推出明文数据?
记忆:不能倒推出明文数据
3. 以后我们在写项目的时候,只要牵涉到用的注册与登录,密码都要加密
"""
# 3. 取出加密结果
print(md5.hexdigest()) # eeb9bad681184779aa6570e402d6ef6c
拓展:sha系列
简介
sha (Secure Hash Algorithm)模块与md5的作用相似,用于对信息进行加密。 "Secure Hash Algorithm", 是“安全散列算法”的意思。
sha1 对一段信息进行比较复杂的算法计算,生成一个160位的哈希值密文。sha1 的生成过程比 md5 的生成过程更复杂。
在Python2中,有一个模块就叫 sha,现在也还可以使用,不过我们导入sha模块时,模块名上有一个中划线,说明现在已经不推荐使用 sha 模块了,Python3中已经废弃了。
Python将md5和sha两个模块整理成了一个模块,叫hashlib,兼容Python2和Python3,在Python2和Python3中都可以使用。
使用
# 导入加密模块
import hashlib
# 1. 先确定你要使用的加密方式: md系列,sha系列
sh = hashlib.sha1() # 指定加密方式
# 2. 进行明文数据的加密
# data = '1234567890dfjkdfhsdjfhdskjfhsdjkfhddddddddddddddddddddddddddddddddds'
sh = '45453154'
sh.update(data.encode('utf-8')) # 括号里面加密数据必须是字节类型,bytes类型
"""
1. 被加密的明文数据不管多长,得到的加密串的长度都是固定的
2. 针对md5数据,密文数据能不能倒推出明文数据?
记忆:不能倒推出明文数据
"""
# 3. 取出加密结果
print(sh.hexdigest())