浏览器专题系列 - Web安全

本文涉及的产品
.cn 域名,1个 12个月
简介: 浏览器专题系列 - Web安全

在现代网络中,安全相关的问题是非常繁杂的,种类颇多


这里只介绍Web开发中经常碰到的一些安全问题:


  • SQL注入
  • XSS
  • CSRF
  • 点击劫持
  • 中间人攻击


SQL注入


什么是SQL注入


后台人员使用用户输入的数据进行拼接组装SQL查询语句时,遇到恶意输入就会返回不应该返回的内容


简单示例


普通的查询语句


SELECT * FROM articles WHERE id = $id


1. 客户端发送的正常请求


/api/articlres/article?id = 12


拼接后的SQL


SELECT * FROM articles WHERE id = 12


2. 注入SQL发送的恶意请求


/api/articlres/article?id=1%20or%201=1


这里的 %20是空格经过UrlEncode过后的内容


拼接后的sql


SELECT * FROM articles WHERE id = 12 or 1=1


这样就扩大了查询数据的范围,导致查询异常或者 返回原本不该返回的数据


如何防范


加入过滤和验证机制:


  • 将参数的所有内容当做值,而不是当做字符串的一部分
  • 使用正则表达式过滤传入的参数
  • 检查传入内容是否包含非法的关键字


XSS


什么是 XSS


XSS全称Cross Site Scripting即跨站脚本攻击

攻击者可以将代码注入页面,然后可以进行一系列损害用户利益的事情


  • 窃取Cookie
  • 监听用户行为
  • 修改 DOM 伪造登录表单
  • 在页面中生成浮窗广告
  • 恶意跳转
  • ...


恶意代码未经过滤,与网站正常的代码混在一起,以至于浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行

XSS 可以分为两类:持久型非持久型


持久型


持久型也就是攻击的代码被服务端写入进数据库中,在页面加载的时候执行

常见于服务端渲染的时候出现


示例


<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <title>Document</title>
</head>
<body>
    <script src="./test.js"></script>
</body>
</html>


function renderPage() {
    // ajax获取数据 <script>alert(123)</script>
    // 解析字符串生成对应dom节点
    const script = document.createElement('script')
    script.innerHTML = 'alert(123)'
    document.body.appendChild(script)
}
renderPage()


非持久型


一般通过修改 URL 参数的方式加入攻击代码,诱导用户访问链接从而进行攻击


<!-- http://www.domain.com?name=<script>alert(1)</script> -->
<div>{{name}}</div>  


jquery触发此错误示例


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.0/jquery.min.js"></script>
</head>
<body>
    <h1>大标题</h1>
    <ul id="list"></ul>
    <script src="./test.js"></script>
</body>
</html>


test.js


const data = [
    '1',
    '2',
    '<script>alert(123)</script>'
]
data.forEach(str=>{
    $('#list').append(`<li>${str}</li>`)
})


如何防范

转义字符


不相信任何用户的输入


转译用户输入的内容


