Skip to content

TCP 服务器例程 3:加接入校验(安全,强烈建议) ​

这一页只讲这一个例程。同组其余例程、以及这个库的函数说明都在 05-04-tcp-server。

适用:同上 | 依赖模块:tcp_server plc | 难度:★★☆

场景:不希望任意能连上端口的主机都能写寄存器。在 RECVDATA 里先做口令校验,未通过直接踢掉。

完整代码(可直接下载运行):

lua
local PASSWORD = "your-secret"

tcps = tcp_server.creat(8080, 5)
authed = {}
tcps:reg(tcp_server.CONNECTED, function(sock, ip) authed[sock] = false end)
tcps:reg(tcp_server.DISCONNECTED, function(sock) authed[sock] = nil end)
tcps:reg(tcp_server.RECVDATA, function(sock, data)
    if not authed[sock] then
        if data == "AUTH " .. PASSWORD .. "\n" then
            authed[sock] = true
            tcps:send(sock, "OK\n")
        else
            tcps:close(sock)            -- 校验失败直接踢
        end
        return
    end
    -- 已认证才执行命令
    if data:match("^SET_Y1") then plc.y(1, 1) end
end)
tcps:start()

要点:

  • 本模块无任何认证,必须在回调里自行校验来源。
  • 认证之前绝不写寄存器;校验失败的客户端立即 s:close(sock)。

验证方法:

  1. 直接发 SET_Y1 不发口令 → 被踢,Y1 不变。
  2. 先发 AUTH your-secret 再发 SET_Y1 → Y1 置 1。

注意事项:

  • 任何能访问该端口的主机都能连接,公网部署前务必用防火墙或端口映射限制来源。
  • 口令写死在脚本里只是最基础的一层,敏感场景应上更严格的鉴权。

LPPLC 工业物联网云平台 · 软硬件与云平台全栈自研