2026/4/17 2:08:59
网站建设
项目流程
网站建设费用计入哪个会计科目,居家网络架构,建筑人才网官网登录,做网站的人第一章#xff1a;为什么安全不能“事后补”#xff1f;1.1 真实代价事件后果XSS 窃取会话用户账号被接管SQL 注入全库数据泄露#xff08;如 2017 Equifax#xff09;IDOR#xff08;越权#xff09;A 用户读取 B 用户的医疗记录无速率限制暴力破解管理员密码原则#…第一章为什么安全不能“事后补”1.1 真实代价事件后果XSS 窃取会话用户账号被接管SQL 注入全库数据泄露如 2017 EquifaxIDOR越权A 用户读取 B 用户的医疗记录无速率限制暴力破解管理员密码原则安全是功能不是附加项。1.2 OWASP Top 102021概览风险本篇覆盖方案A01: Broken Access ControlRBAC 对象级权限校验A02: Cryptographic FailuresHTTPS 安全 JWT 敏感字段脱敏A03: Injection参数化查询 输入验证A04: Insecure Design安全开发生命周期SDLA05: Security Misconfiguration安全头 最小权限原则A06: Vulnerable Components依赖扫描safety / npm auditA07: Identification Failures多因素认证 强密码策略A08: Software Data Integrity未涉及侧重供应链A09: Security Logging日志脱敏 异常行为告警A10: SSRFURL 白名单 禁用内部协议本篇重点解决A01–A07、A09、A10。第二章前端安全加固2.1 防御 XSS跨站脚本风险场景!-- 危险直接渲染用户输入 -- div v-htmluserComment/div安全方案DOMPurify安装npm install dompurify使用// utils/sanitize.ts import DOMPurify from dompurify export const sanitizeHTML (html: string): string { return DOMPurify.sanitize(html, { ALLOWED_TAGS: [b, i, em, strong], // 仅允许安全标签 FORBID_ATTR: [style, onerror] // 禁用危险属性 }) }在组件中template div v-htmlsanitizedComment/div /template script setup langts import { sanitizeHTML } from /utils/sanitize const props defineProps{ comment: string }() const sanitizedComment sanitizeHTML(props.comment) /script注意即使使用 Vue 的{{ }}插值若后端返回 HTML 片段仍需净化。2.2 内容安全策略CSP通过 HTTP 头限制资源加载# nginx.conf add_header Content-Security-Policy default-src self; script-src self unsafe-inline https://cdn.example.com; style-src self unsafe-inline; img-src self data: https:; font-src self; connect-src self https://api.yourdomain.com; frame-ancestors none; # 防点击劫持 object-src none; always;关键指令script-src禁止内联脚本但 Vue 开发模式需unsafe-inline生产应移除connect-src限制 AJAX 请求目标frame-ancestors none防止页面被嵌入 iframe2.3 安全 Cookie 设置虽前端不直接操作 Cookie但需确保后端设置正确Set-Cookie: session_idabc123; HttpOnly; ← 禁止 JS 访问 Secure; ← 仅 HTTPS 传输 SameSiteLax; ← 防 CSRF宽松模式 Path/;注意JWT 通常存于localStorage但更推荐HttpOnly Cookie防 XSS 窃取。第三章后端安全核心实践Flask3.1 防 SQL 注入错误做法# 危险拼接 SQL query fSELECT * FROM users WHERE id {user_id}正确做法参数化查询# SQLAlchemy ORM自动参数化 user User.query.filter(User.id user_id).first() # 原生 SQL显式参数 db.session.execute( text(SELECT * FROM users WHERE id :user_id), {user_id: user_id} )验证用 OR 11测试应返回空或报错。3.2 越权访问控制Broken Access Control场景用户 A 尝试访问/api/users/123/profile123 是用户 B错误实现app.route(/api/users/int:user_id/profile) jwt_required() def get_profile(user_id): # 直接返回未校验当前用户是否为 owner return User.query.get(user_id).to_dict()安全实现app.route(/api/users/int:user_id/profile) jwt_required() def get_profile(user_id): current_user_id get_jwt_identity() # 关键校验资源归属 if current_user_id ! user_id: # 或检查是否为管理员 if not current_user.is_admin: abort(403, Forbidden) return User.query.get(user_id).to_dict()进阶使用对象级权限库如Flask-Principal。3.3 CSRF 防护针对传统表单注意纯 API JWT 通常无需 CSRF因无 Cookie 自动携带但若使用 Session 则需防护。启用 Flask-WTFfrom flask_wtf.csrf import CSRFProtect csrf CSRFProtect(app)前端发送 Token// 从 meta 标签获取 const csrfToken document.querySelector(meta[namecsrf-token]).content; axios.defaults.headers.common[X-CSRFToken] csrfToken;3.4 速率限制防暴力破解安装flask-limiterpip install flask-limiter配置from flask_limiter import Limiter from flask_limiter.util import get_remote_address limiter Limiter( app, key_funcget_remote_address, default_limits[200 per day, 50 per hour] ) app.route(/auth/login, methods[POST]) limiter.limit(5 per minute) # 登录接口严格限制 def login(): # ...策略登录5 次/分钟API100 次/小时/IP管理员接口更严格第四章API 与认证安全4.1 JWT 安全最佳实践风险防御措施Token 泄露短有效期access_token15min refresh_token 安全存储重放攻击使用jtiJWT ID 黑名单Redis 存储已注销 token算法混淆强制指定算法如 HS256拒绝alg: noneToken 注销示例app.route(/auth/logout, methods[POST]) jwt_required() def logout(): jti get_jwt()[jti] # 加入黑名单有效期 原 token 剩余时间 redis.setex(fblacklist:{jti}, expires_in, true) return {msg: Logged out}验证时检查黑名单jwt.token_in_blocklist_loader def check_if_token_revoked(jwt_header, jwt_payload): jti jwt_payload[jti] return redis.exists(fblacklist:{jti})4.2 敏感数据脱敏响应中隐藏密码、身份证等class UserSchema(Schema): id fields.Int() username fields.Str() email fields.Email() # 不输出 password_hash # 身份证部分打码 id_card fields.Method(mask_id_card) def mask_id_card(self, obj): if obj.id_card: return obj.id_card[:6] **** obj.id_card[-4:] return None原则永远不要在日志、响应、前端存储中明文出现敏感字段。第五章安全配置与依赖管理5.1 安全 HTTP 头使用flask-talisman自动设置from flask_talisman import Talisman Talisman(app, force_httpsTrue, strict_transport_securityTrue, content_security_policycsp_policy, # 同前端 CSP referrer_policystrict-origin-when-cross-origin, x_frame_optionsDENY )5.2 依赖漏洞扫描Pythonpip install safety safety check -r requirements.txtNode.jsnpm audit --audit-level highCI 集成GitHub Actions- name: Check Python dependencies run: | pip install safety safety check -r requirements.txt --exit-code策略CI 中发现高危漏洞则失败。第六章自动化安全测试6.1 静态代码分析PythonBanditpip install bandit bandit -r ./app -f json -o bandit-report.json常见检测项硬编码密码不安全的pickle使用未验证的重定向前端ESLint 安全插件npm install -D eslint-plugin-security.eslintrc.jsplugins: [security], rules: { security/detect-object-injection: error, security/detect-non-literal-fs-filename: error }6.2 动态扫描OWASP ZAP启动 ZAP 扫描docker run -t owasp/zap2docker-stable zap-baseline.py \ -t https://your-staging-domain.com \ -r zap-report.htmlCI 集成- name: Run ZAP Baseline Scan run: | docker run --network host -v $(pwd):/zap/wrk:z \ owasp/zap2docker-stable zap-baseline.py \ -t http://localhost:5000 \ -x zap-report.xml注意ZAP 可能触发大量请求仅用于测试环境。第七章渗透测试实战手动验证7.1 测试越权IDOR用用户 A 登录获取其user_id100修改请求为GET /api/users/101/profile预期返回 403而非用户 101 的数据7.2 测试 XSS在用户昵称输入scriptalert(1)/script保存后刷新页面预期脚本不执行仅显示文本7.3 测试 SSRF服务器端请求伪造若应用支持 webhook 或图片抓取POST /api/fetch-image { url: http://169.254.169.254/latest/meta-data } # AWS 元数据预期返回错误禁止访问内网 IP。防御代码from urllib.parse import urlparse import ipaddress def is_safe_url(url): try: result urlparse(url) # 检查是否为内网 IP addr ipaddress.ip_address(socket.gethostbyname(result.hostname)) return not addr.is_private and not addr.is_loopback except: return False第八章CI/CD 安全门禁8.1 GitHub Actions 安全工作流name: Security Scan on: [push, pull_request] jobs: security: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: Setup Python uses: actions/setup-pythonv4 with: { python-version: 3.11 } - name: Install deps run: pip install -r requirements.txt -r requirements-dev.txt - name: Bandit Scan run: bandit -r ./app --exit-zero -f json | tee bandit.json - name: Safety Check run: safety check -r requirements.txt --exit-code - name: ESLint Security run: npm run lint:security - name: Fail on High Risk run: | if grep -q severity: HIGH bandit.json; then echo High risk found!; exit 1 fi效果PR 中若含高危漏洞无法合并。第九章安全开发流程SDL将安全融入开发全周期阶段活动需求威胁建模STRIDE设计安全架构评审编码安全编码规范 SAST测试DAST 渗透测试发布依赖扫描 配置审计运维日志监控 应急响应工具链威胁建模Microsoft Threat Modeling ToolSASTBandit, SemgrepDASTOWASP ZAP, Burp Suite总结构建纵深防御体系