面试题答案
一键面试HTTPS证书管理
- 选择证书颁发机构(CA):优先选择知名且受信任的CA,如Let's Encrypt(免费且广泛受信任)、Comodo、DigiCert等,以确保证书被大多数客户端认可。
- 证书类型:
- 对于大型应用,考虑使用通配符证书(Wildcard Certificate),它可以覆盖主域名及其所有子域名,减少证书管理成本。例如,
*.example.com
可以用于api.example.com
、app.example.com
等。 - 多域名证书(Subject Alternative Name, SAN)也是不错的选择,能在一个证书中包含多个不同的域名。
- 对于大型应用,考虑使用通配符证书(Wildcard Certificate),它可以覆盖主域名及其所有子域名,减少证书管理成本。例如,
- 自动化证书更新:使用工具如Certbot实现证书的自动化更新。Certbot可以与Let's Encrypt集成,在证书过期前自动续期,确保HTTPS服务不间断。例如,在Node.js应用的服务器环境中,通过定时任务(如
cron
)运行Certbot的更新脚本。 - 证书存储与保护:将证书文件存储在安全的位置,限制访问权限。例如,在Linux系统中,将证书文件放置在
/etc/letsencrypt/live/your - domain/
目录下,并设置合适的文件权限(如600
,只有文件所有者可读可写)。
跨域资源共享(CORS)配置
- 白名单策略:明确允许跨域请求的来源,避免使用通配符(
*
)。例如,在Node.js应用中使用express - cors
中间件:
const express = require('express');
const cors = require('cors');
const app = express();
const whitelist = ['http://allowed - domain - 1.com', 'https://allowed - domain - 2.com'];
const corsOptions = {
origin: function (origin, callback) {
if (whitelist.indexOf(origin)!== -1 ||!origin) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
}
};
app.use(cors(corsOptions));
- 限制HTTP方法:只允许必要的HTTP方法,如
GET
、POST
、PUT
、DELETE
等。在corsOptions
中可以设置methods
字段:
const corsOptions = {
origin: function (origin, callback) {
// 白名单逻辑
},
methods: ['GET', 'POST', 'PUT', 'DELETE']
};
- 设置响应头:合理设置CORS相关的响应头,如
Access - Control - Allow - Headers
,以限制客户端可以发送的自定义请求头。例如:
const corsOptions = {
origin: function (origin, callback) {
// 白名单逻辑
},
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content - Type', 'Authorization']
};
防止安全漏洞(如XSS、CSRF等)的措施
- 防止XSS(跨站脚本攻击):
- 输入验证与过滤:对所有用户输入的数据进行严格验证和过滤。例如,在Node.js应用中使用
validator - js
库验证输入的邮箱、URL等格式。对于可能包含HTML标签的输入,使用库如DOMPurify
进行清洗,去除恶意脚本。 - 输出编码:在将用户输入输出到页面时,进行适当的编码。例如,在使用模板引擎(如EJS)时,确保对输出内容进行HTML转义。在EJS中,默认会对变量输出进行转义,如
<%= userInput %>
会自动转义userInput
中的特殊字符。 - CSP(内容安全策略):设置Content - Security - Policy响应头,限制页面可以加载的资源来源。例如,在Node.js应用中使用
helmet
中间件设置CSP:
- 输入验证与过滤:对所有用户输入的数据进行严格验证和过滤。例如,在Node.js应用中使用
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", 'https://trusted - script - source.com']
}
}));
- 防止CSRF(跨站请求伪造):
- CSRF令牌:在用户登录或页面加载时,为每个用户生成一个唯一的CSRF令牌,并将其存储在用户会话(session)中。在HTML表单中添加一个隐藏字段包含该令牌,例如:
<form action="/submit - form" method="post">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
<!-- 其他表单字段 -->
<input type="submit" value="Submit">
</form>
在Node.js服务器端,使用中间件(如csurf
)验证提交表单中的CSRF令牌:
const express = require('express');
const csrf = require('csurf');
const app = express();
const csrfProtection = csrf({ cookie: true });
app.use(csrfProtection);
app.post('/submit - form', csrfProtection, function (req, res) {
// 处理表单提交逻辑
});
- Same - Site Cookies:设置
Same - Site
属性为Strict
或Lax
。Strict
模式下,只有在同站点请求时才会发送cookie,Lax
模式允许在一些安全的跨站导航(如链接跳转)时发送cookie。在Node.js中设置cookie时可以添加该属性:
app.get('/set - cookie', function (req, res) {
res.cookie('sessionId', '123456', {
sameSite: 'Lax'
});
res.send('Cookie set');
});