主题
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)。
验证方法:
- 直接发
SET_Y1不发口令 → 被踢,Y1 不变。 - 先发
AUTH your-secret再发SET_Y1→ Y1 置 1。
注意事项:
- 任何能访问该端口的主机都能连接,公网部署前务必用防火墙或端口映射限制来源。
- 口令写死在脚本里只是最基础的一层,敏感场景应上更严格的鉴权。