找不到.jack_您不认识Jack:学习使代码更安全

找不到.jack

本文由Codiscope赞助。 感谢您支持使SitePoint成为可能的赞助商。

我以前玩过一个叫“ 你不知道杰克”的游戏。 这是一个琐事游戏,被设置为游戏节目,输掉它很有趣。 给出错误答案后,玩家将受到游戏主机的机智和无礼的谴责

这也是一个荒谬的教训,即很少的细节意味着正确的事情与可怕的,令人尴尬的错误之间的区别。

最近,有人要求我写有关Jacks的文章 。 我以前从未听说过它,但是这对我立即很有趣。 您会发现,当您了解如何安全地进行编码时,并没有很多声称可以帮助您的服务。 杰克斯想成为那个服务。 几乎像一个教练。 那永远不会睡觉。 而且不花钱。

与琐事游戏不同,它更宽容。 当您真的不知道自己在做什么时,这很棒,就像我决定学习新的Web框架时所发现的那样。

这篇文章的大部分代码都可以在Github上找到。 我已经在macOS Sierra 10.12.1 Node 7.0.0进行了测试。

获得哈皮

我已经编写了许多小的NodeJS应用程序,并且我经常发现Express足以满足我的Web应用程序需求。 但是我也想知道如何最好地构建更大的应用程序。 有一些自以为是的选择,例如Adonis ,但我已经非常熟悉它。 我还能学到什么新东西,同时还能踢Jacks的轮胎?

然后我在Jacks的主页上看到了Hapi的提及。

我打开了终端,创建了一个新的项目文件夹,并安装了Hapi:

yarn add hapi

您也可以使用NPM安装Hapi。 我只是趋势的吸引者, Yarn的速度非常快!

根据文档,制作Hapi应用程序非常简单:

"use strict"

const hapi = require("hapi")

const server = new hapi.Server()

server.connection({
    "port": 3000,
})

server.route({
    "method": "get", "path": "/",
    handler: function (request, reply) {
        reply("hello world")
    },
})

server.start(err => {
    if (err) {
        throw err
    }

    console.log("server at " + server.info.uri)
})

这是来自index.js

如果您使用过Express,您应该看起来有点熟悉。 我用一条路由创建了一个新的HTTP服务器。 当浏览器请求/ ,此路由将回复hello world

你好,世界

插入

下一步是将我的Github帐户连接到Jacks。 创建Jacks帐户相当轻松且免费。 首先,我建立了一个新项目:

创建一个新项目

…然后我将我的Github帐户(和项目存储库)连接到Jacks:

连接至插Kong

从开始到结束,整个过程耗时约2分钟。

犯错误

免费学习PHP!

全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。

原价$ 11.95 您的完全免费

现在是时候看看Jacks可能有多有用了。 我整理了一份常见的Web应用程序安全性错误列表,并决定尝试一些错误,以了解Jacks会说些什么(以及它如何教我做得更好)。

内容安全政策

在这一点上,我并不期望Jacks对我有任何建议。 但是,当我回到界面时,我看到它必须提供给我的第一条建议:

CSP建议

我们花了一些时间寻找一个好的解释,但是我终于在Content Security Policy CSP Reference&Examples中找到了一个。 CSP本质上是一种限制从何处加载HTTP资源的方法。 这非常好,因为可能已经能够注入自定义脚本和/或图像的恶意用户将无法轻松利用这些漏洞。

Jacks还提供了有关如何将Blankie添加到我的服务器脚本的示例代码:

"use strict"

const hapi = require("hapi")
const blankie = require("blankie")
const scooter = require("scooter")

const server = new hapi.Server()

// ...create server + connection + routes

server.register([scooter, {
    "register": blankie,
    "options": {
        // ..CSP directives here
        "defaultSrc": "self",
    }
}], err => {
    // ...start server
})

这是来自index.js

