热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
针对指定语言框架和敏感操作,提供安全编码最佳实践与防护建议,确保应用在设计和实现阶段符合安全规范,帮助开发者预防漏洞、提升代码安全性,并支持快速应用到实际开发场景。
以下内容面向 Java 17 / Spring Boot 3(Spring Security 6)应用,在“用户登录与会话管理、密码存储与CSRF”三个关键环节给出可落地的安全设计与实现建议,重点覆盖:Argon2id+盐、强密码策略、登录限速与验证码、2FA、多处会话防护(固定、Cookie 属性、并发、注销)、CSRF 令牌与双重提交、统一错误提示、审计日志与告警。
一、密码存储:Argon2id + 唯一盐 + 可选 pepper
二、登录安全:限速/验证码、统一错误、2FA
三、会话管理:固定攻击、Cookie、并发与注销
四、CSRF 防护:令牌、双重提交、来源校验
五、关键配置与代码示例(Spring Boot 3/Spring Security 6)
六、CSRF 与 CORS 配置注意
七、日志审计与安全告警
八、其他防护要点(设计阶段即落实)
九、上线前检查清单(摘要)
以上实践可直接在 Spring Boot 3/Spring Security 6 项目中落地,覆盖登录与会话管理、密码存储与 CSRF 的核心安全目标,减少被撞库、暴力破解、会话固定、跨站请求伪造等常见风险。
下面给出针对 Node.js 20 / Express 4 的多文件上传与图片处理的安全设计与实现建议,覆盖扩展名白名单、Magic Number 校验、大小/速率限制、隔离存储、随机文件名、杀毒扫描钩子、图像库安全处理、抗 DOS、最小权限、签名直传与回调验签等关键点。目标是让应用在设计与实现阶段即符合安全规范。
一、总体安全设计与数据流
二、允许类型与白名单策略
三、Magic Number/MIME 真值校验
示例关键代码(Busboy + file-type + 隔离存储 + 随机文件名)
const express = require('express'); const Busboy = require('busboy'); const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const { fileTypeFromBuffer } = require('file-type');
const app = express();
// 基本安全头 const helmet = require('helmet'); app.use(helmet({ contentSecurityPolicy: false, crossOriginResourcePolicy: { policy: 'same-site' } })); app.disable('x-powered-by');
// 限流与速率限制(抗DOS) const rateLimit = require('express-rate-limit'); app.use('/upload', rateLimit({ windowMs: 60 * 1000, max: 30, // 每分钟每IP最多30次 standardHeaders: true, legacyHeaders: false }));
// 允许的真实 MIME 映射及扩展名 const ALLOWED = { 'image/jpeg': 'jpg', 'image/png': 'png', 'image/gif': 'gif', 'image/webp': 'webp', 'image/avif': 'avif' }; const MAX_FILE_SIZE = 10 * 1024 * 1024; // 单文件最大10MB const MAX_FILES = 10; // 每请求最多10个文件 const QUARANTINE_DIR = '/var/app/uploads/quarantine'; // 挂载noexec const FINAL_DIR = '/var/app/uploads/images'; // 挂载noexec
function safeJoin(base, target) { const p = path.resolve(base, target); if (!p.startsWith(path.resolve(base) + path.sep)) throw new Error('Path traversal'); return p; }
function randomName(ext) { return crypto.randomUUID().replace(/-/g, '') + (ext ? '.' + ext : ''); }
app.post('/upload', (req, res) => { const busboy = Busboy({ headers: req.headers, limits: { files: MAX_FILES, fileSize: MAX_FILE_SIZE, parts: MAX_FILES + 5, } });
const results = []; let aborted = false;
busboy.on('file', (fieldname, file, filename, encoding, mime) => { if (aborted) return file.resume();
// 扩展名初筛(不信任,但可早拒)
const ext = (path.extname(filename || '').toLowerCase() || '').replace('.', '');
const extOk = Object.values(ALLOWED).includes(ext);
// 预先缓存前16KB用于Magic Number检测
const sniffChunks = [];
let sniffSize = 0;
let typeDetected = null;
let tmpPath = null;
let writeStream = null;
file.on('limit', () => {
aborted = true;
file.unpipe(writeStream);
writeStream && writeStream.destroy();
tmpPath && fs.unlink(tmpPath, () => {});
res.status(413).json({ error: 'File too large' });
});
file.on('data', async (chunk) => {
if (aborted) return;
if (sniffSize < 16 * 1024) {
sniffChunks.push(chunk);
sniffSize += chunk.length;
if (!typeDetected && sniffSize >= 1024) {
const buf = Buffer.concat(sniffChunks);
const ft = await fileTypeFromBuffer(buf).catch(() => null);
if (!ft || !ALLOWED[ft.mime]) {
aborted = true;
file.resume();
res.status(415).json({ error: 'Unsupported file type' });
return;
}
typeDetected = ft;
// 二次比对扩展名(仅作为加分项)
if (extOk && ext !== ALLOWED[ft.mime]) {
// 扩展名与真实类型不一致:以真实类型为准,重命名
}
// 建立隔离区文件
const safeName = randomName(ALLOWED[ft.mime]);
const rel = path.join(crypto.randomUUID().slice(0,2), safeName); // 路径分片
tmpPath = safeJoin(QUARANTINE_DIR, rel);
// 确保目录存在
fs.mkdirSync(path.dirname(tmpPath), { recursive: true, mode: 0o700 });
// 使用 O_NOFOLLOW 防止符号链接
const fd = fs.openSync(tmpPath, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_WRONLY | fs.constants.O_NOFOLLOW, 0o600);
writeStream = fs.createWriteStream('', { fd });
// 将已嗅到的字节写入
writeStream.write(buf);
}
} else {
if (writeStream) writeStream.write(chunk);
}
});
file.on('end', async () => {
if (aborted) return;
if (!typeDetected || !writeStream) {
aborted = true;
res.status(400).json({ error: 'Upload failed or empty file' });
return;
}
writeStream.end();
// 计算哈希用于去重/审计
const hash = await new Promise((resolve, reject) => {
const h = crypto.createHash('sha256');
const rs = fs.createReadStream(tmpPath);
rs.on('data', d => h.update(d));
rs.on('end', () => resolve(h.digest('hex')));
rs.on('error', reject);
});
// 杀毒扫描
const clean = await avScan(tmpPath).catch(() => false);
if (!clean) {
fs.unlink(tmpPath, () => {});
results.push({ fieldname, error: 'Malware detected' });
return;
}
// 搬运到正式存储(不可执行目录)
const finalRel = path.join('images', hash.slice(0,2), randomName(ALLOWED[typeDetected.mime]));
const finalPath = safeJoin(FINAL_DIR, finalRel);
fs.mkdirSync(path.dirname(finalPath), { recursive: true, mode: 0o700 });
fs.renameSync(tmpPath, finalPath);
fs.chmodSync(finalPath, 0o600);
results.push({
fieldname,
mime: typeDetected.mime,
size: fs.statSync(finalPath).size,
hash,
path: finalRel // 存储相对路径,不向客户端暴露真实文件系统路径
});
});
});
busboy.on('finish', () => { if (!aborted) res.json({ files: results }); });
req.pipe(busboy); });
// 示例杀毒扫描钩子(ClamAV) async function avScan(filePath) { // 生产环境建议使用常驻 clamd,提高性能 // 伪代码:可使用 'clamdjs' 或调用 clamdscan return await new Promise((resolve) => { const { spawn } = require('child_process'); const p = spawn('clamdscan', ['--no-summary', filePath], { stdio: 'ignore' }); p.on('exit', (code) => resolve(code === 0)); p.on('error', () => resolve(false)); }); }
四、图像处理安全要点(sharp)
示例处理片段(将隔离区文件管道到 sharp,生成缩略图与标准图): const sharp = require('sharp'); async function processImage(srcPath, destBaseDir, mime) { const base = path.join(destBaseDir, 'processed'); fs.mkdirSync(base, { recursive: true, mode: 0o700 });
sharp.limitInputPixels(80_000_000); const img = sharp(srcPath, { sequentialRead: true }); const extOut = (mime === 'image/png') ? 'png' : 'webp'; const standard = path.join(base, randomName(extOut)); const thumb = path.join(base, randomName(extOut));
await img.clone().rotate().resize({ width: 2048, height: 2048, fit: 'inside', withoutEnlargement: true }) .toFormat(extOut, { quality: 80 }) .toFile(standard);
await img.clone().rotate().resize({ width: 320, height: 320, fit: 'cover' }) .toFormat(extOut, { quality: 70 }) .toFile(thumb);
fs.chmodSync(standard, 0o600); fs.chmodSync(thumb, 0o600); return { standard, thumb }; }
五、抗 DOS 与资源限制
六、存储策略与不可执行隔离
七、随机文件名与可预测性防护
八、最小权限与运行环境
九、签名直传与回调验签(S3 示例)
示例生成预签名(简化,使用 AWS SDK v3):
import { S3Client, CreatePresignedPost } from '@aws-sdk/s3-presigned-post';
const s3 = new S3Client({ region: 'us-east-1' });
app.post('/uploads/presign', async (req, res) => {
// 需鉴权,校验用户配额
const uuid = crypto.randomUUID().replace(/-/g, '');
const key = quarantine/${uuid}.webp; // 服务器决定扩展名或允许客户端传递受限集合
const { url, fields } = await CreatePresignedPost(s3, {
Bucket: process.env.BUCKET,
Key: key,
Conditions: [
['content-length-range', 0, MAX_FILE_SIZE],
['eq', '$Content-Type', 'image/webp']
],
Expires: 300 // 5分钟
});
const nonce = crypto.randomBytes(16).toString('hex');
const hmacSecret = await saveOneTimeSecretForUser(req.user.id, key, nonce); // 用于回调验签
res.json({ url, fields, key, nonce });
});
回调验签示例(简化):
app.post('/uploads/complete', express.json(), async (req, res) => {
const { key, etag, nonce, sig } = req.body;
const secret = await loadOneTimeSecret(key, nonce);
if (!secret) return res.status(400).json({ error: 'Invalid nonce' });
const mac = crypto.createHmac('sha256', secret).update(${key}|${etag}|${nonce}).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(sig))) {
return res.status(401).json({ error: 'Bad signature' });
}
// 读取 S3 元数据二次校验,执行杀毒、类型检查、搬运至正式前缀
// 幂等处理:检查是否已完成
res.json({ ok: true });
});
十、日志与审计
十一、配置与默认值建议
十二、常见陷阱与补充
按以上原则与示例实现,可在 Node.js 20 / Express 4 环境下实现多文件上传与图片处理的安全管控,满足扩展名白名单、Magic Number 校验、大小/速率限制、隔离存储、随机文件名、杀毒扫描钩子、图像库安全处理、抗 DOS、最小权限与签名直传/回调验签等安全目标。
以下建议面向 Python 3.11 / FastAPI,重点围绕数据库读写与查询构建,防止注入与信息泄露,涵盖参数化查询/ORM、最小权限账户、事务与超时、连接池控制、输出编码与转义、防盲注与时间差、统一错误处理、审计追踪、凭证管理等安全目标。
一、数据访问层设计与参数化
示例(SQLAlchemy 2.0 async,参数化与白名单):
二、最小权限账户(数据库层)
三、事务、隔离级别与超时
四、连接池安全与资源上限
五、输入验证、输出编码与转义
六、防盲注与时间差侧信道
七、统一错误处理,不泄露结构信息
八、审计追踪(可证明性与取证)
九、凭证与密钥管理(环境/密管)
十、端到端示例(FastAPI 片段)
十一、其他加固建议
遵循以上设计与实现建议,可在 FastAPI 应用的数据库读写与查询构建中有效防止注入与信息泄露,满足安全编码与应用安全规范。
为开发人员提供敏感操作的安全编码最佳实践,帮助他们确保应用在设计与实现阶段遵循安全规范,降低潜在安全风险。
在日常编码中,通过提示词生成安全指导,有效避免因敏感操作导致的潜在漏洞,提升代码安全性与可维护性。
借助提示词快速审查和优化开发团队的敏感操作处理策略,确保产品符合安全合规要求,降低企业风险。
获取自动化的最佳实践方案,提升团队整体安全编码效率,同时减少安全问题带来的返工成本。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期