function escape(str) {
  str = str.replace(/&/g, '&amp;')
  str = str.replace(/</g, '&lt;')
  str = str.replace(/>/g, '&gt;')
  str = str.replace(/"/g, '&quto;')
  str = str.replace(/'/g, '&#39;')
  str = str.replace(/`/g, '&#96;')
  str = str.replace(/\//g, '&#x2F;')
  return str
}


或者利用现代浏览器的特性

自动处理特殊字符


function filterStr(str) {
    const div = document.createElement('div')
    div.textContent = str
    return div.innerHTML
}
filterStr('<div></div>') // &lt;div&gt;&lt;/div&gt;


CSP


CSP - 内容安全策略

本质上就是建立白名单,明确告诉浏览器哪些外部资源可以加载和执行

可以通过这种方式来尽量减少 XSS 攻击。


使用方式


  • 设置 HTTP Header 中的 Content-Security-Policy
  • 设置 meta 标签的方式 <meta http-equiv="Content-Security-Policy">

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">



上述策略解释


  • 脚本:只信任当前域名
  • <object>标签:不信任任何URL,即不加载任何资源
  • 样式表:只信任cdn.example.org和third-party.org
  • 框架(frame):必须使用HTTPS协议加载
  • 其他资源:没有限制


示例:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Content-Security-Policy"
        content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
    <script src="https://cdn.staticfile.org/jquery/1.10.0/jquery.min.js"></script>
    <title>Document</title>
</head>
<body>
    <h1>测试</h1>
    <script>
        console.log($);
    </script>
</body>
</html>


观察浏览器的devtools面板会发现以下内容


网络异常,图片无法展示
|


阻止第三方域名的脚本资源加载,阻止内联脚本执行


防止脚本读取Cookie


JavaScript提供了访问cookie的API

可以通过document.cookie读取与修改cookie


document.cookie


新增一个cookie


document.cookie = 'sugar=at;expires=session'


执行后我们可以在devtools面板的Application选项卡中看到我们添加的cookie


网络异常,图片无法展示
|


console.log(document.cookie)
// 可以看到我们刚才设置的cookie


网络异常,图片无法展示
|


目前很多统计网站的埋点监控,权限控制,离线数据都依赖于cookie,第三方脚本很容易的能够进行窃取


可以为Cookie添加HttpOnly属性,防止脚本读取网站的cookie


添加Secure属性要求必须使用https协议才能传输此cookie,可以防止中间人截获修改到传输的cookie


CSRF


什么是CSRF


CSRF--Cross-site request forgery--跨站请求伪造

攻击者构造出一个请求链接,诱导用户点击或者通过某些途径自动发起请求

主要利用的cookie会自动附带在请求header中这个特性,很多网站使用cookie鉴权

如果当前用户是在登录状态下请求的此链接的话,服务端就以为是用户在操作,从而进行相应的逻辑


发起手段


  • 自动GET:使用img,link,script等等标签
  • 自动POST:自动提交表单的脚本
  • 诱导用户点击:iframe,a标签,透明的元素等


<img src="http://a.b.com/api/xxx"/>
<link href="http://a.b.com/api/xxx">
<script src="http://a.b.com/api/xxx"></script>
<script>
setTimeout(()=>{
    const $form = document.createElement('form')
    $form.method = 'POST'
    $form.action = 'a.b.com/api/xxx'
    document.body.appendChild($form)
    $form.submit()
    $form.remove()
},0)
</script>


如何防范


  • Get请求不对数据进行修改,即无副作用操作
  • 服务端过滤
  • 阻止第三方网站请求接口
  • 验证request header中的 Referer/Origin:通过Referer验证请求是否为第三方发送
  • Origin:域名信息
  • Referer:包含具体URL
  • 开发者可通过自定义请求头伪造
  • 请求时附带验证信息
  • 添加验证码参数
  • request header中添加一个token字段
  • 阻止第三方网站访问到用户 Cookie
  • 设置Cookie的SameSite属性: Cookie 随跨域请求发送的策略
  • Strict:仅允许一方请求携带 Cookie,即浏览器将只发送相同站点请求的 Cookie,当前网页 URL 与请求目标 URL 完全一致才发送
  • Lax:允许部分(导航到目标网址的 Get 请求)第三方请求携带 Cookie
  • None:无论是否跨站都会发送 Cookie

Cookie相关更多知识-> 本地存储-Cookie


点击劫持


什么是点击劫持


点击劫持是一种视觉欺骗的攻击手段


  1. 攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点击:此种方式最为常见,因为iframe中可以嵌入用户已经登陆过的网页
  2. 使用一个透明的绑定了事件元素附在正常元素上,诱导用户点击


如何防范

1. X-FRAME-OPTIONS


针对iframe形式的可通过设置X-FRAME-OPTIONS

X-FRAME-OPTIONS 是一个 HTTP 响应头


该响应头有三个值可选,分别是:


  • DENY,表示页面不允许通过 iframe 的方式展示
  • SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示
  • ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示


2. JS 防御


  • window.self: 当前 window 对象的引用
  • window.top: 最顶层的窗口对象
  • window.parent: 当前窗口的直接父对象


在页面中加入此代码


<head>
  <style id="click-jack">
    html {
      display: none !important;
    }
  </style>
</head>
<body>
  <script>
    if (self === top) {
      var style = document.getElementById('click-jack')
      document.body.removeChild(style)
    } else {
      top.location = self.location
    }
  </script>
</body>


中间人攻击


什么是中间人攻击


  • 中间人攻击是攻击方同时与服务端客户端建立起了连接,并让对方认为连接是安全的
  • 攻击者不仅能获得双方的通信信息,还能修改通信信息


场景举例:使用非对称加密传输的数据


  1. 中间人已经同时与客户端与服务端建立了链接
  2. 服务端下发公钥a1,中间人截获,然后下发自己的公钥b1
  3. 客户端接收到公钥b1,对传输的数据 “你好” 加密成 “xxx”,然后发送给服务端
  4. 中间人收到数据 “xxx”,用自己的私钥B解密获得内容 “你好”,然后用截获的a1公钥 加密 内容“滚滚滚”成 “yyy”,发送给服务端
  5. 服务端收到内容 “yyy” 用自己的私钥A解密 得到 “滚滚滚”的内容

在这个过程中,中间人不仅获取了用户传输的真实数据,还给服务的发送了错误的信息


如何防范


  • 使用https
  • 不要在公共Wi-Fi上发送敏感数据
  • 使用权威机构的CA证书


参考



原文首发于个人博客,专题系列会整理多篇,与大家一起学习,共同进步,如有错误,还请斧正


浏览器专题系列文章


相关文章
|
9天前
|
人工智能 前端开发 计算机视觉
Inpaint-Web:纯浏览器端实现的开源图像处理工具
在刷短视频时,常看到情侣在景区拍照被路人“抢镜”,男朋友用手机将路人“P”掉,既贴心又有趣。最近我发现了一个纯前端实现的开源项目——inpaint-web,可在浏览器端删除照片中的部分内容,非常酷。该项目基于 WebGPU 和 WASM 技术,支持图像修复与放大,已在 GitHub 上获得 5.1k Star。项目地址:[GitHub](https://github.com/lxfater/inpaint-web)。
48 3
 Inpaint-Web:纯浏览器端实现的开源图像处理工具
|
19天前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
38 1
|
22天前
|
安全 前端开发 Java
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第26天】Web安全是现代软件开发的重要领域,本文深入探讨了XSS和CSRF两种常见攻击的原理及防御策略。针对XSS,介绍了输入验证与转义、使用CSP、WAF、HTTP-only Cookie和代码审查等方法。对于CSRF,提出了启用CSRF保护、设置CSRF Token、使用HTTPS、二次验证和用户教育等措施。通过这些策略,开发者可以构建更安全的Web应用。
60 4
|
21天前
|
安全 Go PHP
Web安全进阶:XSS与CSRF攻击防御策略深度解析
【10月更文挑战第27天】本文深入解析了Web安全中的XSS和CSRF攻击防御策略。针对XSS,介绍了输入验证与净化、内容安全策略(CSP)和HTTP头部安全配置;针对CSRF,提出了使用CSRF令牌、验证HTTP请求头、限制同源策略和双重提交Cookie等方法,帮助开发者有效保护网站和用户数据安全。
49 2
|
23天前
|
存储 安全 Go
Web安全基础:防范XSS与CSRF攻击的方法
【10月更文挑战第25天】Web安全是互联网应用开发中的重要环节。本文通过具体案例分析了跨站脚本攻击(XSS)和跨站请求伪造(CSRF)的原理及防范方法,包括服务器端数据过滤、使用Content Security Policy (CSP)、添加CSRF令牌等措施,帮助开发者构建更安全的Web应用。
55 3
|
25天前
|
SQL 安全 Go
PHP在Web开发中的安全实践与防范措施###
【10月更文挑战第22天】 本文深入探讨了PHP在Web开发中面临的主要安全挑战,包括SQL注入、XSS攻击、CSRF攻击及文件包含漏洞等,并详细阐述了针对这些风险的有效防范策略。通过具体案例分析,揭示了安全编码的重要性,以及如何结合PHP特性与最佳实践来加固Web应用的安全性。全文旨在为开发者提供实用的安全指南,帮助构建更加安全可靠的PHP Web应用。 ###
33 1
|
29天前
|
Kubernetes 安全 应用服务中间件
动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
动态威胁场景下赋能企业安全,F5推出BIG-IP Next Web应用防火墙
47 3
|
1月前
|
Web App开发 XML JavaScript
Python 操作浏览器:让 Python 和 Web 世界合二为一
Python 操作浏览器:让 Python 和 Web 世界合二为一
|
1月前
|
缓存 安全 JavaScript
掌握JAMstack:构建更快、更安全的Web应用
JAMstack 是一种现代 Web 开发架构,结合 JavaScript、APIs 和 Markup,创建更快、更安全的 Web 应用。其核心优势包括高性能、安全性、可扩展性和易维护性。JAMstack 通过预构建静态页面和 API 实现高效渲染,利用静态站点生成器如 Gatsby 和 Next.js,并借助 CDN 和缓存策略提升全球访问速度。尽管面临复杂交互、SEO 和数据更新等挑战,但通过 Serverless Functions、预渲染和实时 API 更新等方案,这些挑战正逐步得到解决。
|
2月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
133 5