我需要安装Blankie和Scooter ,并使用yarn add blankie blankie和yarn add scooter来使此代码正常工作。 这些为每个请求添加CSP标头:

CSP标头

当然,一旦我将代码提交给项目,Jacks就会注意到它并将建议标记为已解决。

禁用目录列表

一个常见的安全隐患是在Web应用程序中启用(或适当禁用)目录列表。 有一个流行的Hapi插件,称为Inert,可启用静态文件服务和目录列表。 启用这些功能并不罕见,因此我尝试这样做:

"use strict"

const hapi = require("hapi")
const blankie = require("blankie")
const scooter = require("scooter")
const inert = require("inert")

// ...create server + connection

server.register([inert, scooter, {
    "register": blankie,
    "options": {
        // ..CSP directives here
        "defaultSrc": "self",
    }
}], err => {
    // ...create other routes

    server.route({
        "method": "GET", "path": "/{params*}",
        "handler": {
            "directory": {
                "path": "public",
                "listing": true,
            },
        },
    })

    // ...start server
})

这是来自index.js

我需要安装Inert,并yarn add inert以使此代码正常工作。 完成后,我可以在y Web应用程序中查看目录列表:

目录清单

我将此代码提交到存储库,然后跳到Jacks进行分析。 如预期的那样,它警告不要启用目录列表:

目录列表警告

而且,它为我提供了补丁信息,以禁用目录列表:

目录列表补丁

对于像我这样的Hapi初学者来说,这真是太好了。 一旦遵循了此建议,杰克斯便停止警告我有关此特定问题的信息。

不安全的Cookie

我要测试的最后一个安全漏洞是不安全的会话/状态管理。 Hapi文档显示了如何创建cookie来存储会话状态。 他们提到了您可以使用的各种设置,以及它们的默认设置。 他们没有提到的是如何使用错误的设置来破坏会话安全性:

"use strict"

const hapi = require("hapi")
const blankie = require("blankie")
const scooter = require("scooter")
const inert = require("inert")

// ...create server + connection

server.register([inert, scooter, {
    "register": blankie,
    "options": {
        // ..CSP directives here
        "defaultSrc": "self",
    }
}], err => {
    server.state("session", {
        "ttl": 24 * 60 * 60 * 1000,
        "isSecure": false,
        "isHttpOnly": false,
        "path": "/",
        "encoding": "base64json",
    })

    server.route({
        "method": "get", "path": "/",
        handler: function (request, reply) {
            let session = request.state.session

            if (!session) {
                session = {
                    "returning": true
                }
            }

            session.date = Date.now()

            return reply("hello world")
                .state("session", session)
        },
    })

    // ...create other routes
    // ...start server
})

这是来自index.js

在这一点上,我希望Jacks指出有问题的代码行:

"isSecure": false,
"isHttpOnly": false,

这些对我来说似乎不太安全,并且它们也偏离了Hapi的默认值。 我猜想这表明,即使人工代码评估可能会发现看似明显的错误,也很难使算法看到它们。

杰克保护的其他东西

我联系了Jacks开发人员,他们告诉了我Jacks建议的其他许多方面:

  • 使用自适应单向哈希函数存储密码
  • 使用HTTP基本身份验证以外的方法(通过HTTPS)
  • PBKDF2Scrypt使用适当的工作系数
  • 正确使用CSPRNG
  • 启用CORS白名单
  • 避免JSONP Rosetta Flash漏洞

…这些只是针对Hapi的一些建议。 Jacks还可以分析MongoDB和Express代码。 最近,他们还从SpringStruts开始添加了Java支持。

结论

当我了解有关Hapi的更多信息时,我绝对渴望继续使用Jacks。 这只是我编写代码时需要的帮助。 当我陷入困境时,我总是可以使用即时支持消息传递功能来与他们的一名开发人员交谈。 最重要的是,它是免费的。

翻译自: https://www.sitepoint.com/you-dont-know-jacks/

找不到.jack

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值