跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。
- 偷取网站任意数据
- 偷取用户资料
- 劫持前端逻辑
- 显示伪造的文章或者图片
反射型指的是 url 参数直接注入。比如:在浏览器地址栏中
localhost:1521?from=<script>alert(1)</script>Bai存储到数据库后读取时注入。
一个攻击者在论坛的楼层中包含了一段 JavaScript 代码,并且服务器没有正确进行过滤,那就会造在浏览这个页面时会执行这段 JavaScript 代码。
<div>
#{content}
</div>注入点:
<div>
<script>
</script>
</div><img src="#{image}"/>注入点:
<img src="1" onerror="alert(1)"/>其中 1" onerror="alert(1) 就是 #{image} 。这里可看出 <img>多了一个属性 onerror。
<script>
var data="#{data}";
</script>注入点:
<script>
var data="hello";alert(1);"";
</script>其中 hello";alert(1);" 就是 #{data}。这里可看出实际上是即为 data 赋值,也进行了 alert 操作。
富文本需要保留 HTML,但 HTML 存在 XSS 攻击风险。
使用浏览器自带防御可防御一些 XSS。但是存在一些不足:
- 只能对参数出现在 HMTL 内容或属性的反射型 XSS 进行防御
- 并不是所有浏览器都支持对 XSS 的防御
<div>
<script>
</script>
</div>解决:
- 将
<转义为< - 将
>转义为>
转义后:
<div>
<script>
</script>
</div><img src="1" onerror="alert(1)"/>解决:
- 将
"转义为&quto; - 将
'转义为' - 将空格转义为
 
转义后:
<img src="1&quto; onerror=&quto;alert(1)"/><script>
var data="hello";alert(1);"";
</script>解决:
- 将
"转义为\" - 将
\转义为\\ - 或者转化为 json
转义后:
<script>
var data="hello\";alert(1);\"";
</script>CSP 即内容安全策略(Content Security Policy):用于指定哪些内容可执行。
跨站请求伪造(Cross-site request forgery,CSRF),是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。
XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户浏览器的信任。
- 用户登录 A 网站
- A 网站确认身份
- B 网站页面向 A 网站发起请求(带 A 网站身份)
- B 网站向 A 网站请求,带 A 网站 Cookies
- 不访问 A 网站前端
- referer 为 B 网站
- 利用用户登录态
- 用户不知情
- 完成业务请求
利用 Cookie 中新增属性 same-site,禁止第三方网站带 Cookies。但是这样适配性比较差,目前只有 Chrome 支持。
在前端页面加入验证消息,有 2 种方式:
-
验证码
因为 CSRF 攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作。
-
token
例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。
验证 referer。判断请求的来源是否合法。
服务器上的数据库运行非法的 SQL 语句,主要通过拼接来完成。
例如一个网站登录验证的 SQL 查询代码为:
SELECT * FROM users WHERE (name = '${userName}') and (pw = '${passWord}');如果填入以下内容:
userName = 1' OR '1'='1
passWord = 1' OR '1'='1那么 SQL 查询字符串为:
SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');此时无需验证通过就能执行以下查询:
SELECT * FROM users;- 猜解密码
- 获取数据
- 删库删表
- 拖库
- 关闭错误输出(只能在一定程度上增加 SQL 注入的难度,并不能解决 SQL 注入问题)
- 检查数据类型
- 对数据进行转义
- 使用参数化查询(推荐使用)
- 使用 ORM(对象关系映射)
拒绝服务攻击(denial-of-service attack,DoS),亦称洪水攻击,模拟正常用户使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致正常用户无法访问。
- TCP 半连接
- HTTP 连接
- DNS
分布式拒绝服务攻击(distributed denial-of-service attack,DDoS),指攻击者使用两个或以上被攻陷的电脑作为“僵尸”向特定的目标发动“拒绝服务”式攻击。
- 防火墙
- 交换机、路由器
- 流量清洗
- 高仿 IP
- 避免重逻辑业务
- 快速失败快速返回
- 防雪崩机制
- 有损服务
- CDN

