跨站点请求伪造(CSRF)是一种网络攻击方式,攻击者可以利用用户已登录的身份,发送伪造请求,导致用户的数据被篡改、删除或者泄露。在 Web 开发中,为了保护用户的数据安全,通常需要在应用程序中实现 CSRF 保护机制。本文将介绍如何使用 Hapi 实现 CSRF 保护。
CSRF 保护机制
在 Hapi 中,实现 CSRF 保护机制的方式主要有两种:
Token 校验
Token 校验是一种常见的 CSRF 保护机制。在用户登录时,服务器生成一个随机的 Token,并将其存储在用户的会话中。当用户进行操作时,例如提交表单时,服务器会将 Token 作为参数发送给客户端。客户端在提交表单时,需要将 Token 一起提交给服务器。服务器在接收到请求时,会校验 Token 的有效性。如果 Token 无效,则拒绝请求。
SameSite Cookies
SameSite Cookies 是浏览器提供的一种新的 CSRF 保护机制。同源策略限制了浏览器只能将 Cookie 发送给同一域名的服务器。SameSite Cookies 利用了这一特性,将 Cookie 标记为 SameSite,告诉浏览器只有在同一站点内才能发送 Cookie。这样,攻击者就无法在跨站点攻击中利用 Cookie。
Hapi 中的 CSRF 保护
下面我们将介绍如何在 Hapi 中实现 CSRF 保护。
Token 校验
在 Hapi 中实现 Token 校验,需要使用 crumb 插件。crumb 插件会在每个请求中生成一个随机的 Token,并将其存储在用户的会话中。在提交表单时,客户端需要将 Token 一起提交给服务器。服务器在接收到请求时,会校验 Token 的有效性。如果 Token 无效,则拒绝请求。
以下是一个使用 crumb 插件实现 CSRF 保护的示例代码:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const Crumb = require('@hapi/crumb'); const server = Hapi.server({ port: 3000, host: 'localhost' }); const init = async () => { await server.register(Crumb); server.route({ method: 'POST', path: '/submit', options: { plugins: { crumb: true }, handler: (request, h) => { return 'success'; } } }); await server.start(); console.log('Server running on %s', server.info.uri); }; init();
SameSite Cookies
在 Hapi 中实现 SameSite Cookies,需要使用 hapi-auth-cookie 插件。hapi-auth-cookie 插件提供了一种定义 Cookie 策略的方式。在定义 Cookie 策略时,可以指定 Cookie 的 SameSite 属性为 Lax 或者 Strict。Lax 表示只能在跨站点的 GET 请求中发送 Cookie,Strict 表示在任何跨站点请求中都不能发送 Cookie。
以下是一个使用 hapi-auth-cookie 插件实现 CSRF 保护的示例代码:
// javascriptcn.com 代码示例 const Hapi = require('@hapi/hapi'); const HapiAuthCookie = require('@hapi/cookie'); const server = Hapi.server({ port: 3000, host: 'localhost' }); const init = async () => { await server.register(HapiAuthCookie); server.auth.strategy('session', 'cookie', { cookie: { name: 'session', password: 'password-should-be-32-characters', isSecure: true, isHttpOnly: true, path: '/', ttl: 30 * 60 * 1000, domain: 'example.com', sameSite: 'Lax' }, redirectTo: '/login', validateFunc: async (request, session) => { const account = await User.find(session.id); if (!account) { return { valid: false }; } return { valid: true, credentials: account }; } }); server.route({ method: 'POST', path: '/submit', options: { auth: 'session', handler: (request, h) => { return 'success'; } } }); await server.start(); console.log('Server running on %s', server.info.uri); }; init();
总结
在本文中,我们介绍了如何使用 Hapi 实现 CSRF 保护。通过 Token 校验和 SameSite Cookies 两种方式,可以有效地保护用户的数据安全。在实际开发中,需要根据具体情况选择适合的 CSRF 保护机制。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6571277bd2f5e1655d9d9223