如何使用 Hapi.js 解决 CSRF 攻击

阅读时长 4 分钟读完

什么是 CSRF 攻击

CSRF(Cross-site request forgery)即跨站请求伪造,是一种网络攻击方式。攻击者利用受害者已经登录了的身份,来进行非法的操作,比如发邮件、发消息、盗取用户资料等,从而达到攻击的目的。

一般情况下,用户在访问正常网站的时候会保持已经登录的状态,而访问不正当的或者是各种攻击网站的时候,也可能带着恶意代码,攻击者就可以伪造一些正常网站的请求,让用户在不知情的情况下执行恶意操作。

CSRF 攻击的原理

攻击者首先在自己的网站上构造出一个恶意的请求链接,并保存在自己的网站上。

当用户访问攻击者的网站时,攻击者会将恶意请求链接伪装成一个正常的请求链接,放在网页中,诱导用户点击。

一旦用户点击了这个链接,就会按照攻击者的设计,向目标网站发送http请求。由于此时用户已经登录了目标网站,故服务器会认为这个请求是合法的,就会按照请求中的参数执行操作。

最终,攻击者通过伪造请求,达到非法操作的目的。

如何使用 Hapi.js 防范 CSRF 攻击

Hapi.js 是一款 Node.js 的框架,提供了一些防止 CSRF 攻击的工具,这些工具在 Hapi.js 中称为 plugins。

Hapi.js 中防范 CSRF 攻击的 plugin 为 crumb。它将生成一系列的 csrf 标志,用于验证客户端和服务器之间的请求。在用 post 方式提交表单时,客户端先请求服务器的 get 请求,来获得 CSRF Token,然后在请求中携带这个 Token,保证表单来源的可信性。

以下是使用 Hapi.js 中的 crumb 插件进行防范 CSRF 攻击的示例代码:

Step 1:安装 crumb 插件

Step 2:引入 crumb 插件

-- -------------------- ---- -------
----- ---- - ----------------------
----- ----- - -----------------------

----- ------ - -------------
    ----- -----
    ----- -----------
---

-- --- ----- --
----- -------- ------ -
    ----- -----------------
        ------- ------
        -------- -
            -------------- -
                --------- -------------------- --- ------------
            -
        -
    ---
    
    ----- ---------------
    ------------------- ------- --- ---------------------
-

-------------------------------- ----- -- -
    -----------------
    ----------------
---

-------

Step 3:在请求里检测 CSRF Token

-- -------------------- ---- -------
-- ---- ---- --
--------------
    ------- -------
    ----- ----
    -------- ----- --------- -- -- -
         ------ ------ --------
    --
    -------- -
        -- --------- ---- -----
        -------- -
            ------ -
                ---- ---------------
                ------- ----------
                -------- ----
            -
        -
    -
---

总结

CSRF 攻击是一种比较隐蔽的攻击方式,为了避免您的应用程序成为攻击者的攻击目标,建议在前端类应用中使用 Hapi.js 的 crumb 插件防范 CSRF 攻击。

在设置插件时,可以修改它的配置来实现针对不同场景的安全防御。也可以使用插件验证请求头、Cookie 或查询字符串等各种请求。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6482f86848841e9894256140

纠错
反馈